stm32串口通信死在接收中断中的解决方法

现象:
   使用stm32f0xx系列的芯片,串口1使用接收中断时,当接收到一个数据时死在串口中断中,发生了串口中断溢出。

原因解释:

在使用一个串口发数据的传感器过程中,发现程序第一次进入串口中断之后不再执行主函数的内容,中断中的内容也不执行。查询大量资料后发现:串口在接收数据过多时,会出现串口溢出错误,并进入溢出中断(ORE中断)。接下来是错误产生原因以及解决方法。
(1)什么是ORE中断?为什么会产生?

 

 

 

 

产生原因如上所述。

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

 

 

(2)如何解决?
看了上面的资料之后,我知道程序是死在了串口溢出中断。处理中断时,我首先想到的是清除这个中断标志位,但是遇到了很多麻烦。


————————————————
版权声明:本文为CSDN博主「今天也迟到」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34401994/article/details/76359581

解决方法:  

void USART1_IRQHandler(void)
{
  /* 加入清除标志位,否则会卡死在串口中断服务函数中 */
  uint8_t ucTemp;
  if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET) //检查 USART 是否发生中断
  {
    USART_ClearITPendingBit(DEBUG_USARTx,USART_IT_RXNE); // 清中断标志
    ucTemp=USART_ReceiveData(DEBUG_USARTx);
  }
  if(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_ORE) == SET) // 检查 ORE 标志
  {
    USART_ClearFlag(DEBUG_USARTx,USART_FLAG_ORE);
    USART_ReceiveData(DEBUG_USARTx);
  }
}

 

posted on 2021-03-30 16:43  Ablerry  阅读(5827)  评论(0编辑  收藏  举报