串口在接收數據過多時,會出現串口溢出錯誤,並進入溢出中斷(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等異常中斷的處理!