STM32(GD32)串口通信ORE(overrun error)导致死机

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值