UART串口接收中断溢出问题
串口在接收数据过多时,会出现串口溢出错误,并进入溢出中断(ORE中断)。
- 分析产生错误的原因:
ORE标志位在USART_SR寄存器,但值得注意的是,当我们打开串口接收中断时,同时也就打开了ORE中断。
2.如何解决:
清除ORE位的方法:顺序执行对USART_SR和USART_DR寄存器的读操作。
注意:在此使用USART_ClearITPendingBit(USART1, USART_IT_ORE);清除ORE位是没有任何作用的。还有ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)。
具体解决方案:
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
{ /*@arg USART_IT_ORE_ER : OverRun Error interrupt if the EIE bit is set */
USART_ClearFlag(USART1, USART_FLAG_ORE); /* 清除溢出中断 */
(void)UART1->SR; /*先读SR,再读DR*/
(void)UART1->DR;
}
if(USART_GetFlagStatus(USART1, USART_FLAG_NE) != RESET)
{
//同@arg USART_IT_NE: Noise Error interrupt
USART_ClearFlag(USART1, USART_FLAG_NE);
}
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
rebuf[num++] = USART_ReceiveData(USART1); /* 读取串口数据 */
}