本文由RT-Thread论坛用户@DIODEX原创发布:https://club.rt-thread.org/ask/article/3034.html
STM32 CAN发送卡死问题与根本解决(RTT底层自身问题)
1 Bug导致的现象
- 问题1 RTT 4.0.2 CAN2没有连接CAN设备(或连接的设备未上电)时,一旦CAN2启动发送,RTT即卡死(此Bug官方在4.0.3修复了)
- 问题2 RTT 4.0.2、4.0.3中,CAN正在发送的过程中,如果CAN线硬件出现松动,或CANH CANL出现临时短路,则线程会卡死在CAN发送的
rt_device_write
中
2 分析与解决
2.1 CAN2没连接设备时CAN发送会卡死
此问题出现在RTT4.0.3之前的版本中。
drv_can.c中的 CAN2_SCE_IRQHandler()
中,case RT_CAN_BUS_ACK_ERR
中的if
中将drv_can2写成了drv_can1,改正之后即可解决CAN2在发送遇到设备无应答时出现程序卡死的问题。
原因分析:这里的CAN2_SCE_IRQHandler函数为发送出错的处理中断函数,当CAN2没有连接CAN设备(或连接的设备未上电)时,如果CAN2发送了报文,则一段时间后就会进入这个错误处理函数,而这里的if写成了can1,导致错误没有正常处理,导致程序卡死。
2.2 CAN发送过程硬件不稳或CANH-CANL短路后程序卡死
此问题出现在RTT4.0.3以及之前的版本中。笔者在4.0.2和4.0.3中均进行过测试。
2.2.1 修改方法
类似的卡死问题,有些资料给出的解决方案是打开CAN初始化时的AutoRetransmission
功能,这个方法看似也能解决问题,但其实是治标不治本。在2.2.2 问题分析中进行详细原因说明。
在drv_can.c中找到CAN1_TX_I