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 主动写入邮箱,接收侧则依赖硬件滤波器自动完成报文筛选,无需 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主动)
- 邮箱选择:CPU 查询 CAN_TSR 寄存器获取空闲邮箱索引(TME=1)。
- 报文写入:将 ID、DLC、数据写入对应 CAN_TIxR / CAN_TDTxR / CAN_TDLxR。
- 发送请求:置位 CAN_TIxR 的 TXRQ 位,硬件自动将报文移入发送移位寄存器。
- 仲裁与发送:bxCAN 按邮箱优先级(邮箱号越小优先级越高)参与 CAN 总线仲裁。
- 完成通知:发送成功后硬件置位 CAN_TSR 的 RQCPx 位,可触发发送中断。
3.3.2 接收流程(硬件被动)
- 帧起始检测:CAN 协议控制器检测到总线 SOF 信号,开始接收位流。
- ID 接收与滤波:硬件接收完 11 位或 29 位标识符后,立即与 28 个滤波器组并行比较。
- FIFO 入队:匹配成功的报文自动存入 Rx FIFO 0 或 Rx FIFO 1(由滤波器目标 FIFO 决定)。
- 中断触发:FIFO 非空时,硬件置位 CAN_RFxR 的 FMPx 位,若使能则触发接收中断。
- CPU 读取:中断服务函数中读取 CAN_RIxR / CAN_RDTxR / CAN_RDLxR 获取报文。
常见误区:初学者常误以为滤波是在报文完全接收后才进行。实际上,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 模块),可用于报文延迟测量。