@@ -389,70 +389,114 @@ int Uart::_tx_complete_irq(serial_t *obj)
389389
390390void Uart::begin (unsigned long baud, uint16_t config)
391391{
392- uint32_t databits = 0 ;
393- uint32_t stopbits = 0 ;
394- uint32_t parity = 0 ;
395-
396- _baud = baud;
397- _config = config;
392+ #if defined(USE_HALV2_DRIVER)
393+ hal_uart_word_length_t databits = HAL_UART_WORD_LENGTH_8_BIT ;
394+ hal_uart_stop_bits_t stopbits = HAL_UART_STOP_BIT_1 ;
395+ hal_uart_parity_t parity = HAL_UART_PARITY_NONE ;
396+
397+ /* First manage parity which influences the number of data bits */
398+ if ((config & SERIAL_PARITY_MASK ) == SERIAL_PARITY_ODD ) {
399+ parity = HAL_UART_PARITY_ODD ;
400+ } else if ((config & SERIAL_PARITY_MASK ) == SERIAL_PARITY_EVEN ) {
401+ parity = HAL_UART_PARITY_EVEN ;
402+ }
398403
399404 // Manage databits
400405 switch (config & SERIAL_DATA_MASK ) {
406+ #if defined(HAL_UART_WORD_LENGTH_7_BIT)
401407 case SERIAL_DATA_6 :
402- databits = 6 ;
408+ // Only 6 bits with parity supported
409+ if (parity != HAL_UART_PARITY_NONE ) {
410+ databits = HAL_UART_WORD_LENGTH_7_BIT ;
411+ } else {
412+ Error_Handler ();
413+ }
403414 break ;
415+ #endif /* HAL_UART_WORD_LENGTH_7_BIT */
404416 case SERIAL_DATA_7 :
405- databits = 7 ;
417+ // 7 bits with or without parity
418+ if (parity != HAL_UART_PARITY_NONE ) {
419+ databits = HAL_UART_WORD_LENGTH_8_BIT ;
420+ } else {
421+ #ifdef HAL_UART_WORD_LENGTH_7_BIT
422+ databits = HAL_UART_WORD_LENGTH_7_BIT ;
423+ #else
424+ Error_Handler ();
425+ #endif
426+ }
406427 break ;
407428 case SERIAL_DATA_8 :
408- databits = 8 ;
429+ // 8 bits with or without parity
430+ if (parity != HAL_UART_PARITY_NONE ) {
431+ databits = HAL_UART_WORD_LENGTH_9_BIT ;
432+ } else {
433+ databits = HAL_UART_WORD_LENGTH_8_BIT ;
434+ }
409435 break ;
410436 default :
411- databits = 0 ;
437+ Error_Handler () ;
412438 break ;
413439 }
414440
415- switch (config & SERIAL_PARITY_MASK ) {
416- case SERIAL_PARITY_ODD :
417- parity = UART_PARITY_ODD ;
418- databits++; // word length = data bits + parity
419- break ;
420- case SERIAL_PARITY_EVEN :
421- parity = UART_PARITY_EVEN ;
422- databits++;
423- break ;
424- default :
425- parity = UART_PARITY_NONE ;
426- break ;
441+ if ((config & SERIAL_STOP_BIT_MASK ) == SERIAL_STOP_BIT_2 ) {
442+ stopbits = HAL_UART_STOP_BIT_2 ;
427443 }
428-
429- switch (config & SERIAL_STOP_BIT_MASK ) {
430- case SERIAL_STOP_BIT_2 :
431- stopbits = UART_STOPBITS_2 ;
432- break ;
433- default :
434- stopbits = UART_STOPBITS_1 ;
435- break ;
444+ #else
445+ uint32_t databits = UART_WORDLENGTH_8B ;
446+ uint32_t stopbits = UART_STOPBITS_1 ;
447+ uint32_t parity = UART_PARITY_NONE ;
448+
449+ /* First manage parity which influences the number of data bits */
450+ if ((config & SERIAL_PARITY_MASK ) == SERIAL_PARITY_ODD ) {
451+ parity = UART_PARITY_ODD ;
452+ } else if ((config & SERIAL_PARITY_MASK ) == SERIAL_PARITY_EVEN ) {
453+ parity = UART_PARITY_EVEN ;
436454 }
437455
438- switch (databits) {
439- #ifdef UART_WORDLENGTH_7B
440- case 7 :
441- databits = UART_WORDLENGTH_7B ;
456+ // Manage databits
457+ switch (config & SERIAL_DATA_MASK ) {
458+ #if defined(UART_WORDLENGTH_7B)
459+ case SERIAL_DATA_6 :
460+ // Only 6 bits with parity supported
461+ if (parity != UART_PARITY_NONE ) {
462+ databits = UART_WORDLENGTH_7B ;
463+ } else {
464+ Error_Handler ();
465+ }
442466 break ;
467+ #endif /* UART_WORDLENGTH_7B */
468+ case SERIAL_DATA_7 :
469+ // 7 bits with or without parity
470+ if (parity != UART_PARITY_NONE ) {
471+ databits = UART_WORDLENGTH_8B ;
472+ } else {
473+ #ifdef UART_WORDLENGTH_7B
474+ databits = UART_WORDLENGTH_7B ;
475+ #else
476+ Error_Handler ();
443477#endif
444- case 8 :
445- databits = UART_WORDLENGTH_8B ;
478+ }
446479 break ;
447- case 9 :
448- databits = UART_WORDLENGTH_9B ;
480+ case SERIAL_DATA_8 :
481+ // 8 bits with or without parity
482+ if (parity != UART_PARITY_NONE ) {
483+ databits = UART_WORDLENGTH_9B ;
484+ } else {
485+ databits = UART_WORDLENGTH_8B ;
486+ }
449487 break ;
450488 default :
451- case 0 :
452489 Error_Handler ();
453490 break ;
454491 }
455492
493+ if ((config & SERIAL_STOP_BIT_MASK ) == SERIAL_STOP_BIT_2 ) {
494+ stopbits = UART_STOPBITS_2 ;
495+ }
496+ #endif /* USE_HALV2_DRIVER */
497+ _baud = baud;
498+ _config = config;
499+
456500 _ready = uart_init (&_serial, (uint32_t )baud, databits, parity, stopbits, _rx_invert, _tx_invert, _data_invert);
457501 if (_ready) {
458502 enableHalfDuplexRx ();
0 commit comments