查看: 1504|回复: 0

[技术交流] STM32L4 LPUART1经验分享

[复制链接]

74

主题

169

帖子

573

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
573
发表于 2019-7-11 14:27:52 | 显示全部楼层 |阅读模式
1 现象发现

在使用LoRaWAN开发板调试程序时,发现一个现象,LPUART的波特率设置为2400bps时,初始化异常,出现程序进入死循环的现象:

                             ​

同样的,其他条件均不改变,若将波特率修改为<2400的值,则会出现初始化异常;但波特率>2400,则初始化正常,程序可正常运行。

从上述现象可初步得出:波特率值的大小是出现该异常的原因。


2 原因分析

翻阅《STM32L4 Reference mannual》中LPUART1的资料, 在"LPUART baud rate generation
"章节,有以下关键描述:

                             ​

从文章中可获知:

Tx/Rx baud = 256*fck/LPUARTDIV

其中fck为时钟源频率,程序中LPUART1的时钟源为HSI:16MHz,并且fck需满足[3*baud rate, 4096*baud rate];

LPUARTDIV的数值范围查看LPUART_BRR 寄存器:

                             ​

从描述可获知:LPUARTDIV的范围是[0x300, 2^20-1]。


3 问题解决

3.1 公式反推

整理上述资料,分析得知:3*baud rate < fck < 4096*baud,fck固定为:16MHz,按照这个范围计算范围,反推看是否成立:

假设baud rate = 2400bps,那么3*baud rate = 7200,4096*baud rate = 9830400 < 16000000

可见 fck > 4096*baud rate,不符合要求;

假设baud rate = 4800bps,那么3*baud rate = 14400,4096*baud rate = 19660800 > 16000000;

可见fck < 4096*baud rate,符合要求。

可得出结论,若LPUART的时钟源固定为HSI = 16MHz,那么当波特率 <= 2400时无法满足要求,需更换时钟源。

                             ​

串口4个时钟源

可看出,若baud rate <= 2400,时钟源更换为LSE = 32.768kHz最为合适。

3.2 STM32 CubeMX图形化分析
  3.2.1 HSI时钟源分析
  • 使能LPUART1

                             ​

stm32 cubeMX引脚配置界面

  • LPUART1时钟选择HSI

                             ​

stm32 cubeMX时钟配置界面

  • 波特率参数配置
  • 双击图中心LPUART按钮
  • 选中Baud Rate,下方会自动弹出波特率范围,可看出baud rate > 2400bps

                             ​

stm32 cubeMX参数配置界面

                             ​

stm32 cubeMX波特率参数配置界面

  • 总结
      从stm32cube mx配置中看出,若时钟源为HSI,则baud rate范围:[3.907k, 5.33M],2400bps无法满足。
3.2.2 LSE时钟源分析
  • 使能LPUART1和LSE

                             ​

stm32 cubeMX引脚配置界面

  • LPUART1时钟选择LSE

                             ​

stm32 cubeMX时钟配置界面

  • 波特率参数配置
  • 双击图中心LPUART按钮
  • 选中Baud Rate,下方会自动弹出波特率范围,可看出baud rate > 2400bps

                             ​

stm32 cubeMX参数配置界



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表