STM32的UART检测到上溢错误、一直进中断

问题

做项目的时候,发现程序莫名的就会死掉,因为采用了串口通信,需要不断的去接收数据,而且频率相对较快。
用JLink进行硬件调试,发现死在了串口中断里面,不停的进入中断,查看寄存器状态,发现ORE控制位被使能,查阅资料后发现是检测到上溢错误,才导致的这种问题。

在这里插入图片描述
出现ore中断,不能通过watch窗口,必须等出现后再去读取SR寄存器,否则你一直在窗口读取的话,中断永远不会复现,因为清零了,看手册嘛

在这里插入图片描述

也不能用这个窗口观察,否则依旧嘎嘎,这个问题真的挠头

在这里插入图片描述

原因

在接收数据时,如果RXNE还没有被复位,而这时又接收到一个字符就会发生溢出错误。比如我在上边打断点,串口助手连续发送数据,就噶了

解决

if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
{
    
    
    res_err=USART_ReceiveData(USART1);
    //USART_ClearFlag(USART1, USART_FLAG_ORE); //清除溢出中断,其实没用,因为手册里讲了
	//通过读入USART_SR 寄存器,然后读入 USART_DR寄存器来清除标志位
}

//USART_ClearFlag(USART1, USART_FLAG_ORE); //清除溢出中断,其实没用,因为手册里讲了
//通过读入USART_SR 寄存器,然后读入 USART_DR寄存器来清除标志位

所以下边这样做是没用的

if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
    
    
    USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断
}

在这里插入图片描述

函数也说明了哈,请你不要无中生有,想当然

在这里插入图片描述

补充

有的说下边这句话能打开ORE中断,ore是在打开RXNE自动开启的,所以这句话没吊用

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	//USART_ITConfig(USART1,USART_IT_ORE,ENABLE);//有的说这样能打开ORE中断,ore是在打开RXNE自动开启的,所以这句话没吊用

你看吧,人家压根就没有这个参数

在这里插入图片描述

参数检查也不会通过

assert_param(IS_USART_CONFIG_IT(USART_IT));
#define IS_USART_CONFIG_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \
                                ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \
                                ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \
                                ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ERR))

参考文章:
文章

总结

不要想当然
多看看手册,英文的为最官方的,中文也有翻译错的
在这里插入图片描述

转载不声明,谭泥小机急

猜你喜欢

转载自blog.csdn.net/weixin_44057803/article/details/129444467
今日推荐