STM32串口接收中斷溢出問題解決


串口在接收數據過多時,會出現串口溢出錯誤,並進入溢出中斷(ORE中斷)

 

 

 

 ORE標志位在USART_SR寄存器,但值得注意的是,當我們打開串口接收中斷時,同時也就打開了ORE中斷。

 

 

 

 

清除ORE位的方法:順序執行對USART_SR和USART_DR寄存器的讀操作。
注意:在此使用USART_ClearITPendingBit(USART1, USART_IT_ORE);清除ORE位是沒有任何作用的。
還有ORE中斷只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 讀到(沒有使能USART_IT_ERR中斷時)
這些都是在這個帖子里讀到的http://blog.csdn.net/love_maomao/article/details/8234039帖子還指出了手冊的翻譯錯誤,哈哈,很厲害的博主(在此表白)。
最后附上解決方案:
中斷服務函數:

if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中斷
}

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
//rebuf[num++] = USART_ReceiveData(USART2); 讀取串口數據
}

 

 

ORE中斷只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 讀到(沒有使能USART_IT_ERR中斷時)

USART_GetITStatus(USART1,USART_IT_ORE)這個函數在USART_IT_ERR未使能時並不能正確讀取ORE的狀態!

可以使用USART_GetFlagStatus(USART1,USART_FLAG_ORE)讀取,或者初始化時使能USART_IT_ERR。

 

 

補充一下這倆函數的區別(看庫函數更直接):

 

IT主要就是與中斷相關的,檢查USART中斷產生與否,當USART發送完成后會有USART_IT_TC中斷,因此可以用來判斷,而USART_GetFlagStatus是USART標志位設置與否,其中就有發送完成標志位USART_Flag_TC所以也可用來判斷。而最終都是操作ISR寄存器

 

 

 

  • USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了接收中斷,那么ORE中斷也同時被開啟了。
  • ORE中斷只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 讀到(沒有使能USART_IT_ERR中斷時)

解決辦法:

       1.  初始化時,開啟中斷

USART_ITConfig(USART1, USART_IT_PE, ENABLE);    //開啟PE錯誤接收中斷Bit 8PEIE: PE interrupt enable
  //CR2 開啟ERR中斷
  USART_ITConfig(USART1, USART_IT_ERR, ENABLE);

       2. 在STM32中斷函數增加USART_IT_ORE等異常中斷的處理!

 


免責聲明!

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



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