news 2026/6/8 20:15:52

STM32_CAN

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32_CAN
简介

CAN(Controller Area Network,控制器局域网)是一种多主方式的串行通信总线,最初由Bosch公司为汽车电子系统开发,现已广泛应用于工业自动化、医疗设备、航空航天等领域。CAN总线具有高可靠性、实时性强、抗干扰能力强等优点,特别适合在恶劣环境下进行多节点通信。STM32F407 系列芯片提供了 2 个 CAN 接口(CAN1、CAN2),支持 CAN 2.0A 和 CAN 2.0B 协议,支持标准和扩展帧格式,可连接多个 CAN 设备。本文从 CAN 的基本原理出发,详细讲解 STM32F407 CAN 的配置方法、代码实现、通信协议以及实际应用案例,帮助你快速掌握 CAN 通信技术。

一、CAN核心概念与分类
1.1 基本概念

CAN 是一种多主方式的串行通信总线,其主要特点包括:

  • 多主架构:所有节点都可以主动发送数据
  • 仲裁机制:当多个节点同时发送数据时,通过仲裁机制决定总线控制权
  • 错误检测:内置CRC校验、位错误检测、帧错误检测等多种错误检测机制
  • 高可靠性:具有自动重发、错误隔离等功能,通信可靠性高
  • 实时性强:支持优先级仲裁,高优先级消息优先传输

关键参数

  • 波特率:每秒传输的二进制位数,常见值有 125kbps、250kbps、500kbps、1Mbps 等
  • 帧格式:标准帧(11位ID)和扩展帧(29位ID)
  • 数据长度:每个数据帧可传输 0-8 字节数据
  • 验收滤波:通过验收滤波器过滤不需要的消息
1.2 STM32F407 的 CAN 资源

STM32F407 系列芯片提供了 2 个 CAN 接口(CAN1、CAN2):

CAN引脚最大通信速率适用场景
CAN1PA11(RX), PA12(TX) 或 PD0(RX), PD1(TX)1Mbps主要CAN接口
CAN2PB5(RX), PB6(TX) 或 PB12(RX), PB13(TX)1Mbps辅助CAN接口

关键特性

  • 支持 CAN 2.0A 和 CAN 2.0B 协议
  • 支持标准和扩展帧格式
  • 支持 0-8 字节数据长度
  • 支持 2 个验收滤波器组(CAN1)或 4 个验收滤波器组(CAN2)
  • 支持 DMA 传输
  • 支持时间触发通信
  • 支持总线错误管理
二、CAN通信协议
2.1 帧格式

CAN 总线支持两种帧格式:

标准帧(11位ID)

  1. 帧起始:1 位,显性电平
  2. 仲裁场:12 位(11 位 ID + 1 位 RTR)
  3. 控制场:6 位(IDE 位 + 保留位 + DLC)
  4. 数据场:0-64 位(0-8 字节数据)
  5. CRC 场:16 位(15 位 CRC + 1 位 CRC 界定符)
  6. ACK 场:2 位(ACK 槽 + ACK 界定符)
  7. 帧结束:7 位,隐性电平

扩展帧(29位ID)

  1. 帧起始:1 位,显性电平
  2. 仲裁场:32 位(11 位基础 ID + 1 位 SRR + 1 位 IDE + 18 位扩展 ID + 1 位 RTR)
  3. 控制场:6 位(保留位 + DLC)
  4. 数据场:0-64 位(0-8 字节数据)
  5. CRC 场:16 位(15 位 CRC + 1 位 CRC 界定符)
  6. ACK 场:2 位(ACK 槽 + ACK 界定符)
  7. 帧结束:7 位,隐性电平
2.2 仲裁机制

CAN 总线采用基于消息优先级的仲裁机制:

仲裁原理

  • 当多个节点同时发送数据时,通过仲裁场决定总线控制权
  • ID 值越小,优先级越高
  • 如果某个节点发送的位与总线状态不一致,则该节点停止发送,变为接收状态
  • 最终优先级最高的节点获得总线控制权

示例

  • 节点 A 发送 ID = 0x123
  • 节点 B 发送 ID = 0x456
  • 节点 C 发送 ID = 0x789
  • 由于 0x123 < 0x456 < 0x789,节点 A 的优先级最高,获得总线控制权
2.3 错误检测与处理

CAN 总线具有多种错误检测机制:

错误类型

  • 位错误:发送的位与总线状态不一致
  • 格式错误:帧格式不符合规范
  • ACK 错误:发送节点未收到 ACK 槽
  • CRC 错误:CRC 校验失败
  • 填充错误:位填充错误

