登录/注册

stm32 can出错处理 代码

更多

以下是基于STM32 HAL库的CAN总线错误处理代码示例(含中文注释):

#include "stm32f1xx_hal.h"

CAN_HandleTypeDef hcan;

// CAN初始化函数
void CAN_Init(void)
{
  hcan.Instance = CAN1;
  hcan.Init.Prescaler = 16;          // 分频系数
  hcan.Init.Mode = CAN_MODE_NORMAL;   // 正常工作模式
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan.Init.TimeSeg1 = CAN_BS1_13TQ;  // 时间段1
  hcan.Init.TimeSeg2 = CAN_BS2_2TQ;  // 时间段2
  hcan.Init.TimeTriggeredMode = DISABLE;
  hcan.Init.AutoBusOff = ENABLE;     // 自动总线关闭恢复
  hcan.Init.AutoWakeUp = DISABLE;
  hcan.Init.AutoRetransmission = ENABLE; // 自动重传
  hcan.Init.ReceiveFifoLocked = DISABLE;
  hcan.Init.TransmitFifoPriority = DISABLE;

  // 初始化CAN并启动
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    Error_Handler();
  }

  // 配置错误中断
  HAL_CAN_ActivateNotification(&hcan, CAN_IT_ERROR_WARNING | CAN_IT_ERROR_PASSIVE 
                              | CAN_IT_BUSOFF | CAN_IT_LAST_ERROR_CODE);
}

// CAN错误回调函数
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
{
  uint32_t error = HAL_CAN_GetError(hcan);

  // 错误类型判断
  if(error & HAL_CAN_ERROR_EWG)
  {
    // 错误警告(错误计数器超过96)
    printf("CAN Error Warning!\r\n");
  }
  if(error & HAL_CAN_ERROR_EPV)
  {
    // 被动错误(错误计数器超过127)
    printf("CAN Error Passive!\r\n");
  }
  if(error & HAL_CAN_ERROR_BOF)
  {
    // 总线关闭状态
    printf("CAN Bus Off!\r\n");
    // 需要手动恢复总线
    HAL_CAN_Stop(hcan);
    HAL_CAN_Start(hcan);
  }
  if(error & HAL_CAN_ERROR_ACK)
  {
    // ACK错误
    printf("CAN ACK Error!\r\n");
  }
  if(error & HAL_CAN_ERROR_CRC)
  {
    // CRC错误
    printf("CAN CRC Error!\r\n");
  }

  // 获取详细错误状态寄存器
  uint32_t esr = HAL_CAN_GetErrorStatus(hcan);

  // 解析错误类型
  if(esr & CAN_ESR_BOFF)
  {
    printf("Bus Off状态\r\n");
  }
  if(esr & CAN_ESR_EPVF)
  {
    printf("被动错误标志\r\n");
  }
  if(esr & CAN_ESR_EWGF)
  {
    printf("错误警告标志\r\n");
  }

  // 获取错误计数器
  uint8_t tx_err = (esr & CAN_ESR_TEC) >> 16;
  uint8_t rx_err = (esr & CAN_ESR_REC) >> 24;
  printf("发送错误计数器:%d,接收错误计数器:%d\r\n", tx_err, rx_err);
}

// 主函数示例
int main(void)
{
  // ... 系统初始化
  CAN_Init();

  while(1)
  {
    // 主循环可添加错误恢复逻辑
    if(HAL_CAN_GetState(&hcan) == HAL_CAN_STATE_BUSY)
    {
      // 总线忙处理
    }
  }
}

关键点说明:

  1. 错误类型处理:

    • 错误警告(Error Warning):错误计数器超过96
    • 被动错误(Error Passive):错误计数器超过127
    • 总线关闭(Bus Off):发送错误计数器超过255
    • 其他错误:ACK/CRC/格式错误等
  2. 常用处理策略:

    • 总线关闭后需要手动重启CAN控制器
    • 被动错误状态时控制器只能接收不能发送
    • 建议监控错误计数器,超过阈值时进行复位
    • 重要数据建议增加重传机制
  3. 注意:

    • 使用前需正确配置CAN时钟和GPIO
    • 根据实际需求选择错误处理方式
    • 建议配合硬件滤波器和软件校验使用
    • 总线关闭恢复后建议进行自检

建议根据具体应用场景增加:

需要根据实际使用的STM32型号调整寄存器配置,建议参考对应型号的参考手册和技术文档。

请问CAN通讯上可以做哪些出错处理

我先说一下目前项目中采用的一些处理: 1、利用HAL库的返回值处理,比如下面: while(HAL_CAN_Transmit_IT( hcan_

2024-04-25 06:44:11

SRC/SNK出错怎么处理

SRC/SNK 出错处理 协议错误由任一端口发起 Soft_Reset 消息,以重置计数器、计时器和状态,不改变商定好的电压、电流、端口角色以及工作模式 严重错误由任一端口发起 Hard Reset

2023-09-09 17:45:28

使用FlyMCU对STM32串口下载程序出错的解决方法

问题:使用FlyMCU对STM32进行串口下载程序时出现0KB出错,如下图所示。

2023-06-16 18:20:46

STM32F407 CAN2 通信代码测试收发通过

STM32F407 CAN2 通信代码测试收发通过硬件电路图 CPU CAN

资料下载 佚名 2021-12-14 18:38:39

基于STM32F429HAL库的CAN通信代码

基于STM32F429HAL库的CAN通信代码* 最近在学正点原子阿波罗STM32

资料下载 33391 2021-12-04 19:06:09

stm32CAN通信代码

学习单片机,通信方面可以说是一大重点最近做项目需要用到can通信,这里分享一下自己的can通信学习代码,我使用的是正点原子的精英开发板,参考的资

资料下载 王杰 2021-12-04 17:21:04

基于STM32+LoRa的点对点通信源代码

基于STM32+LoRa的点对点通信源代码

资料下载 范yf 2021-09-09 10:56:21

基于STM32单片机和MCP2515的CAN通讯

基于STM32单片机和MCP2515的CAN通讯

资料下载 楊yang 2021-07-18 10:52:23

STM32F103做CAN的收发通信的程序思路与代码分享

STM32的标识符屏蔽滤波目的是减少了CPU处理CAN通信的开销。STM32

2022-06-14 16:13:05

MDK Keil在编译STM32代码出错怎么解决?

MDK Keil在编译STM32代码时出错怎么解决?

2022-02-09 07:32:48

基于STM32F429HAL库的CAN通信代码分享

基于STM32F429HAL库的CAN通信代码* 最近在学正点原子阿波罗STM32

2022-02-08 07:00:40

STM32F407的CAN通信的出错测试应该怎么解决?

做STM32F407的CAN通信的出错测试应该怎么解决?

2021-11-16 06:37:56

STM32F407的CAN通信的出错测试

整理:MilerShao 某日,有一客户反映他们在做STM32F407的CAN通信的出错测试时,发现出现类似死机的现象。后来跟踪调试发现是开启了

2021-08-19 09:36:20

stm32can通信代码

stm32can通信代码,关于 CAN23.1.1 CAN 电气特性与协

2021-08-05 06:07:21

CANOpen系列教程06_ 结合代码理解CAN底层收发数据

CANOpen系列教程06_结合代码理解CAN底层收发数据(含STM32例程)

2020-03-06 16:09:32

7天热门专题 换一换
相关标签