[STM32F4] STM32F407 CAN 通信错误处理

[复制链接]
 楼主| 发表于 2025-7-3 16:50 | 显示全部楼层 |阅读模式
问题描述:
使用 STM32F407 的 CAN 接口与多个设备通信,但偶尔会出现通信中断的情况。

排查过程:

使用 CAN 分析仪监测总线上的信号,发现有错误帧
查看 STM32 的 CAN 错误计数器,发现接收错误计数器经常接近上限
分析代码,发现没有完善的错误处理机制

解决方案:

添加 CAN 错误处理函数,当错误计数器接近上限时自动重启 CAN 控制器
优化 CAN 过滤器设置,减少不必要的中断
增加接收缓冲区,防止数据溢出

[color=rgba(0, 0, 0, 0.45)]// CAN错误处理函数void CAN_Error_Handler(void){    uint8_t errorCode = CAN_GetLastErrorCode(CAN1);    uint8_t rxErrorCounter = CAN_GetReceiveErrorCounter(CAN1);    uint8_t txErrorCounter = CAN_GetTransmitErrorCounter(CAN1);        [color=rgba(0, 0, 0, 0.45)]// 记录错误信息    printf("CAN Error: Code=%d, RX Counter=%d, TX Counter=%d\r\n",            errorCode, rxErrorCounter, txErrorCounter);        [color=rgba(0, 0, 0, 0.45)]// 如果错误计数器接近上限,重启CAN控制器    if(rxErrorCounter > 96 || txErrorCounter > 96)    {        printf("CAN Error Counter too high, restarting CAN controller...\r\n");                [color=rgba(0, 0, 0, 0.45)]// 禁用CAN控制器        CAN_Cmd(CAN1, DISABLE);                [color=rgba(0, 0, 0, 0.45)]// 重新初始化CAN控制器        CAN_InitStructure.CAN_TTCM = DISABLE;        CAN_InitStructure.CAN_ABOM = ENABLE;        CAN_InitStructure.CAN_AWUM = DISABLE;        CAN_InitStructure.CAN_NART = DISABLE;        CAN_InitStructure.CAN_RFLM = DISABLE;        CAN_InitStructure.CAN_TXFP = DISABLE;        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;        CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;        CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;        CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;        CAN_InitStructure.CAN_Prescaler = 4;        CAN_Init(CAN1, &CAN_InitStructure);                [color=rgba(0, 0, 0, 0.45)]// 重新配置过滤器        CAN_FilterInit(&CAN_FilterInitStructure);                [color=rgba(0, 0, 0, 0.45)]// 使能CAN控制器        CAN_Cmd(CAN1, ENABLE);    }}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

18

帖子

0

粉丝
快速回复 返回顶部 返回列表