摘要:
在STM32串口应用过程中,面对串口高速频繁收发和Flash操作同步进行时,出现串口不响应的情况,但显示和按键正常,查阅相关资料后定位到串口ORE溢出中断,以此记录。
一、ORE中断定义及产生原因
通过查阅《STM32F系列ARM内核32位高性能微控制器参考手册V10_1.pdf》以及学习CSDN博客了解到以下内容:
1、ORE溢出中断与串口接收中断使用的是同一个使能位,使能串口接收中断的同时就使能了ORE溢出中断。
2、如果RXNE接收标志还没有被复位,又接收到一个字符,此时就会产生ORE溢出错误;溢出错误产生后,串口随后接收到的数据都将丢失,我认为这一点就是导致串口无响应的根本原因。
二、Flash读写与串口收发的冲突
通过学习CSDN博客了解到,Flash写入过程中,无法访问Flash中的代码和数据,从而是无法执行中断服务函数代码的;可以理解为Flash操作是一个优先级更高的任务,在进行Flash操作时,串口接收中断被搁置了,又因为Flash擦除时间较长,串口接收中断RXNE标志一直没有被清除,导致串口产生了溢出中断。STM32F10x单片机Flash写操作导致中断不响应问题_rtos在烧写flash时停止其他活动_哐哐哐 Quan的博客-CSDN博客
三、解决措施
通过参考手册和CSDN博客了解到,清除ORE溢出错误的方法为顺序执行对USART_SR和USART_DR寄存器的读操作,参考http://t.csdn.cn/xUByU在串口中断函数入口处增加以下代码就解决了ORE溢出错误导致串口无响应的问题。
if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
USART_ClearFlag(USART2,USART_FLAG_ORE);//清除ORE标志位
USART_ReceiveData(USART2);
}
但是还需要提出来的是,这样虽然避免了串口无响应的问题,但是因为Flash操作时间长,会概率性出现丢失报文的现象,针对这一点可以参考http://t.csdn.cn/IQTp6进行修改,该篇博客讲述了如何将中断函数放到RAM中和修改中断向量表地址的方法,以此来避免Flash操作和中断冲突,限于个人水平,该博客的方法我还未进行实践。
参考资料:
参考的博客较多,如有遗漏还请见谅!
本文用以记录学习,文中内容如有错误或遗漏,欢迎各位指正交流,谢谢!