stm32使用DMA+空闲中断,一次可以接收到一帧数据,数据由DMA直接搬到指定的内存,然后产生空闲中断,非常方便。但是在现场干扰很大的地方,程序死机复位了!初步怀疑是串口的中断没有处理好。
网上查找资料:https://blog.csdn.net/origin333/article/details/49992383发现如果发生ORE串口中断错误,要清除ORE中断需要按顺序读取USART_SR和USART_DR寄存器!那就是说USART_ClearFlag清掉所有Flag后,还必须读一遍USART_DR寄存器!
由于出错的概率非常小,不好复现。
if(USART_GetITStatus(UART4, USART_IT_IDLE) != RESET)//如果为空闲总线中断
{
//相应的处理
}if(USART_GetITStatus(USART3, USART_IT_PE | USART_IT_FE | USART_IT_NE |USART_IT_ORE) != RESET)//出错
{
USART_ClearITPendingBit(USART3, USART_IT_PE | USART_IT_FE | USART_IT_NE | USART_IT_ORE);
//读SR后读DR清除ORE 以前以为清除中断就可以了,芯片资料要求需要读数据寄存器的值
i = uart1->SR;
i = uart1->DR;
}
else
{
}
}
在错误中断里加上读错误数据后再也没有出现串口死机。