本帖最后由 damiaa 于 2024-8-8 17:15 编辑
【NUCLEO H533RE】之六 串口overrun错误问题解决
偶然之中发现一个stm32的通用问题,就是串口接收错误死机(其实不是死机,是串口不能工作了)。
后来用其他stm32单片机,如stm32f系列也是有这个问题,特别是电路搭建的比较乱,波特率比较高就容易出现。
H533RE的nucleo板是很不容易发现的。
手上有个搭建的stm32f051板子就这样:
工作在9600 19200 38400 57600都没问题,工作在115200就有问题。
下图是出错的数据,接收到数据会点亮或者熄灭led。
因为搭建的电路干扰大,加上使用的内置时钟。
但无论什么问题。串口不能死机。
对stm32作一番分析后,发现stm32cubied产生的代码默认的错误溢出是允许中断,而且错误中断需要用户自己写回调函数解决。
这样解决方案采取如下:
1,不用的DMA接收错误是必须关闭。
2,使用的Overrun要么关闭,要么采用函数处理。
使用的处理函数放在main.c中处理回调函数的地方:
3,尽量把电路搞规整点,适当条件下时候外部晶体。
4,不是要求高的时候莫把波特率调得老高。
实验补充:
后来用stm32cubeide生成的stm32f030程序在stm32f0308-disco开发板跑。竟然只能跑38400少量数据不出错,多了还出错。
也不知道是我的连接线有问题还是什么情况。这个开发板没焊接外部晶振。
看来低端的stm32f系列芯片程序还是用标准库 LL库好,用HAL库肯定不是最佳选择。毕竟代码绕来绕去用去时间。效率自然地下。搞得收串口数据都忙不过来了。
当然H533RE是要用HAL库的,不然浪费了。