STM32串口溢出中斷問題

    之前調試程序,遇到了串口溢出中斷的問題,導致主程序被卡死。這裏總結分享一下經驗,希望對讀者有用。

    對於STM32F103系列單片機,使能接收中斷後,溢出中斷就會自動被使能。那什麼時候會發生溢出中斷呢?在RXNE=1 的的條件下(也就是上次數據還沒有讀走),串口接收寄存器又接收好了一個字節的數據並準備往RDR 寄存器去轉移的時候,會產生溢出中斷。

    產生溢出中斷典型的情況有:
    1.串口接收中斷被更高優先級的中斷打斷,且打斷時間比較長。

    2.擦寫單片機內部flash時,耗時較長,導致串口中斷無法響應。

    串口接收的數據越頻繁,發生溢出中斷的概率越大,如果程序中沒有對溢出中斷進行處理,就會導致程序死機等情況。

 

    解決辦法:

    1.判斷並清除溢出中斷標誌。清除溢出標誌只需要依次讀取SR和DR寄存器即可。在串口中斷中添加如下程序:


if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE))//溢出標誌
{
  uint32_t temp = USART1->SR;
  temp = USART1->DR;
}

對於使用STM32CubeMX生成的程序,編寫串口錯誤回調函數即可。

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
  if(huart->ErrorCode & HAL_UART_ERROR_ORE)//溢出錯誤
  {
    uint32_t temp = huart->Instance->SR;
    temp = huart->Instance->DR;
  }
}

 2.另外一種方法就是不使能接收中斷,比如採用DMA+空閒中斷的方式。可以參考之前的文章《STM32CubeMX之串口通信

 

歡迎關注公衆號"嵌入式技術開發",大家可以後臺給我留言溝通交流。如果覺得該公衆號對你有所幫助,也歡迎推薦分享給其他人。

圖片

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章