STM32F411CEU6 USART2波特率异常问题求助
STM32F411CEU6 USART2波特率异常问题排查与解决
问题场景
- 原STM32F401CCU6平台上,通过CubeMX配置的USART2中断接收功能运行正常
- 移植代码到STM32F411CEU6(系统时钟设为100MHz)后,LCD、SPI驱动的74HC595等外设工作正常,但USART2接收乱码,疑似波特率错误
- 实测TX引脚位时间约12.5μs,对应波特率约80000,仅为预期115200的70%
- 手动将
huart2.Init.BaudRate改为164505(115200×1.428571)后,实测波特率恢复为115200,功能恢复正常
核心原因分析
- APB1时钟配置违规:STM32F411的APB1总线最大允许时钟为45MHz,而当前配置的APB1时钟为50MHz,超出芯片规格上限。CubeMX未严格拦截该违规配置,导致USART的时钟源异常。
- 波特率计算偏差:USART波特率计算公式为:
当APB1为50MHz、过采样16倍时,按115200计算得到的USARTDIV≈27.1267,寄存器无法精确匹配该值,导致实际波特率大幅偏离。手动修改波特率为164505时,USARTDIV≈50000000/(164505×16)≈1.907,近似为2,刚好得到正确的输出波特率,但这属于治标不治本的临时解决方案。USARTDIV = APB1_CLK / (波特率 × 过采样倍数) - 勘误排除:查阅STM32F411官方勘误文档,未发现针对USART波特率计算的相关硬件问题,问题根源仍在时钟配置。
正确解决方案
- 修正时钟树配置:
- 打开CubeMX进入时钟配置界面,将APB1预分频器调整为
DIV4(系统时钟100MHz时,APB1时钟为25MHz);或调整系统时钟为90MHz,此时APB1预分频设为DIV2可得到合规的45MHz时钟 - 确保APB1最终时钟≤45MHz,符合F411的芯片规格
- 打开CubeMX进入时钟配置界面,将APB1预分频器调整为
- 重新生成代码:将USART2的波特率恢复为115200,重新生成工程代码,此时USART2可正常工作
- 验证时钟配置:通过读取
RCC->CFGR寄存器的PPRE1位(位10-12),确认APB1预分频设置正确,避免违规配置
注意事项
- STM32F4系列不同子型号的总线时钟上限存在差异,移植代码前务必核对目标芯片的数据手册,确认总线时钟、外设时钟的规格限制
- CubeMX的时钟配置可能存在允许超出芯片规格的情况,需手动校验配置的合法性
内容的提问来源于stack exchange,提问作者STEPHEN G CURTIS
相关产品推荐
相关产品推荐

