|
楼主 |
发表于 2024-4-20 18:24:54
|
显示全部楼层
硬汉哥你好,经过排查,发现问题如下:
我们的程序写法是按照例程:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
但是这种写法,会产生一个问题,假如我的数据是错误帧,即是不满足UART协议的,没办法进入到if里面清除串口中断标志位,导致出现程序不断在串口中断卡死,无法执行 while循环。为了克服这个问题,我们尝试读取其他串口中断标志位,方便清空中断标志,保证不会重复进入中断。但是我们当时读中断标志时,发现没有其他中断位的存在,后来我们网上查阅资料,发现芯片有以下bug,产生过载错误时,ORE会被置1,但只有当USART_IT_ERR中断使能时,才能读到ORE中断。后来我们按照文章的指引,把代码改了后,没有死机情况出现,代码如下,文章链接放到最后,供大家参读。
if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断
{
USART_ReceiveData(USART1);
}
if(bRecieveOK)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
return;//processing receive data,don't receive again
}
我们也是按照该文章进行改进的:
https://bbs.21ic.com/icview-160999-1-1.html |
|