@@ -416,12 +416,7 @@ bool uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
416416
417417/* Configure UART Clock Prescaler */
418418#if defined(UART_PRESCALER_DIV1 )
419- // Default Value
420- uint32_t clock_prescaler = UART_PRESCALER_DIV1 ;
421-
422- uint32_t pclk = uart_getPCLK (huart );
423- clock_prescaler = calculatePresc (pclk ,baudrate ,huart -> Init .OverSampling );
424- huart -> Init .ClockPrescaler = clock_prescaler ;
419+ huart -> Init .ClockPrescaler = uart_compute_prescaler (huart );
425420#endif
426421
427422#if defined(UART_ADVFEATURE_NO_INIT )
@@ -1429,28 +1424,29 @@ void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart)
14291424
14301425/**
14311426 * @brief Function called to set the uart clock prescaler
1432- * @parampclk :supplied clock rate to related uart
1427+ * @paramhuart :uart handle structure
14331428 * @retval uint32_t clock prescaler
14341429 */
14351430#if defined(UART_PRESCALER_DIV1 )
1436- uint32_t calculatePresc ( uint32_t pclk , uint32_t baudrate , uint32_t oversampling )
1431+ uint32_t uart_compute_prescaler ( UART_HandleTypeDef * huart )
14371432{
14381433static const uint16_t presc_div [12 ]= {1 ,2 ,4 ,6 ,8 ,10 ,12 ,16 ,32 ,64 ,128 ,256 };
1434+ uint32_t freq = uart_get_clock_source_freq (huart );
14391435
14401436uint32_t condition = 0 ;
1441- if (oversampling == UART_OVERSAMPLING_16 ) {
1437+ if (huart -> Init . OverSampling == UART_OVERSAMPLING_16 ) {
14421438condition = 16U ;
14431439 }else {
14441440condition = 8U ;
14451441 }
14461442
1447- for (uint32_t idx = 0 ;idx < 8 ;idx ++ ) {
1448- uint32_t uartclk = pclk /presc_div [idx ];
1443+ for (uint32_t idx = 0 ;idx < 12 ;idx ++ ) {
1444+ uint32_t uartclk = freq /presc_div [idx ];
14491445uint32_t brr = 0 ;
1450- if (oversampling == UART_OVERSAMPLING_16 ) {
1451- brr = (uartclk + (baudrate /2U )) /baudrate ;
1446+ if (huart -> Init . OverSampling == UART_OVERSAMPLING_16 ) {
1447+ brr = (uartclk + (huart -> Init . BaudRate /2U )) /huart -> Init . BaudRate ;
14521448 }else {
1453- brr = ((2U * uartclk )+ (baudrate /2U )) /baudrate ;
1449+ brr = ((2U * uartclk )+ (huart -> Init . BaudRate /2U )) /huart -> Init . BaudRate ;
14541450 }
14551451
14561452if (brr >=condition && brr <=0xFFFU ) {
@@ -1459,14 +1455,13 @@ uint32_t calculatePresc(uint32_t pclk, uint32_t baudrate, uint32_t oversampling)
14591455 }
14601456return UART_PRESCALER_DIV1 ;
14611457}
1462- #endif
14631458
14641459/**
14651460 * @brief Function called to get the clock source frequency of the uart
14661461 * @param huart : uart handle structure
14671462 * @retval uint32_t clock source frequency
14681463 */
1469- uint32_t uart_getPCLK (UART_HandleTypeDef * huart )
1464+ uint32_t uart_get_clock_source_freq (UART_HandleTypeDef * huart )
14701465{
14711466#if defined(LPUART1 )
14721467if (huart -> Instance == LPUART1 ) {
@@ -1582,6 +1577,7 @@ uint32_t uart_getPCLK(UART_HandleTypeDef *huart)
15821577
15831578return 0 ;
15841579}
1580+ #endif /* UART_PRESCALER_DIV1 */
15851581
15861582#endif /* HAL_UART_MODULE_ENABLED && !HAL_UART_MODULE_ONLY */
15871583