stm32怎么清零?

如题所述

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

在STM32单片机中,CAN总线的REC/TEC寄存器用于记录接收和发送错误的帧数。当REC/TEC寄存器值大于96时,会触发错误报警。当出现这种情况时,可以通过CAN控制器的初始化模式来重置CAN寄存器,但是有时候可能会出现复位无效的情况。

下面提供几种可能的解决方案:

    手动复位CAN寄存器

    可以通过手动清除CAN控制器的寄存器来复位CAN寄存器。具体的操作方式取决于所使用的MCU型号和代码库。一般来说,可以通过以下步骤来实现:

    a. 设置CAN控制器为初始化模式

    b. 手动清除CAN寄存器

    c. 将CAN控制器设置为正常模式

    示例代码如下:

    objectivec

    CAN_HandleTypeDef hcan;


    hcan.Instance = CAN1;//设置为初始化模式HAL_CAN_DeInit(&hcan);//清除寄存器hcan.Instance->TSR |= CAN_TSR_ABRQ0;while((hcan.Instance->TSR & CAN_TSR_ABRQ0) == CAN_TSR_ABRQ0);
    hcan.Instance->TSR |= CAN_TSR_ABRQ1;while((hcan.Instance->TSR & CAN_TSR_ABRQ1) == CAN_TSR_ABRQ1);
    hcan.Instance->TSR |= CAN_TSR_ABRQ2;while((hcan.Instance->TSR & CAN_TSR_ABRQ2) == CAN_TSR_ABRQ2);
    hcan.Instance->MSR |= CAN_MSR_ERRI | CAN_MSR_WKUI | CAN_MSR_SLAKI;
    hcan.Instance->ESR |= CAN_ESR_LEC | CAN_ESR_BOFF | CAN_ESR_EPVF | CAN_ESR_EWGF;
    hcan.Instance->MSR &= ~(CAN_MSR_ERRI | CAN_MSR_WKUI | CAN_MSR_SLAKI);
    hcan.Instance->ESR &= ~(CAN_ESR_LEC | CAN_ESR_BOFF | CAN_ESR_EPVF | CAN_ESR_EWGF);//设置为正常模式CAN_FilterTypeDef sFilterConfig;
    sFilterConfig.FilterBank = 0;
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    sFilterConfig.FilterIdHigh = 0x0000;
    sFilterConfig.FilterIdLow = 0x0000;
    sFilterConfig.FilterMaskIdHigh = 0x0000;
    sFilterConfig.FilterMaskIdLow = 0x0000;
    sFilterConfig.FilterFIFOAssignment = 0;
    sFilterConfig.FilterActivation = ENABLE;
    sFilterConfig.SlaveStartFilterBank = 14;
    HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);
    HAL_CAN_Start(&hcan);

    使用自动错误处理机制

    可以将CAN控制器的自动错误处理机制设置为自动复位模式。这样,当REC/TEC寄存器的值超过阈值时,控制器会自动重置寄存器,并将CAN控制器设置为初始化模式,直到寄的值:

      在CAN控制器进入初始化模式之前,先将REC/TEC寄存器的值保存到一个变量中。

      进入初始化模式后,复位CAN控制器,并将保存的REC/TEC寄存器的值写回REC/TEC寄存器中。

      初始化完成后,将CAN控制器退出初始化模式。

      如果还是无法清零REC/TEC寄存器的值,可以尝试使用硬件清零或者复位CAN控制器。

      需要注意的是,每种STM32单片机的CAN控制器实现可能有所不同,具体的操作方法请参考芯片手册中的相关章节。

温馨提示:答案为网友推荐,仅供参考
相似回答