HAL库调试usart串口遇到的几个坑

最近做项目,首次使用HAL库,调试串口总遇到卡死问题,卡死原因五花八门,待我娓娓道来。
第一个坑:
现象描述:串口开启后,一开始可以收发数据,运行一段时间后,收不到数据,经测试无法进去中断,且卡死时间很随机
**问题查找:**查了不少资料,看了一下卡死后的串口寄存器,发现ORE溢出标志位未清除,RX寄存器里面还有数据未读出。然后又查了usart中断处理的代码,果然入网友所说,usart发送和接收互锁,导致的溢出,也就是说全双工通信被ST的250工程师写成了半双工,接收发送不能同时进行。
解决方案:
1.增加串口卡死检测程序,在进行通信时,在串口中断里面写一个标志位,每次进中断标志位置1,在主循环,把标志位置零,如果发现通信期间标志位长时间等于0,则串口卡死,接收不到数据。此时重新配置串口,即可收到数
2.更换HAL库,我是用的是16年的库,最新的库不存在这个问题,把库更新问题就可以彻底解决。

第二个坑:
现象描述:库更新后,开始的时候我用串口助手不断给单片机数据,同时单片机不断往外发数据,测了一下午,没遇到卡死现象,后来进行网络通信,第一帧数据比较大,大概600字节左右,又遇到串口卡死,发完数据后接收不到数据,串口卡死,查寄存器,ORE未清零,串口中还有数据未读出,想着刚换了库,应该不是库的问题。
解决方案
1.多方查找,最终在修改了数据发送超时时间后,串口在没再卡死,原因应该是数据量大,但超时时间设置的太小导致的。

第三个坑
**现象描述:**当时我开了两路串口,调试的时候,我发现另外一个串口悬空没有数据收发,依然每次会接收到随机数据,我在中断里打了断点,发现隔一段时间就会进中断,太神奇了有木有,大白天的也不会出鬼吧。
解决方案:
1.串口初始化时,管脚上拉,不要浮空,不然会出鬼。
HAL库调试usart串口遇到的几个坑_第1张图片

你可能感兴趣的:(stm32HAL库)