1、背景 前段时间在做一个CAN转USART的网关,使用的是STM32F412RET6,软件框架使用的是RT-Thread操作系统,主要外设资源使用了CAN1、CAN2、UART2、UART3,在做通信压力测试时,发现CPU程序运**死了,通过STM32 ST-LINK Utility工具,排查到了程序陷入死循环:串口轮询发送阻塞等待发送完成标志位,bad core如下如所示: 因排查了有些时间(代码白盒测试感觉已经查到头了),找不到根源,暂时加了超时机制措施,问题也暂时不复现了。
2、问题描述 ① 串口发送完成标志位因为什么没有被置位?
3、排查过程简述 问题表象为串口发送完成标志位未置位,所以认为主要的排查方向有: ① UART被关了 ② UART配置被写坏了 ③ UART时钟被关了 ④ TC位被误清了 以上①~③点,在试验的是出现“卡死”现象时,使用了stlink读取了相应寄存器信息,很遗憾,都正常。 ④点代码白盒走查,查到头了,也没有发现程序任何时序链路能够清除TC标志位。
4、补充 ① 代码白盒走查,演绎程序时序链路,分析TC位置位情况,感觉是正常的,附TC位在发送时行为时序图:
② 在stm32 Errata sheett里有描述如下 有可疑点 ○ 数据还在传输当中 是否硬件上有错误,有可能串口的发送移位寄存器往TX线上传送数据一直未完成? ○ 在数据传输过程中打断数据传送 误操作将发送失能?但是监控到关于串口寄存器相关是正常的。。。。
另外,CAN会影响UART吗?(好像共用一个时钟源,芯片内部总线有无冲突导致TC不被置位?)
社区各位大佬,在开发过程中有无遇到类似的问题?有什么建议的排查方向?
|