在对STM32调试中,使用上位机串口调试助手给节点发送命令,误将校验方式选择为无校验,而节点的串口初始化为偶校验方式接收数据,但使用串口工具发送无校验数据时,节点立即死机无反应,最终看门狗复位
*
使用jlink在线跟踪调试,发现程序未进入HardFault_Handler异常中断,在收到无校验的数据后,节点立即不停的循环进入串口中断处理程序,最终导致看门狗复位。
*
按照常规流程,通过MDK在线调试工具观察串口USART_CR1 与USART_ISR 寄存器的值;
*
发现USART_CR1 寄存器的PEIE置位,即将校验错误中断使能,同时串口中断状态寄存器USART_ISR的PE
位置位,所以产生中断,但我的中断处理程序里面未对改中断标志做任何处理,没有使用USART_ICR 寄存器将PE的中断标志位清除,当退出中断后,STM32
会立即再次进入串口中断。
*
这种现象是因为串口配置为偶校验,但收到无校验的串口数据时,数据校验失败同时PEIE位置1从而导致进入串口中断处理程序。
*
采用两种办法解决该问题:将USART_CR1 寄存器的PEIE的使能标志位清楚,或者在中断处理程序里面退出之前的时候,将使用USART_ICR 寄存器将
USART_ISR的PE中断标志位清除,最终测试后问题得到解决
*
但是在另外的串口测试中,使用上位机通过串口不停的向节点发送数据,中途手动将串口的硬件连接断开一段时间后再连接,有时候在将断开的串口连接再次连接上时,设备又会循环进入串口中断,最终导致设备的看门狗复位;
*
再次通过在线调试观察串口寄存器,发现上面的PEIE已经被置零,说明该中断使能已经被关闭,不是上面提到的校验错误引起的中断;
*
最终查看STM32F071的官方参考手册,在看到CR3寄存器上看到如下说明
EIE位:错误中断使能控制,该位如果置1时,当USART_ISR的FE或ORE或NF其中一个置位时都将产生中断,
FE位:帧错误位标志,当检测到同步错误或过多的噪声或break符;
ORE:过载错误标志;
NF:噪声错误标志;
*
在线调试观察CR3寄存器的EIE位被置位,同时在异常的循环进入串口中断时观察中断状态标志位发现以上三个标志位中存在置位的情况,当初对该EIE标志位的使能未重视;
*
最后跟源代码发现在串口的初始化中奖上面的两个中断使能位PEIE与EIE都使能;屏蔽该代码或在中断处理程序中清楚错误标志位后均正常工作;
*
该源代码是使用STM32cube工具生成的库,只使用了其串口初始化功能,但未使用工具生成的串口中断处理程序;