STM32串口接收中断溢出问题解决

串口在接收数据过多时,会出现串口溢出错误,并进入溢出中断(ORE中断)

 

 

 

 ORE标志位在USART_SR寄存器,但值得注意的是,当我们打开串口接收中断时,同时也就打开了ORE中断。

 

 

 

 

清除ORE位的方法:顺序执行对USART_SR和USART_DR寄存器的读操作。
注意:在此使用USART_ClearITPendingBit(USART1, USART_IT_ORE);清除ORE位是没有任何作用的。
还有ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)
这些都是在这个帖子里读到的http://blog.csdn.net/love_maomao/article/details/8234039帖子还指出了手册的翻译错误,哈哈,很厉害的博主(在此表白)。
最后附上解决方案:
中断服务函数:

if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断
}

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
//rebuf[num++] = USART_ReceiveData(USART2); 读取串口数据
}

 

 

ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)

USART_GetITStatus(USART1,USART_IT_ORE)这个函数在USART_IT_ERR未使能时并不能正确读取ORE的状态!

可以使用USART_GetFlagStatus(USART1,USART_FLAG_ORE)读取,或者初始化时使能USART_IT_ERR。

 

 

补充一下这俩函数的区别(看库函数更直接):

 

IT主要就是与中断相关的,检查USART中断产生与否,当USART发送完成后会有USART_IT_TC中断,因此可以用来判断,而USART_GetFlagStatus是USART标志位设置与否,其中就有发送完成标志位USART_Flag_TC所以也可用来判断。而最终都是操作ISR寄存器

 

 

 

  • USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了接收中断,那么ORE中断也同时被开启了。
  • ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)

解决办法:

       1.  初始化时,开启中断

USART_ITConfig(USART1, USART_IT_PE, ENABLE);    //开启PE错误接收中断Bit 8PEIE: PE interrupt enable
  //CR2 开启ERR中断
  USART_ITConfig(USART1, USART_IT_ERR, ENABLE);

       2. 在STM32中断函数增加USART_IT_ORE等异常中断的处理!

 

posted @ 2021-04-12 10:10  清语堂  阅读(4304)  评论(0编辑  收藏  举报