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

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252029.html
標籤:其他
