stm32串口通信死在接收中断中的解决方法
现象:
使用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);
}
}