问题
做项目的时候,发现程序莫名的就会死掉,因为采用了串口通信,需要不断的去接收数据,而且频率相对较快。
用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))
参考文章:
文章
总结
不要想当然
多看看手册,英文的为最官方的,中文也有翻译错的
文章来源:https://www.toymoban.com/news/detail-661316.html
转载不声明,谭泥小机急文章来源地址https://www.toymoban.com/news/detail-661316.html
到了这里,关于STM32的UART检测到上溢错误、一直进中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!