3. MCU CAN控制器外设概述:以STM32 bxCAN为例介绍硬件模块

在嵌入式系统中,CAN控制器是连接MCU核心与CAN物理总线的关键硬件单元。STM32系列MCU集成的bxCAN(Basic Extended CAN)模块,以其高集成度、灵活的消息过滤机制和低功耗设计,成为工业控制与车载通信中最广泛使用的CAN外设之一。本节将深入剖析bxCAN的硬件架构、核心寄存器组及报文处理流程,为后续中断驱动与ID过滤优化奠定硬件基础。

3.1 bxCAN整体架构与核心组件

bxCAN模块由CAN协议控制器、发送引擎、接收引擎、验收滤波器组以及寄存器接口五大部分组成。其内部数据流遵循“CPU配置→报文封装→仲裁发送/硬件过滤接收”的闭环路径。

bxCAN 内部硬件架构框图 CPU 总线接口 (APB1) 控制寄存器组 (CAN_MCR / CAN_MSR / CAN_BTR) 发送邮箱 (Tx Mailbox) 3个邮箱 · 优先级仲裁 接收 FIFO (Rx FIFO 0/1) 深度3 · 硬件FIFO 验收滤波器组 (Filter Bank ×28) CAN协议控制器 (位时序/CRC/错误管理) CAN_TX / CAN_RX → 收发器 (外部CAN收发器)
架构要点:bxCAN 的发送与接收路径在硬件上完全独立。发送侧由 CPU 主动写入邮箱,接收侧则依赖硬件滤波器自动完成报文筛选,无需 CPU 逐帧干预——这正是中断模式下实现高效接收的硬件基础。

3.2 核心寄存器组与功能映射

bxCAN 的寄存器按功能划分为控制/状态、发送、接收、滤波和测试五大类。下表列出驱动开发中最常操作的寄存器及其作用:

寄存器组 寄存器名称 偏移地址 核心功能
控制与状态 CAN_MCR 0x00 主控制:睡眠/初始化/自动唤醒/时间触发模式使能
CAN_MSR 0x04 主状态:初始化完成/睡眠/错误/中断标志
CAN_BTR 0x0C 位时序配置:BRP/TS1/TS2/SJW,决定波特率
发送 CAN_TIxR (x=0..2) 0x180 + 0x10*x 发送邮箱标识符寄存器:ID/IDE/RTR/发送请求
CAN_TDTxR 0x184 + 0x10*x 发送邮箱数据长度与时间戳
接收 CAN_RIxR (x=0..1) 0x1B0 + 0x20*x 接收 FIFO 标识符寄存器:接收到的 ID/IDE/RTR
CAN_RDTxR 0x1B4 + 0x20*x 接收 FIFO 数据长度与时间戳
滤波 CAN_FMxR (x=0..1) 0x200 + 0x04*x 滤波器模式寄存器:标识符列表模式/掩码模式
CAN_FxR1/FxR2 0x240 + 0x08*x 滤波器组 x 的标识符/掩码寄存器(32位或16位)
驱动开发关键:滤波寄存器组(CAN_FxR1/FxR2)是 ID 过滤优化的核心战场。通过配置 28 个滤波器组为掩码模式或列表模式,可以在硬件层面实现白名单/黑名单过滤,大幅减少 CPU 中断响应次数。

3.3 报文发送与接收硬件流程

bxCAN 的报文收发由硬件状态机自动完成,CPU 仅需配置邮箱和响应中断。以下流程对比了发送与接收的硬件行为:

3.3.1 发送流程(CPU主动)

  1. 邮箱选择:CPU 查询 CAN_TSR 寄存器获取空闲邮箱索引(TME=1)。
  2. 报文写入:将 ID、DLC、数据写入对应 CAN_TIxR / CAN_TDTxR / CAN_TDLxR。
  3. 发送请求:置位 CAN_TIxR 的 TXRQ 位,硬件自动将报文移入发送移位寄存器。
  4. 仲裁与发送:bxCAN 按邮箱优先级(邮箱号越小优先级越高)参与 CAN 总线仲裁。
  5. 完成通知:发送成功后硬件置位 CAN_TSR 的 RQCPx 位,可触发发送中断。

