开源改变世界

STM32F407VGT6 上串口的波特率生成错误 #77

推推 grbl 3年前 (2023-02-08) 177次浏览
关闭
ho-ho-ho 打开了这个issue 2022 年 6 月 14 日 · 1条评论
关闭

STM32F407VGT6 上串口的波特率生成错误#77

ho-ho-ho 打开了这个issue 2022 年 6 月 14 日 · 1条评论

评论

STM32F407VGT6 上串口的波特率生成错误 #77
哈哈哈 评论了 2022 年 6 月 14 日  

我正在使用板载 STM32F407VGT6 控制器的 STM32F4 Discovery,当我尝试连接 USART3 上的设备(PD8/9,由 SERIAL_MOD = 3 选择)时,我只收到损坏的数据。所以在深入挖掘之后我注意到

STM32F4xx/Src/serial.c

第 216 至 229 行 c5b8e6a

static bool serialSetBaudRate ( uint32_t波特率)
{
#如果SERIAL_MOD == 2
USART-> CR1 = USART_CR1_RE|USART_CR1_TE;
USART-> BRR = UART_BRR_SAMPLING16 ( HAL_RCC_GetPCLK1Freq (), baud_rate);
USART-> CR1 |= (USART_CR1_UE|USART_CR1_RXNEIE);
#否则
USART-> CR1 = USART_CR1_RE|USART_CR1_TE;
USART-> BRR = UART_BRR_SAMPLING16 ( HAL_RCC_GetPCLK2Freq (), baud_rate);
USART-> CR1 |= (USART_CR1_UE|USART_CR1_RXNEIE);
#结尾
返回
}

使用了错误的时钟域。更改为正确的后,我得到了正确的数据:) 

来自 STM32F405/415、STM32F407/417、STM32F427/437 和 STM32F429/439 的 RM:

只有 USART1 和 USART6 使用 PCLK2 提供时钟。其他 USART 使用 PCLK1 计时

到目前为止,我的解决方案是一个很大的 #if 混乱,但我不确定这是否是目前最好的解决方案:

static bool serialSetBaudRate (uint32_t baud_rate)
{
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || defined(STM32F427xx) || defined(STM32F429xx) || defined(STM32F437xx) || defined(STM32F439xx)
#if SERIAL_MOD == 3
    USART->CR1 = USART_CR1_RE|USART_CR1_TE;
    USART->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK1Freq(), baud_rate);
    USART->CR1 |= (USART_CR1_UE|USART_CR1_RXNEIE);
#else
    USART->CR1 = USART_CR1_RE|USART_CR1_TE;
    USART->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK2Freq(), baud_rate);
    USART->CR1 |= (USART_CR1_UE|USART_CR1_RXNEIE);
#endif
#else
#if SERIAL_MOD == 2
    USART->CR1 = USART_CR1_RE|USART_CR1_TE;
    USART->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK1Freq(), baud_rate);
    USART->CR1 |= (USART_CR1_UE|USART_CR1_RXNEIE);
#else
    USART->CR1 = USART_CR1_RE|USART_CR1_TE;
    USART->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK2Freq(), baud_rate);
    USART->CR1 |= (USART_CR1_UE|USART_CR1_RXNEIE);
#endif
#endif

    return true;
}