之前調試程序,遇到了串口溢出中斷的問題,導致主程序被卡死。這裏總結分享一下經驗,希望對讀者有用。
對於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之串口通信》
歡迎關注公衆號"嵌入式技術開發",大家可以後臺給我留言溝通交流。如果覺得該公衆號對你有所幫助,也歡迎推薦分享給其他人。