调试串口的时候,发现stm32频繁进入串口中断,导致无法执行主循环。但是串口中断中既不执行发送中断操作,也不执行接收中断操作。理解应该是触发了串口错误中断,但是串口其他中断没有开启,感觉应该不会触发,上网搜索了一下,有大神解决了这个问题,现在把这个问题拿出来和大家分享下。
原文如下:
调试串口时,发现串口会出现频繁跳中断,导致无法执行主循环的问题!
调试发现是串口中断硬件BUG:
1. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了接收中断,那么ORE中断也同时被开启了。
2. 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等异常中断的处理!
//开启CR3,bit0的EIE: Error interrupt enable, 处理USART_IT_ERR,USART_IT_ORE_ER,USART_IT_NE,USART_IT_FE 错误
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
{//同 @arg USART_IT_ORE_ER : OverRun Error interrupt if the EIE bit is set
ushTemp = USART_ReceiveData(USART1); //取出来扔掉
USART_ClearFlag(USART1, USART_FLAG_ORE);
}
if(USART_GetFlagStatus(USART1, USART_FLAG_NE) != RESET)
{//同 @arg USART_IT_NE : Noise Error interrupt
USART_ClearFlag(USART1, USART_FLAG_NE);
}
if(USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET)
{//同 @arg USART_IT_FE : Framing Error interrupt
USART_ClearFlag(USART1, USART_FLAG_FE);
}
if(USART_GetFlagStatus(USART1, USART_FLAG_PE) != RESET)
{//同 @arg USART_IT_PE : Parity Error interrupt
USART_ClearFlag(USART1, USART_FLAG_PE);
}
原文地址
http://blog.csdn.net/love_maomao/article/details/8234039
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>