STM32——串口溢出ORE的前世今生

当数据接收区或者FIFO区有数据或者满时,又有新数据进来,会导致发生溢出错误,一旦发生溢出错误,RX 移位寄存区虽然能有新数据不断的覆盖,但是数据不会到达RXR或FIFO(现象是:RXNE在ORE置位时不会被置位),导致程序中不能读到新的数据。只有通过ICR清除ORE才能使得RXNE在接收到新数据时置位。

串口框图

在这里插入图片描述

溢出错误属于串口接收

USART receiver

溢出错误发生的原因

  1. FIFO mode disabled
    An overrun error occurs if a character is received and RXNE has not been reset.
    Data can not be transferred from the shift register to the RDR register until the RXNE
    bit is cleared
    . The RXNE flag is set after every byte reception.
    An overrun error occurs if RXNE flag is set when the next data is received or the previous DMA request has not been serviced.
  2. FIFO mode enabled
    An overrun error occurs when the shift register
### STM32 HAL库串口 ORE 中断处理方法 在使用STM32 HAL库进行串口通信时,如果发生ORE(Overrun Error),可能会导致数据丢失或者接收中断失效等问题。以下是针对该问题的具体解决方案。 #### 1. **理解ORE错误** 当串口接收到新数据而前一次的数据尚未被读取时,会发生缓冲区覆盖的情况,从而触发ORE错误。这种情况下,如果没有及时处理,可能导致后续的接收操作失败[^1]。 #### 2. **启用异常回调函数** HAL库提供了一个专门用于处理串口错误的回调函数`HAL_UART_ErrorCallback()`。通过重写此函数,在检测到ORE错误时执行相应的恢复措施[^4]。 ```c void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { if (huart->ErrorCode & HAL_UART_ERROR_ORE) { // 清除ORE标志位 __HAL_UART_CLEAR_OREFLAG(huart); // 重新使能接收中断 __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE); } } ``` 上述代码片段展示了如何清除ORE标志并重新激活接收中断的功能[^5]。 #### 3. **优化接收逻辑** 为了减少ORE发生的概率,可以调整程序中的接收流程。例如增加轮询频率或采用DMA模式来提高数据传输效率[^3]。 #### 4. **配置合适的波特率和硬件资源** 确保所选波特率适合当前应用场景,并且MCU有足够的计算能力去处理高速度下的数据流。此外,合理分配CPU时间片给UART任务也是预防ORE的有效手段之一[^2]。 综上所述,通过对ORE错误的理解以及利用HAL库提供的工具和技术改进现有设计,可有效缓解甚至完全消除因ORE引发的各种问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值