STM32L476串口通信HAL库编程,接收数据处理出现溢出错误ORE

1、项目背景及概述

        1.1异常描述       

         最近一个项目,在低频脉冲采集使用的外部中断处理且加入滤波,同时频繁的使用串口工具给USART2发送数据,概率型出现串口不能触发接收中断了,且出现过一次再也恢复不了接收数据了。但是按键(外部中断),ADC采集等等其他外设工作正常。

        1.2猜测原因

        STM32单片机负载较重、外部中断处理时间长、串口收发数据频率很高,还有多个中断存在,很容易出现串口溢出错误(ORE)。 

Bit 3 ORE : Overrun error
This bit is set by hardware when the data currently being received in the shift register is
ready to be transferred into the RDR register while RXNE=1. It is cleared by a software,
writing 1 to the ORECF, in the USART_ICR register.
An interrupt is generated if RXNEIE=1 or EIE = 1 in the USART_CR1 register.
0: No overrun error
1: Overrun error is detected

2、项目问题处理

        2.1问题定位

        由于故障出现是概率性的,首先在能正常工作情况下记录USART2所以寄存器的状态。如下

图所示:

        异常之后发现控制寄存器CR1中的 RXNEIE(接收中断)被清零了,串口中断状态寄存器ISR中的ORE(溢出寄存器)被置一了。如下图所示:

 2.2解决方案

        在HAL库中,有串口异常处理回调函数,我们只需要在异常回调函数中清除ORE寄存器,打开接收中断寄存器即可。具体代码参考如下:

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
	if(huart->ErrorCode&HAL_UART_ERROR_ORE)
	{
		__HAL_UART_CLEAR_OREFLAG(huart);
	
		__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
	}

}

        但是需要注意的是,在串口中断中执行这个函数HAL_UART_IRQHandler(&huart2),才回执行异常处理回调函数。如下所示:

void USART2_IRQHandler(void)
{
      HAL_UART_IRQHandler(&huart2);
}

完结

        希望对你有所帮助!!!

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值