登录/注册

STM32F0 CAN通信

STM32F0 CAN通信

更多

以下是针对 STM32F0系列CAN通信 的中文详解,包含关键配置步骤和代码示例:


一、硬件准备

  1. CAN收发器:如TJA1050,连接MCU的CAN_TX/CAN_RX到总线。
  2. 终端电阻:总线上需安装120Ω电阻(高速CAN必需)。
  3. 引脚分配
    • PA11 = CAN_RX, PA12 = CAN_TX(默认复用功能)
    • 其他引脚需查芯片手册(如PB8/PB9等)。

二、CubeMX配置(关键步骤)

  1. 时钟配置

    • 使能HSE(外部晶振),PLL倍频至48MHz(CAN时钟上限)。
    • CAN时钟源必须为PCLK(APB时钟),STM32F0无独立CAN时钟。
      RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; // 8MHz * 12 = 96MHz(超频需谨慎)
  2. CAN初始化

    • Mode: Normal(正常模式)
    • Parameters:
      • Prescaler: 设置波特率(例:48MHz / (1+9+4) = 3Mbps?)
      • Time Quantum = 1tq, BS1 = 9tq, BS2 = 4tq(标准配置)
    • Filter: 启用滤波器0,Mask模式接收所有ID。

三、代码实现(HAL库)

// 1. 声明CAN句柄与报文结构体
CAN_HandleTypeDef hcan;
CAN_TxHeaderTypeDef TxHeader;
CAN_RxHeaderTypeDef RxHeader;
uint8_t TxData[8], RxData[8];
uint32_t TxMailbox;

// 2. 初始化CAN(CubeMX已生成)
void MX_CAN_Init(void) {
  hcan.Instance = CAN;
  hcan.Init.Prescaler = 4;       // 波特率 = 48MHz / (Prescaler*(1+BS1+BS2))
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan.Init.TimeSeg1 = CAN_BS1_9TQ;   // BS1长度
  hcan.Init.TimeSeg2 = CAN_BS2_4TQ;   // BS2长度
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.AutoBusOff = ENABLE;
  HAL_CAN_Init(&hcan);
}

// 3. 启动CAN
HAL_CAN_Start(&hcan);

// 4. 发送CAN报文
TxHeader.StdId = 0x123;          // 标准ID
TxHeader.ExtId = 0;              // 扩展ID(0表示标准帧)
TxHeader.IDE = CAN_ID_STD;       // 标准帧
TxHeader.RTR = CAN_RTR_DATA;     // 数据帧
TxHeader.DLC = 2;                // 数据长度=2字节
TxData[0] = 0xAA; TxData[1] = 0x55;
if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) != HAL_OK) {
  Error_Handler(); // 发送失败处理
}

// 5. 接收中断配置(在main初始化中)
HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
HAL_NVIC_SetPriority(CAN_RX0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(CAN_RX0_IRQn);

// 6. 接收中断回调函数
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
  HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData);
  uint32_t id = RxHeader.StdId;  // 获取ID
  // 处理接收到的数据 RxData[0~7]...
}

四、波特率计算

参数 说明
时钟源 48MHz PCLK频率
Prescaler 4 分频系数
BS1 9 tq 时间段1
BS2 4 tq 时间段2
波特率 1 Mbps 48e6 / (4 * (1 + 9 + 4))

? 公式波特率 = PCLK / (Prescaler * (1 + BS1 + BS2))


五、常见问题解决

  1. 无法进入中断

    • 检查NVIC中断使能,确认CAN_RX0_IRQn已开启。
    • 滤波器未配置:确保至少启用一个滤波器(例:Filter0掩码模式0x0000接收所有ID)。
  2. 总线错误

    • 测量CANH/CANL电压:静止时应均为2.5V,显性位CANH=3.5V/CANL=1.5V。
    • 检查终端电阻(120Ω必须接在总线两端)。
  3. 发送失败

    • 使用HAL_CAN_GetError()读取错误标志:
      if (HAL_CAN_GetState(&hcan) == HAL_CAN_STATE_ERROR) {
      uint32_t err = HAL_CAN_GetError(&hcan); // 检查CAN_ESR寄存器
      }

六、进阶配置


⚠️ 注意:STM32F0的CAN时钟必须由PCLK提供(通常为48MHz),超频可能导致通信异常。建议使用示波器或CAN分析仪(如PCAN-USB)监控实际波形。

STM32F0系列MCU硬件电路供电设计

对于任何IC的电源设计要求,都可以在规格书中获取到需要的信息。STM32F0系列MCU电源轨信息和要求可以在规格书第53页的Table 24看到,如下图(图一)所示。

2023-09-27 14:25:44

STM32F0系列MCU硬件电路boot设计

Boot配置的作用是用于选择芯片上电后从何处读取可执行代码运行,STM32F0系列MCU可以从Main flash memory、System memory、Embedded SRAM三个地方boot。

2023-09-27 14:21:56

STM32F0系列MCU硬件电路外设设计

STM32F0系列MCU的I2C和SPI是板子上芯片之间最常用的通信方式,I2C有SDA和SCL两个信号构成,电路设计非常简单。

2023-09-27 11:08:28

STM32F0—电源控制

电子发烧友网站提供《STM32F0—电源控制.pdf》资料免费下载

资料下载 佚名 2023-07-31 14:56:44

AN5145_从STM32F0系列到 STM32G0 系列的应用移手册

AN5145_从STM32F0系列到 STM32G0 系列的应用移手册

资料下载 李舒桀 2022-11-21 17:06:47

stm32f0 discovery开发包

stm32f0 discovery开发包分享

资料下载 luolinbo 2022-09-07 15:30:33

STM32F0系列单片机AD封装库下载

STM32F0系列单片机AD封装库下载

资料下载 禹_80b 2022-01-04 10:46:26

STM32F0—电源控制

STM32F0—电源控制(开关电源技术与设计 潘永雄pdf)-电源控制 PWR

资料下载 佚名 2021-09-29 18:29:34

为什么STM32F0系列芯片里面没有VTOR

为什么基于STM32G0、STM32L0系列芯片里有VTOR而STM32F0系列又没有? 用过

2023-09-09 15:40:36

STM32F0 HAL_CAN_ActivateNotification如何设置一个接收中断的hal?

函数一起使用。不幸的是,没有人描述如何做到这一点。事实上,如果我在 HAL 手册 (um1785) 中搜索“HAL_CAN_ActivateNotification”,我会得到 0 个结果。看起来

2022-12-26 08:18:47

【产品推荐】STM32F0 入门级 Arm® Cortex®-M0+ MCU

070超值系列MCU。 STM32F0x1系列实现了高度的功能集成,适合各类存储器空间及封装,为成本敏感型应用带来了灵活性。 STM32F0x2系列通过无晶振USB 2.0和

2022-11-14 14:05:49

STM32F0产品列表分享

STM32F0产品列表

2021-02-02 06:09:33

一文分析基于STM32F0的SPI通信FLASH程序

基于STM32F0的SPI通信的FLASH程序分析

2020-12-24 06:09:41

基于STM32F0的适配器电路设计方案

的产品的每秒帧数还高很多。 原文标题:基于STM32F0的USB-CAN适配器电路设计方案(pcb+源码) 文章出处:【微信公众号:电路设计技能】欢迎添加关注!文章转载请注明出处。 责任编辑:haq

2020-10-23 10:19:49

STM32F0STM32F1差异

了更加灵活的选择。 STM32F0x2系列微控制器通过无晶振USB 2.0和CAN总线接口提供了丰富的通信接口,使它成为

2019-08-02 21:46:47

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