@@ -1439,26 +1439,32 @@ uint32_t uart_compute_prescaler(UART_HandleTypeDef *huart)
1439
1439
uint32_t prescaler = UART_PRESCALER_DIV1 ;
1440
1440
static const uint16_t presc_div [12 ] = {1 , 2 , 4 , 6 , 8 , 10 , 12 , 16 , 32 , 64 , 128 , 256 };
1441
1441
uint32_t freq = uart_get_clock_source_freq (huart );
1442
-
1443
- uint32_t condition = 0 ;
1444
- if (huart -> Init .OverSampling == UART_OVERSAMPLING_16 ) {
1445
- condition = 16U ;
1446
- } else {
1447
- condition = 8U ;
1448
- }
1449
-
1450
- for (uint32_t idx = 0 ; idx < 12 ; idx ++ ) {
1451
- uint32_t uartclk = freq / presc_div [idx ];
1452
- uint32_t brr = 0 ;
1453
- if (huart -> Init .OverSampling == UART_OVERSAMPLING_16 ) {
1454
- brr = (uartclk + (huart -> Init .BaudRate / 2U )) / huart -> Init .BaudRate ;
1455
- } else {
1456
- brr = ((2U * uartclk ) + (huart -> Init .BaudRate / 2U )) / huart -> Init .BaudRate ;
1442
+ uint32_t usartdiv = 0 ;
1443
+
1444
+ #if defined(UART_INSTANCE_LOWPOWER )
1445
+ if (UART_INSTANCE_LOWPOWER (huart )) {
1446
+ for (uint32_t idx = 0 ; idx < 12 ; idx ++ ) {
1447
+ /* Check computed UsartDiv value is in allocated range
1448
+ (it is forbidden to write values lower than 0x300 in the LPUART_BRR register) */
1449
+ usartdiv = (uint32_t )(UART_DIV_LPUART (freq , huart -> Init .BaudRate , presc_div [idx ]));
1450
+ if ((usartdiv >= 0x00000300U ) && (usartdiv <= 0x000FFFFFU )) {
1451
+ prescaler = UART_PRESCALER_DIV1 + idx ;
1452
+ break ;
1453
+ }
1457
1454
}
1458
-
1459
- if (brr >= condition && brr <= 0xFFFU ) {
1460
- prescaler = UART_PRESCALER_DIV1 + idx ;
1461
- break ;
1455
+ } else
1456
+ #endif /* UART_INSTANCE_LOWPOWER */
1457
+ {
1458
+ for (uint32_t idx = 0 ; idx < 12 ; idx ++ ) {
1459
+ if (huart -> Init .OverSampling == UART_OVERSAMPLING_8 ) {
1460
+ usartdiv = (uint32_t )(UART_DIV_SAMPLING8 (freq , huart -> Init .BaudRate , presc_div [idx ]));
1461
+ } else {
1462
+ usartdiv = (uint32_t )(UART_DIV_SAMPLING16 (freq , huart -> Init .BaudRate , presc_div [idx ]));
1463
+ }
1464
+ if ((usartdiv >= 0x10U ) && (usartdiv <= 0x0000FFFFU )) {
1465
+ prescaler = UART_PRESCALER_DIV1 + idx ;
1466
+ break ;
1467
+ }
1462
1468
}
1463
1469
}
1464
1470
return prescaler ;
@@ -1471,119 +1477,91 @@ uint32_t uart_compute_prescaler(UART_HandleTypeDef *huart)
1471
1477
*/
1472
1478
uint32_t uart_get_clock_source_freq (UART_HandleTypeDef * huart )
1473
1479
{
1474
- #if defined(LPUART1 )
1475
- if (huart -> Instance == LPUART1 ) {
1476
- #if defined(STM32H5 ) || defined(STM32U3 ) || defined(STM32U5 )
1477
- return HAL_RCC_GetPCLK3Freq ();
1478
- #elif defined(STM32H7 )
1479
- uint32_t sysclk = HAL_RCC_GetSysClockFreq ();
1480
- #if defined(STM32H7A3xx ) || defined (STM32H7A3xxQ ) || defined(STM32H7B3xx ) || defined(STM32H7B3xxQ ) || defined(STM32H7B0xx ) || defined(STM32H7B0xxQ )
1481
- uint32_t prescaler = (RCC -> SRDCFGR & RCC_SRDCFGR_SRDPPRE ) >> RCC_SRDCFGR_SRDPPRE_Pos ;
1482
- #else
1483
- uint32_t prescaler = (RCC -> D3CFGR & RCC_D3CFGR_D3PPRE ) >> RCC_D3CFGR_D3PPRE_Pos ;
1484
- #endif
1485
-
1486
- uint32_t apb4 = 1 ;
1487
-
1488
- switch (prescaler ) {
1489
- case 0b000 : prescaler = 1 ; break ;
1490
- case 0b100 : prescaler = 2 ; break ;
1491
- case 0b101 : prescaler = 4 ; break ;
1492
- case 0b110 : prescaler = 8 ; break ;
1493
- case 0b111 : prescaler = 16 ; break ;
1494
- default : break ;
1495
- }
1496
-
1497
- return (sysclk / prescaler );
1498
- #elif defined(STM32G4 ) || defined(STM32L4 ) || defined(STM32L5 ) || defined(STM32WB )
1499
- return HAL_RCC_GetPCLK1Freq ();
1500
- #elif defined(STM32WL )
1501
- return HAL_RCC_GetPCLK2Freq ();
1502
- #elif defined(STM32WBA )
1503
- return HAL_RCC_GetPCLK7Freq ();
1504
- #endif
1505
- }
1506
- #endif
1507
-
1508
- #if defined(LPUART2 )
1509
- if (huart -> Instance == LPUART2 ) {
1510
- return HAL_RCC_GetPCLK1Freq ();
1511
- }
1512
- #endif
1513
-
1514
- #if defined(LPUART3 )
1515
- if (huart -> Instance == LPUART3 ) {
1516
- return HAL_RCC_GetPCLK1Freq ();
1517
- }
1518
- #endif
1519
-
1520
- #if defined(STM32F0 ) || defined(STM32G0 ) || defined(STM32L0 ) || defined(STM32C0 ) \
1521
- || defined(STM32WB )
1522
- return HAL_RCC_GetPCLK1Freq ();
1523
- #endif
1524
-
1480
+ uint32_t freq = 0 ;
1525
1481
#if defined(STM32WB0 )
1526
- uint32_t sysclk = HAL_RCC_GetSysClockFreq ();
1527
- uint32_t ppre2 = (RCC -> CFGR & RCC_CFGR_CLKSYSDIV ) >> RCC_CFGR_CLKSYSDIV_Pos ;
1528
- uint32_t apb2_div = 1 ;
1529
-
1530
- switch (ppre2 ) {
1531
- case 0b000 : apb2_div = 1 ; break ;
1532
- case 0b100 : apb2_div = 2 ; break ;
1533
- case 0b101 : apb2_div = 4 ; break ;
1534
- case 0b110 : apb2_div = 8 ; break ;
1535
- case 0b111 : apb2_div = 16 ; break ;
1536
- default : break ;
1537
- }
1538
- return (sysclk / apb2_div );
1539
- #endif
1540
-
1541
- #if defined(STM32WL )
1542
- return HAL_RCC_GetPCLK2Freq ();
1543
- #endif
1544
-
1545
- #if defined(STM32H7 )
1546
- if (huart -> Instance == USART1
1547
- #if defined(USART10 )
1548
- || huart -> Instance == USART10
1549
- #endif
1550
- #if defined(USART6 )
1551
- || huart -> Instance == USART6
1552
- #endif
1553
- #if defined(UART9 )
1554
- || huart -> Instance == UART9
1555
- #endif
1556
- ) {
1557
- return HAL_RCC_GetPCLK2Freq ();
1558
- }
1559
- return HAL_RCC_GetPCLK1Freq ();
1560
- #endif
1561
-
1562
- #if defined(STM32MP1 )
1563
- if (huart -> Instance == USART1 ) {
1564
- return HAL_RCC_GetPCLK5Freq ();
1565
- } else if (huart -> Instance == USART6 ) {
1566
- return HAL_RCC_GetPCLK2Freq ();
1567
- } else {
1568
- return HAL_RCC_GetPCLK1Freq ();
1569
- }
1570
- #endif
1571
-
1572
- #if defined(STM32F7 ) || defined(STM32F2 ) || defined(STM32F4 ) || defined(STM32F1 ) \
1573
- || defined(STM32U3 ) || defined(STM32F3 ) || defined(STM32H5 ) || defined(STM32G4 ) \
1574
- || defined(STM32L4 ) || defined(STM32L5 ) || defined(STM32WBA ) || defined(STM32U5 ) \
1575
- || defined(STM32L1 )
1576
- if (huart -> Instance == USART1
1577
- #if defined(USART6 ) && !defined(STM32H5 ) && !defined(STM32U5 )
1578
- || huart -> Instance == USART6
1482
+ freq = UART_PERIPHCLK ;
1483
+ if (UART_INSTANCE_LOWPOWER (huart )) {
1484
+ #if defined(RCC_CFGR_LPUCLKSEL )
1485
+ freq = HAL_RCCEx_GetPeriphCLKFreq (RCC_PERIPHCLK_LPUART1 );
1486
+ #endif /* RCC_CFGR_LPUCLKSEL */
1487
+ }
1488
+ #else /* !STM32WB0 */
1489
+ uint32_t clocksource ;
1490
+ UART_GETCLOCKSOURCE (huart , clocksource );
1491
+ #if defined(STM32H5 ) || defined(STM32MP1 ) || defined(STM32U0 ) || \
1492
+ defined(STM32U3 ) || defined(STM32U5 )
1493
+ freq = HAL_RCCEx_GetPeriphCLKFreq (clocksource );
1494
+ #else
1495
+ switch (clocksource ) {
1496
+ #if defined(UART_CLOCKSOURCE_D2PCLK1 ) || defined(UART_CLOCKSOURCE_PCLK1 )
1497
+ #if defined(UART_CLOCKSOURCE_D2PCLK1 )
1498
+ case UART_CLOCKSOURCE_D2PCLK1 :
1499
+ #endif /* UART_CLOCKSOURCE_D2PCLK1*/
1500
+ #if defined(UART_CLOCKSOURCE_PCLK1 )
1501
+ case UART_CLOCKSOURCE_PCLK1 :
1502
+ #endif /* UART_CLOCKSOURCE_PCLK1 */
1503
+ freq = HAL_RCC_GetPCLK1Freq ();
1504
+ break ;
1505
+ #endif /* UART_CLOCKSOURCE_D2PCLK1 || UART_CLOCKSOURCE_PCLK1*/
1506
+ #if defined(UART_CLOCKSOURCE_D2PCLK2 ) || defined(UART_CLOCKSOURCE_PCLK2 )
1507
+ #if defined(UART_CLOCKSOURCE_D2PCLK2 )
1508
+ case UART_CLOCKSOURCE_D2PCLK2 :
1509
+ #endif /* UART_CLOCKSOURCE_D2PCLK2*/
1510
+ #if defined(UART_CLOCKSOURCE_PCLK2 )
1511
+ case UART_CLOCKSOURCE_PCLK2 :
1512
+ #endif /* UART_CLOCKSOURCE_PCLK2 */
1513
+ freq = HAL_RCC_GetPCLK2Freq ();
1514
+ break ;
1515
+ #endif /* UART_CLOCKSOURCE_D2PCLK2 || UART_CLOCKSOURCE_PCLK2*/
1516
+ #if defined(UART_CLOCKSOURCE_PCLK7 )
1517
+ case UART_CLOCKSOURCE_PCLK7 :
1518
+ freq = HAL_RCC_GetPCLK7Freq ();
1519
+ break ;
1520
+ #endif /* UART_CLOCKSOURCE_PCLK7 */
1521
+ #if defined(UART_CLOCKSOURCE_PLL2 )
1522
+ case UART_CLOCKSOURCE_PLL2 :
1523
+ HAL_RCCEx_GetPLL2ClockFreq (& pll2_clocks );
1524
+ freq = pll2_clocks .PLL2_Q_Frequency ;
1525
+ break ;
1526
+ case UART_CLOCKSOURCE_PLL3 :
1527
+ HAL_RCCEx_GetPLL3ClockFreq (& pll3_clocks );
1528
+ freq = pll3_clocks .PLL3_Q_Frequency ;
1529
+ break ;
1530
+ #endif /* UART_CLOCKSOURCE_PLL2 */
1531
+ case UART_CLOCKSOURCE_HSI :
1532
+ #if defined(__HAL_RCC_GET_HSIKER_DIVIDER )
1533
+ freq = (HSI_VALUE / ((__HAL_RCC_GET_HSIKER_DIVIDER () >> RCC_CR_HSIKERDIV_Pos ) + 1U ));
1534
+ #else
1535
+ #if defined(RCC_FLAG_HSIDIV )
1536
+ if (__HAL_RCC_GET_FLAG (RCC_FLAG_HSIDIV ) != 0U ) {
1537
+ freq = (uint32_t )(HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER () >> 3U ));
1538
+ } else
1539
+ #endif /* RCC_FLAG_HSIDIV */
1540
+ {
1541
+ freq = (uint32_t ) HSI_VALUE ;
1542
+ }
1579
1543
#endif
1580
- ) {
1581
- return HAL_RCC_GetPCLK2Freq ();
1544
+ break ;
1545
+ #if defined(UART_CLOCKSOURCE_CSI )
1546
+ case UART_CLOCKSOURCE_CSI :
1547
+ freq = (uint32_t ) CSI_VALUE ;
1548
+ break ;
1549
+ #endif /* UART_CLOCKSOURCE_CSI */
1550
+ #if defined(UART_CLOCKSOURCE_SYSCLK )
1551
+ case UART_CLOCKSOURCE_SYSCLK :
1552
+ freq = HAL_RCC_GetSysClockFreq ();
1553
+ break ;
1554
+ #endif /* UART_CLOCKSOURCE_SYSCLK */
1555
+ case UART_CLOCKSOURCE_LSE :
1556
+ freq = (uint32_t ) LSE_VALUE ;
1557
+ break ;
1558
+ default :
1559
+ freq = 0U ;
1560
+ break ;
1582
1561
}
1583
- return HAL_RCC_GetPCLK1Freq ();
1584
- #endif
1585
-
1586
- return 0 ;
1562
+ #endif /* STM32H5 */
1563
+ #endif /* STM32WB0 */
1564
+ return freq ;
1587
1565
}
1588
1566
#endif /* UART_PRESCALER_DIV1 */
1589
1567
0 commit comments