3.3.2 接收流程(硬件被动)

  1. 帧起始检测:CAN 协议控制器检测到总线 SOF 信号,开始接收位流。
  2. ID 接收与滤波:硬件接收完 11 位或 29 位标识符后,立即与 28 个滤波器组并行比较。
  3. FIFO 入队:匹配成功的报文自动存入 Rx FIFO 0 或 Rx FIFO 1(由滤波器目标 FIFO 决定)。
  4. 中断触发:FIFO 非空时,硬件置位 CAN_RFxR 的 FMPx 位,若使能则触发接收中断。
  5. CPU 读取:中断服务函数中读取 CAN_RIxR / CAN_RDTxR / CAN_RDLxR 获取报文。
硬件接收过滤与中断触发流程 CAN 总线报文到达 协议控制器接收 ID 28 个滤波器组并行比较 掩码模式 / 列表模式 丢弃 · 无中断 存入 Rx FIFO 触发接收中断 (FMP) 硬件零等待过滤 CPU 不参与比较
常见误区:初学者常误以为滤波是在报文完全接收后才进行。实际上,bxCAN 在接收完标识符字段后立即启动硬件比较,若未命中滤波器,后续数据场将直接被硬件丢弃,不会占用 FIFO 空间。这一特性使得滤波器配置直接影响系统实时性。

3.4 滤波器组配置模式详解

bxCAN 提供 28 个滤波器组(编号 0~27),每个组可独立配置为以下两种模式之一:

模式 位宽 寄存器使用 过滤逻辑 适用场景
标识符列表模式 32位 或 16位 FxR1 = ID1, FxR2 = ID2 报文 ID 必须精确等于 ID1 或 ID2 之一 白名单:只接收少数固定 ID
掩码模式 32位 或 16位 FxR1 = ID, FxR2 = Mask 报文 ID & Mask == ID & Mask 范围过滤:接收一组连续或带通配符的 ID

在 32 位模式下,每个滤波器组可过滤 1 个标准帧(11 位 ID)或 1 个扩展帧(29 位 ID);在 16 位模式下,每个滤波器组可过滤 2 个标准帧。驱动开发中,通常将滤波器组 0~13 分配给 Rx FIFO 0,组 14~27 分配给 Rx FIFO 1,实现多优先级接收通道。

3.5 中断事件与向量映射

bxCAN 共有 4 个独立的中断向量,分别对应发送、接收 FIFO 0、接收 FIFO 1 和错误/状态变化。下表列出各中断的触发条件与典型用途:

中断向量 使能位 触发条件 典型用途
CAN_TX CAN_IER.TMEIE 任意发送邮箱变为空闲 发送完成回调,释放邮箱
CAN_RX0 CAN_IER.FMPIE0 Rx FIFO 0 非空(FMP0 > 0) 高优先级报文接收
CAN_RX1 CAN_IER.FMPIE1 Rx FIFO 1 非空(FMP1 > 0) 低优先级或诊断报文接收
CAN_SCE CAN_IER.ERRIE / BOFFIE / LECIE 总线错误、被动错误、离线、错误状态变化 错误恢复与总线监控
中断优先级设计建议:在中断模式驱动中,建议将 CAN_RX0 设置为最高优先级(如 NVIC 优先级 0),确保关键控制报文不被延迟;CAN_SCE 设置为中等优先级;CAN_TX 和 CAN_RX1 可设置为较低优先级。这种分级策略与后续 ID 过滤优化结合,可实现确定性延迟的 CAN 通信。

3.6 硬件特性总结与驱动影响

bxCAN 的硬件设计对驱动开发有以下直接影响:

  • 邮箱数量有限:3 个发送邮箱意味着高负载下需要合理管理发送队列,避免邮箱耗尽。
  • FIFO 深度固定:每个 Rx FIFO 深度为 3,若中断响应不及时可能造成溢出(FOVR 标志置位)。
  • 滤波器组共享:28 个滤波器组在初始化时一次性配置,运行时修改需进入初始化模式(CAN_MCR.INRQ=1),影响总线通信连续性。
  • 硬件时间戳:bxCAN 在接收/发送完成时自动捕获定时器值(需配合 TIM 模块),可用于报文延迟测量。