STM32 CAN接收/发送错误寄存器如何清零?

在开发项目中,有的时候STM32单片机的CAN总线会出现发送和接收错误帧,当REC/TEC的寄存器值大于96时就会警告。这个时候我希望在整个MCU不复位的情况下,能够通过软件清除这个REC/TEC寄存器的值,芯片手册上说可以通过CAN控制器的初始化模式来复位CAN寄存器,我尝试过,但是不起作用,REC/TEC的值还是保持之前的值。目前是不知道如何才能在芯片不重启上电复位的情况下,如何才能实现REC/TEC的数据清零。

在STM32的CAN控制器中,接收错误计数器和发送错误计数器都是由CAN_ESR寄存器来控制的。要清零接收错误计数器和发送错误计数器,可以使用如下代码:



c
Copy code
CAN_HandleTypeDef hcan;
//清零发送错误计数器
hcan.Instance->ESR |= CAN_ESR_TEC;
//清零接收错误计数器
hcan.Instance->ESR |= CAN_ESR_REC;

其中,hcan是CAN控制器的句柄,CAN_ESR_TEC和CAN_ESR_REC分别表示发送错误计数器和接收错误计数器。
在清零之前,需要先确保CAN控制器已经停止了,可以使用如下代码停止CAN控制器:

c
Copy code
//停止CAN控制器
HAL_CAN_Stop(&hcan);

需要注意的是,在CAN总线中,错误计数器是非常重要的参数,它可以反映CAN总线的质量和稳定性。因此,在清零错误计数器之前,应该先检查错误发生的原因,并采取措施来解决问题,以确保CAN总线的正常工作。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2023-03-07

要清零STM32的CAN接收/发送错误寄存器,可以通过以下步骤实现:

    在CAN控制器初始化时将CAN_InitTypeDef结构体中的CAN_Mode设置为CAN_Mode_Init。

    调用CAN_Init()函数初始化CAN控制器。

    在CAN控制器初始化完成后,将CAN_Mode设置为CAN_Mode_Normal。

    调用CAN_OperatingModeRequest()函数将CAN控制器从初始化模式转换为正常模式。

    在正常模式下,调用CAN_ResetErrorCounter()函数将REC/TEC寄存器清零。

    以下是一个简单的示例代码:

// 定义CAN_InitTypeDef结构体变量

CAN_InitTypeDef        CAN_InitStructure;

// CAN控制器初始化

CAN_InitStructure.CAN_TTCM = DISABLE;

CAN_InitStructure.CAN_ABOM = ENABLE;

CAN_InitStructure.CAN_AWUM = DISABLE;

CAN_InitStructure.CAN_NART = ENABLE;

CAN_InitStructure.CAN_RFLM = DISABLE;

CAN_InitStructure.CAN_TXFP = ENABLE;

CAN_InitStructure.CAN_Mode = CAN_Mode_Init;

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;

CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;

CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;

CAN_InitStructure.CAN_Prescaler = 3;

CAN_Init(CAN1, &CAN_InitStructure);

// 将CAN控制器从初始化模式转换为正常模式

CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

CAN_Init(CAN1, &CAN_InitStructure);

CAN_OperatingModeRequest(CAN1, CAN_OperatingMode_Normal);

// 清零REC/TEC寄存器

CAN_ResetErrorCounter(CAN1);

注意,如果错误计数器REC/TEC在发生错误后一段时间内没有更新,可以通过向CAN控制器发送一个错误标志位来更新这些寄存器的值。这可以通过调用CAN_SendMessage()函数并将CAN消息类型设置为CAN_MsgType_Data来完成。

第2个回答  2023-03-07

在STM32单片机的CAN总线出现发送和接收错误帧时,可以通过软件清除CAN控制器中的REC/TEC寄存器值,而无需重启整个芯片。以下是一些可能会导致你的方法无法成功的原因以及可以尝试的其他方法:

    初始化模式:在初始化模式下,CAN控制器的所有寄存器都将被清零,并且需要重新配置。这意味着,当你进入初始化模式时,CAN控制器中的REC/TEC寄存器将被清零,但是你需要重新配置CAN控制器的所有其他寄存器。

    模式转换:如果你尝试在非初始化模式下清零REC/TEC寄存器,并且仍然没有成功,请尝试在模式转换时清零。模式转换是一种将CAN控制器从一种模式切换到另一种模式的方法,例如从正常模式切换到配置模式。在模式转换期间,CAN控制器的所有寄存器都将被清零,并且你可以重新配置CAN控制器的寄存器以便在正常模式下工作。

    自定义清零函数:如果以上方法都无法解决问题,你可以尝试编写自己的清零函数来清零REC/TEC寄存器。为此,你需要在清零函数中直接写入CAN控制器的REC/TEC寄存器地址,并将其设置为0。在执行此操作之前,确保在CAN控制器上禁用所有CAN传输。

第3个回答  2023-03-07

可以尝试使用以下方法清零CAN控制器的REC/TEC寄存器:

    进入CAN控制器的初始化模式:将CAN控制器的工作模式设置为“初始化模式”(Initialization Mode)。

    配置CAN控制器的控制寄存器CAN_CTLR:

    设置CAN_CTLR的SLEEP位为0,确保CAN控制器不处于睡眠模式。

    设置CAN_CTLR的INIT位为1,进入初始化模式。

    设置CAN_CTLR的CCE位为1,允许修改CAN控制器的配置寄存器CAN_BTR、CAN_IER、CAN_ESR等。

    清空CAN控制器的错误计数器REC和TEC,将CAN_ESR寄存器的LEC位清零。

    设置CAN_CTLR的INIT位为0,退出初始化模式。

    重新配置CAN控制器的BTR寄存器:根据实际情况重新设置CAN控制器的BTR寄存器,使其符合通信要求。

    重新进入正常工作模式:将CAN_CTLR的INIT位设置为0,CAN控制器重新进入正常工作模式。
    通过以上步骤,可以清零CAN控制器的REC/TEC寄存器,使其恢复正常工作状态。需要注意的是,在执行以上步骤时,需要确保CAN控制器的接收和发送都已经停止,否则可能会造成数据的丢失。

第4个回答  2023-03-07

可以使用CAN控制器的“BxCAN软件初始化”模式来清零REC/TEC寄存器。具体方法如下:

    进入BxCAN软件初始化模式。可以使用CAN控制器的“初始化模式”或“睡眠模式”来实现。具体方法可以参考芯片手册中的描述。

    在BxCAN软件初始化模式下,将CAN控制器的寄存器CAN_MCR的位INRQ设置为1,使其进入初始化模式。

    等待CAN控制器进入初始化模式后,将寄存器CAN_MCR的位SLEEP设置为0,使其退出睡眠模式。

    在BxCAN软件初始化模式下,将寄存器CAN_MCR的位NART和位RFLM都设置为1,以避免发送和接收过程中的自动重传和FIFO模式。

    在BxCAN软件初始化模式下,将寄存器CAN_TEC和CAN_REC的值都设置为0,以清零发送和接收错误计数器。

    最后,退出BxCAN软件初始化模式,进入CAN控制器的正常工作模式。可以使用CAN控制器的“工作模式”或“睡眠模式”来实现。具体方法可以参考芯片手册中的描述。

    需要注意的是,清零REC/TEC寄存器只能在BxCAN软件初始化模式下进行,而且需要先进入初始化模式,再退出睡眠模式,才能够清零REC/TEC寄存器。如果按照以上步骤操作后,REC/TEC寄存器的值还是没有清零,可能需要检查程序是否有误,或者考虑硬件故障的可能性。

相似回答