@@ -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- * @param pclk : supplied clock rate to related uart
1427+ * @param huart : 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{
14381433 static 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
14401436 uint32_t condition = 0 ;
1441- if (oversampling == UART_OVERSAMPLING_16 ) {
1437+ if (huart -> Init . OverSampling == UART_OVERSAMPLING_16 ) {
14421438 condition = 16U ;
14431439 } else {
14441440 condition = 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 ];
14491445 uint32_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
14561452 if (brr >= condition && brr <= 0xFFFU ) {
@@ -1459,14 +1455,13 @@ uint32_t calculatePresc(uint32_t pclk, uint32_t baudrate, uint32_t oversampling)
14591455 }
14601456 return 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 )
14721467 if (huart -> Instance == LPUART1 ) {
@@ -1582,6 +1577,7 @@ uint32_t uart_getPCLK(UART_HandleTypeDef *huart)
15821577
15831578 return 0 ;
15841579}
1580+ #endif /* UART_PRESCALER_DIV1 */
15851581
15861582#endif /* HAL_UART_MODULE_ENABLED && !HAL_UART_MODULE_ONLY */
15871583
0 commit comments