現象:
使用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);
}
}