错误处理

  • 主动错误状态:节点正常工作,可以发送和接收数据
  • 被动错误状态:节点检测到错误,但仍可以接收数据
  • 总线关闭状态:节点检测到严重错误,停止发送数据
三、CAN配置与代码实现
3.1 标准库配置步骤

以 CAN1 为例,使用标准库配置 CAN 的基本步骤:

  1. 使能 CAN 时钟和 GPIO 时钟
  2. 配置 GPIO 为复用功能
  3. 配置 CAN 基本参数(波特率、工作模式等)
  4. 配置验收滤波器
  5. 使能 CAN
  6. 配置中断(可选)
3.2 代码实现(CAN1,500kbps)
#include"stm32f4xx.h"/** * @brief 初始化CAN1 * @param 无 * @retval 无 */voidCAN1_Init(void){GPIO_InitTypeDef GPIO_InitStructure;CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 1. 使能时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);// 2. 配置GPIOGPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);// 3. 将GPIO引脚连接到CAN1GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1);// RXGPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1);// TX// 4. 配置CAN1CAN_InitStructure.CAN_TTCM=DISABLE;// 时间触发通信模式CAN_InitStructure.CAN_ABOM=ENABLE;// 自动离线管理CAN_InitStructure.CAN_AWUM=ENABLE;// 自动唤醒模式CAN_InitStructure.CAN_NART=DISABLE;// 非自动重发CAN_InitStructure.CAN_RFLM=DISABLE;// 接收FIFO锁定模式CAN_InitStructure.CAN_TXFP=DISABLE;// 发送FIFO优先级CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;// 正常模式CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;// 重新同步跳转宽度CAN_InitStructure.CAN_BS1=CAN_BS1_6tq;// 时间段1CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;// 时间段2CAN_InitStructure.CAN_Prescaler=4;// 预分频系数CAN_Init(CAN1,&CAN_InitStructure);// 5. 配置验收滤波器CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 1:49:18

STM32_RTC

简介 RTC(Real-Time Clock,实时时钟)是单片机中用于提供精确时间计时的外设,广泛应用于需要时间记录、定时任务、日历功能等场景。STM32F407 系列芯片集成了一个独立的 RTC 模块,具有独立的 32.768kHz 低速振荡器(LSE),支持年、月、日、星期、时、分、秒的计时功能,并…

作者头像 李华
网站建设 2026/6/9 1:11:07

告别语言障碍:游戏本地化工具让Honey Select 2体验焕新

告别语言障碍&#xff1a;游戏本地化工具让Honey Select 2体验焕新 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为Honey Select 2游戏中的日文界面而头疼…

作者头像 李华
网站建设 2026/6/9 2:08:41

安卓文件转换工具新手必知:XAPK转APK完全指南

安卓文件转换工具新手必知&#xff1a;XAPK转APK完全指南 【免费下载链接】xapk-to-apk A simple standalone python script that converts .xapk file into a normal universal .apk file 项目地址: https://gitcode.com/gh_mirrors/xa/xapk-to-apk 你是否遇到过下载安…

作者头像 李华
网站建设 2026/6/9 1:35:57

PyTorch-2.x-Universal-Dev-v1.0真实案例:快速完成数据清洗

PyTorch-2.x-Universal-Dev-v1.0真实案例&#xff1a;快速完成数据清洗 1. 为什么数据清洗是模型训练前最关键的一步 你有没有遇到过这样的情况&#xff1a;花了一整天调参&#xff0c;模型却始终不收敛&#xff1b;或者训练结果看起来不错&#xff0c;但一到真实数据上就完全…

作者头像 李华
网站建设 2026/6/9 1:02:16

3个革命性的英雄联盟智能辅助功能:从新手到高手的全面体验升级

3个革命性的英雄联盟智能辅助功能&#xff1a;从新手到高手的全面体验升级 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 核心价…

作者头像 李华
网站建设 2026/6/3 11:45:21

SenseVoice Small企业私有化部署教程:内网隔离环境下的稳定运行方案

SenseVoice Small企业私有化部署教程&#xff1a;内网隔离环境下的稳定运行方案 1. 为什么企业需要私有化部署SenseVoice Small 很多团队在尝试用SenseVoice Small做语音转写时&#xff0c;第一反应是“这模型真快”&#xff0c;但很快就会卡在部署环节&#xff1a;报错No mo…

作者头像 李华