STM32串口通信ORE(overrun error)导致死机
现象就是:我要接收到16个字节到数据后就开始处理数据,但是主机发过来的指令超过了16个字节,就导致我这里死机了,其实我这里不应该死机的,因为波特率才9600,一个字节的时间来处理中断代码完全够用。
怎么掉进坑的呢:因为我在接收中断处理函数里加了发送字符的函数putchar,也就是当我接收到16个字节时,我就在中断函数里给主机回复“ok”这两个字符。这就完蛋了,如果主机发了16个字节不发了,那没问题,如果发了16个字节还在发,就overrun了。悲催。
原来用的是STM32的单片机,HAL库,估计HAL库会出现overrun,但是不会死机,因为在HAL库的串口中断函数里我看有清ORE的功能。但是后来STM32涨价,就换了GD32,用的GD32标准库,然后就进坑了。
下面是STM32 HAL库的void USARTx_IRQHandler(void),对各种错误是有处理的。

在USART的SR(状态寄存器)出现overrun标志后如何清掉呢

先读一下SR寄存器,然后再读一下DR寄存器。
在HAL库里感觉还有一个USART_ICR寄存器,但是手册里没有,在库的USART_TypeDef;里有定义。偏移地址是0x20

本文详细介绍了在STM32(GD32)串口通信中遇到的OVERRUN ERROR(ORE)问题,导致设备死机的原因。问题源于在中断处理函数中加入发送字符操作,当接收数据超过设定限制时,未正确处理ORE。STM32 HAL库具有错误处理功能,而GD32标准库则需手动清除ORE标志。解决方案包括在中断函数中检测并清除ORE标志,以及避免在中断处理中执行耗时操作。
最低0.47元/天 解锁文章
806

被折叠的 条评论
为什么被折叠?



