ST意法半导体
直播中

李莉

8年用户 1510经验值
私信 关注
[问答]

STM32F743的canfd错误寄存器,TEC,REC等信息怎么复位?

STM32F743的canfd错误寄存器,TEC,REC等信息怎么复位?重新初始化后寄存器值仍然保持。

回帖(3)

寇亦青

2025-3-14 16:22:27
使用了各种办法,各寄存器值始终无法清零,很多功能无法开展。
举报

陈芳

2025-3-14 16:22:33
CAN寄存器里的TEC/REC计数值是不能写的,是只读字段。
如果实在想令其归零,可以考虑将CAN外设做复位操作。
比方你这样操作对CAN1外设做复位动作,下面代码成对使用。
__HAL_RCC_CAN1_FORCE_RESET();
__HAL_RCC_CAN1_RELEASE_RESET() ;
举报

硕达科讯

2025-3-20 18:09:12

对于STM32F743的CAN FD模块中的TEC和REC错误计数器复位问题,以下是逐步解决方案:


方法一:通过进入初始化模式复位



  1. 请求进入初始化模式

    设置CAN_MCR寄存器的INRQ位为1,使CAN进入初始化模式:
    CANx->MCR |= CAN_MCR_INRQ; // 请求初始化模式

  2. 等待初始化模式确认

    等待CAN_MSR寄存器的INAK位变为1,确认进入初始化模式:
    while (!(CANx->MSR & CAN_MSR_INAK)) {} // 等待直到进入初始化模式

  3. 错误计数器自动清零

    进入初始化模式后,硬件会自动将TECREC清零。此时可验证:
    uint32_t tec = (CANx->ESR & CAN_ESR_TEC) >> CAN_ESR_TEC_Pos;
    uint32_t rec = (CANx->ESR & CAN_ESR_REC) >> CAN_ESR_REC_Pos;

  4. 重新配置并退出初始化模式

    修改其他配置参数后,退出初始化模式:
    CANx->MCR &= ~CAN_MCR_INRQ; // 退出初始化模式
    while (CANx->MSR & CAN_MSR_INAK) {} // 等待退出完成


方法二:硬件复位CAN外设


若初始化模式未生效,可通过RCC寄存器强制复位CAN外设:



  1. 触发硬件复位

    使用RCC的APB1复位寄存器对CAN外设进行复位:
    // 假设使用CAN1
    RCC->APB1RSTR |= RCC_APB1RSTR_CAN1RST; // 复位CAN1
    RCC->APB1RSTR &= ~RCC_APB1RSTR_CAN1RST; // 清除复位位

  2. 重新初始化CAN配置

    复位后重新配置CAN参数,此时TECREC将被重置为0。


方法三:处理总线关闭状态


若CAN处于总线关闭状态(CAN_ESRBOFF位为1),需执行恢复操作:



  1. 等待自动恢复

    CAN需检测128次连续隐性位以自动恢复,或手动退出总线关闭:
    CANx->MCR |= CAN_MCR_ABOM; // 启用自动总线关闭管理

  2. 手动恢复(可选)

    若未启用自动恢复,退出总线关闭状态:
    CANx->MCR &= ~CAN_MCR_INRQ; // 确保退出初始化模式


注意事项



  • 验证初始化流程:确保正确进入和退出初始化模式,并等待状态位确认。

  • 检查配置顺序:某些配置需在初始化模式下设置,如波特率、工作模式等。

  • 调试技巧:通过调试器直接读取CAN_ESR寄存器,确认TECREC是否被清零。


通过上述方法,可有效复位CAN FD的错误计数器。若问题依旧,建议检查硬件连接或潜在的总线错误源。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分