RTT STM32系列CAN发送卡死问题与根本解决

本文详细分析了RTT STM32在CAN发送过程中遇到的卡死问题,包括CAN2无连接设备时的卡死及CAN发送过程中硬件不稳定导致的卡死。通过修改中断处理函数和添加异常处理机制,解决了由于硬件故障或无应答导致的程序卡死问题,同时讨论了自动重发功能的优缺点。
摘要由CSDN通过智能技术生成

本文由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

  • 15
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值