关于STM32的串口溢出中断,之前在网上看过两篇博客《STM32串口接收中断溢出问题解决》和《STM32 串口中的硬件BUG,请注意!》,也是从中学习到了串口ERROR的用法。关于串口溢出中断的相关寄存器操作和一些细节,两位博主已经讲得很详细了,在此感谢两位博主的辛勤付出。
接下来主要谈及CubeMX如何配置溢出中断以及本人遇到的一些问题。
首先,要把串口配置成RXNE中断,具体的配置步骤可以参考我的文章《关于CubeMX的串口全双工接收发送锁死的问题》。
然后,使能RXNE中断和ORE中断,main.c中的代码如下:
void main(void)
{
...
if(HAL_UART_Receive_IT(&huart2,(u8 *)&i,1) != HAL_OK) Error_Handler();
/* 开启接收错误中断 */
__HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
...
}
接着,在usart.c中加入串口错误中断回调函数的定义:
/* 中断错误处理函数,在此处理overrun错误 */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
uint8_t i = 0;
if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(huart);
HAL_UART_Receive_IT(huart,(u8 *)&i,1);
}
}
单纯处理溢出中断的话,这样就可以了;如果想处理其他一些错误,比如帧错误等等,就继续判断标志位;如果想在检测到错误之后做一些处理,也可以写在回调函数里。
最后还想说几点,在之前的程序中,溢出中断也与死机如影随行,如果出现了溢出中断就意味着百分百丢失了数据。而我们能做的处理无非就是清除标志位防止中断反复触发,从而使整个系统能继续运行下去。至于丢失的数据,已经不可能找回来了。
溢出中断只是作为一种防备手段来预防极小概率发生的情况,我当时用了3套串口,其中一个几乎满负荷运行,另一个用于接收GPS数据的低优先级串口使用了溢出中断,最后本来一秒一次的GPS数据在校验之后一分钟才能更新一次,甚至需要更长时间,最后还是不得不使用了串口空闲中断,为此需要为接收GPS数据保留一个1k的ram作缓存区。希望之后能找到更好的处理办法。。。