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);
}
完结
希望对你有所帮助!!!