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);
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM