
STM32F1 芯片自带 bxCAN 控制器 (Basic Extended CAN),即基本扩展 CAN,可与 CAN 网络进行交互,它支持 2.0A 和 B 版本的 CAN 协议。旨在以最少的CPU 负载高效管理大量的传入消息,并可按需要的优先级实现消息发送。在攸关安全性的应用中,CAN 控制器提供所有必要的硬件功能来支持 CAN 时间触发通信方案。 STM32F1 的 bxCAN 的主要特性有: ·支持 CAN 协议 2.0A 和 2.0B 主动模式 ·波特率最高达 1Mbps ·支持时间触发通信 ·具有 3 个发送邮箱 ·具有 3 级深度的 2 个接收 FIFO ·可变的过滤器组( 互联网产品中有 28 个, CAN1 和 CAN2 共享,其他STM32F103xx 有 14 个) 我们使用的 STM32F103ZET6自带 1 个 CAN 控制器,而 STM32F105/STM32F107互联网型含有 2 个 CAN 控制器,互联网型只是比 STM32F103 多一个而已。下面我们就来看下互联网型它内部结构,如下图所示: ![]() 从CAN 内部结构图可以看出,CAN1 是主设备,CAN2 是从设备。框图中的“存储访问控制器”是由 CAN1 控制的,CAN2 无法直接访问存储区域,所以如果使用 CAN2 的时候必须先使能CAN1 外设的时钟,我们使用的 STM32F103ZET6只含有 CAN1。框图中主要包含 CAN 控制内核、发送邮箱、接收 FIFO 以及验收筛选器,下面我们就依次进行简单介绍。 (1)标号 1:CAN 控制内核 CAN 控制内核包含了各种控制/状态寄存器,我们主要讲解其中的主控制寄存器 CAN_MCR 及位时序寄存器 CAN_BTR。 ①控制寄存器 CAN_MCR主控制寄存器 CAN_MCR 负责管理 CAN 的工作模式,寄存器如下: ![]() ②位时序寄存器(CAN_BTR) CAN 外设中的位时序寄存器 CAN_BTR 用于配置测试模式、波特率以及各种位内的段参数。该寄存器如下: ![]() 1.测试模式 为方便调试,STM32 的 CAN 提供了测试模式,配置位时序寄存器 CAN_BTR的 SILM 及 LBKM 寄存器位可以控制使用正常模式、静默模式、回环模式及静默回环模式。下面我们就来介绍下这几种工作模式: A.正常模式一旦初始化完成,软件必须向硬件请求进入正常模式,这样才能在 CAN 总线上进行同步,并开始接收和发送。进入正常模式的请求可通过将 CAN_MCR 寄存器的 INRQ 位清零来发出。 bxCAN 进入正常模式,并与 CAN 总线上的数据传输实现同步后,即可参与总线活动。执行这一步时,需要等待出现一个由 11 个连续隐性位(总线空闲状态)组成的序列。硬件通过将 CAN_MSR 寄存器的 INAK 位清零,来确认切换到正常模式。 B.静默模式可以通过将 CAN_BTR 寄存器的 SILM 位置 1,将 bxCAN 置于静默模式。在静默模式下, bxCAN 可以接收有效数据帧和有效遥控帧,但仅在 CAN 总线上发送隐性位,并且无法启动发送。如果 bxCAN 必须发送一个显性位( ACK 位、溢出标志、活动错误标志),该位将在内部被改道发送,以便 CAN 内核可以监视该显性位,但 CAN 总线可以保持隐性状态。静默模式可用于分析 CAN 总线上的流量,同时又不会因发送显性位(确认位、错误帧)对其造成影响。该模式下的bxCAN如下: ![]() C.回环模式 可以通过将 CAN_BTR 寄存器的 LBKM 位置 1,将 bxCAN 置于环回模式。在环回模式下,bxCAN 将其自身发送的消息作为接收的消息来处理并存储(如果这些消息通过了验收筛选)在接收邮箱中。该模式下的 bxCAN 如下: 该模式为自检功能提供。为了不受外部事件的影响, CAN 内核在环回模式 下将忽略确认错误(在数据/远程帧的确认时隙不对显性位采样)。在此模式下,bxCAN 将执行从发送输出到接收输入的内部反馈。bxCAN 将忽略 CANRX 输入引脚的实际值。从 CANTX 引脚可以监视发送的消息。 D.静默回环模式可以通过将 CAN_BTR 寄存器的 LBKM 和 SILM 位置 1,将环回模式和静默模式组合起来。该模式可用于“热自检”,也就是说, bxCAN 可以像在环回模式下一样进行检测, 同时又不会影响与 CANTX 和 CANRX 引脚相连接的运行中的CAN 系统。在此模式下, CANRX 引脚与 bxCAN 断开连接, CANTX 引脚则保持隐性。该模式下的 bxCAN如下: ![]() 上述说的各个模式,是不需要修改硬件接线的,如当输出直连输入时,它是在 STM32F1 芯片内部连接的,传输路径不经过 STM32 的 CAN_Tx/Rx 引脚,更不经过外部连接的 CAN 收发器,只有输出数据到总线或从总线接收的情况下才会经过 CAN_Tx/Rx 引脚和收发器。 2.位时序及波特率 STM32F1 的 CAN 控制器定义的位时序与前面我们介绍的 CAN 标准位时序有一点区别,STM32F1 把传播时间段和相位缓冲段 1( STM32F1 称之为位段 1)合并了, 所以 STM32F1 的 CAN 一个位只有 3 段。分别是:同步段 (SYNC_SEG)、位段 1 (BS1)、位段 2 (BS2)。STM32F1 的 CAN 的位时序如下图所示: ![]() 这三段的工作过程如下: ● 同步段 (SYNC_SEG):位变化应该在此时间段内发生。它只有一个时间片 的固定长度(1 x tCAN)。 ● 位段 1 (BS1):定义采样点的位置。它包括 CAN 标准的 PROP_SEG 和 PHASE_SEG1。其持续长度可以在 1 到 16 个时间片之间调整(刚好等于我们前面介绍的传播时间段和相位缓冲段 1 之和),但也可以自动加长,以补偿不同网络节点的频率差异所导致的正相位漂移。 ● 位段 2 (BS2):定义发送点的位置。它代表 CAN 标准的 PHASE_SEG2。 其持续长度可以在 1 到 8 个时间片之间调整,但也可以自动缩短,以补偿负相位漂移。 了解了 STM32F1 的 CAN的位时序后,我们就可以配置波特率了。通过配置位时序寄存器 CAN_BTR(为了避免编程错误,位时序寄存器 (CAN_BTR) 只能在器件处于待机模式时进行配置) 的 TS1[3:0]及 TS2[2:0]寄存器位设定 BS1 及BS2 段的长度后,我们就可以非常方便的计算 CAN 通信波特率,计算公式如下: ![]() 其中的 tPCLK 指 APB1 时钟,默认值为 36MHz,现在我们只要知道 BS1 和BS2 的设置值就可以计算出波特率。比如设置 TS1=7、 TS2=8 和 BRP=3, 在 APB1频率为 36Mhz 的条件下,即可得到 CAN 通信的波特率 BoundRate=36000/[(8+9+1)*4]=500Kbps。 (2)标号 2:发送邮箱 在STM32F1 的 CAN 结构框图中,标号 2 是 CAN 的发送邮箱,它含有 3个发送邮箱,软件可通过三个发送邮箱设置消息。发送调度程序负责决定首先发送哪个邮箱的内容。CAN 邮箱寄存器可在中文参考手册查找。 (3)标号 3:验收筛选器 互联网型产品的 bxCAN 提供了 28 个可调整/可配置的标识符筛选器组,我们使用的 STM32F103ZET6 只有 14 个,用于选择软件所需的传入消息并丢弃其余消息。每个筛选器组由 2 个 32 为寄存器,CAN_FxR1 和 CAN_FxR2 组成。 为了根据应用程序的需求来优化和调整筛选器, 每个筛选器组可分别进行伸缩调整。根据筛选器尺度不同,一个筛选器组可以: ● 为 STDID[10:0]、 EXTID[17:0]、 IDE 和 RTR 位提供一个 32 位筛选 器。 ● 为 STDID[10:0]、 RTR、 IDE 和 EXTID[17:15] 位提供两个 16 位筛选 器。 此外,筛选器还可配置为掩码模式或标识符列表模式。 在掩码模式下,标识符寄存器与掩码寄存器关联,用以指示标识符的哪些位“必须匹配”,哪些位“无关”。而在标识符列表模式下,掩码寄存器用作标识 符寄存器。这时,不会定义一个标识符和一个掩码,而是指定两个标识符,从而使单个标识符的数量加倍。传入标识符的所有位都必须与筛选器寄存器中指定的位匹配。 通过 CAN_FMR 寄存器,可以配置过筛选器组的位宽和工作模式,如下图所示。 ![]() 为了过滤出一组标识符,应该设置筛选器组工作在掩码模式。 为了过滤出一个标识符,应该设置筛选器组工作在标识符列表模式。 应用程序不用的过滤器组,应该保持在禁用状态。 筛选器组中的每个筛选器, 都被编号为(叫做筛选器号, 上图中的 n)从 0 开始,到某个最大数值-取决于筛选器组的模式和位宽的设置。 举个简单的例子,我们设置筛选器组 0 工作在:1 个 32 位筛选器-标识 符掩码模式,然后设置 CAN_F0R1=0XFFFF0000, CAN_F0R2=0XFF00FF00。其中存放 到 CAN_F0R1 的 值 就 是 期 望 收 到 的 ID , 即 我 们 希 望 收 到 的 ID( STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而 0XFF00FF00 就是设置我们需要必须关心的 ID,表示收到的 ID,其位[31:24]和位[15:8]这 16 个位的必须和 CAN_F0R1 中对应的位一模一样,而另外的 16 个位则不关心,可以一样,也可以不一样,都认为是正确的 ID,即收到的 ID 必须是 0XFFxx00xx,才算是正确的( x 表示不关心)。 (4)标号 4:CAN 接收FIFO 硬件使用两个接收 FIFO 来存储传入消息。每个 FIFO 中有三个邮箱用于存储三条完整消息。FIFO 完全由硬件管理。 FIFO 开始时处于空状态,在接收的第一条有效消息存储在其中后,变为 Pending_1 状态。硬件通过将 CAN_RFR 寄存器的 FMP[1:0] 位置为 01b 来指示该事件。消息将在 FIFO 输出邮箱中供读取。软件将读取邮箱内容,并通过将CAN_RFR 寄存器的 RFOM 位置 1,来将邮箱释放。FIFO 随即恢复空状态。如果同时接收到新的有效消息, FIFO 将保持 Pending_1 状态,新消息将在输出邮箱中供读取。 如果应用程序未释放邮箱,下一条有效消息将存储在 FIFO 中,使其进入 Pending_2 状态(FMP[1:0] = 10b)。下一条有效消息会重复该存储过程,同时将FIFO 变为 Pending_3 状态(FMP[1:0] = 11b)。此时,软件必须通过将 RFOM 位置 1 来释放输出邮箱,从而留出一个空邮箱来存储下一条有效消息。否则,下一次接收到有效消息时,将导致消息丢失。 一旦 FIFO 处于 Pending_3 状态(即三个邮箱均已满),则下一次接收到 有效消息时,将导致上溢并丢失一条消息。硬件通过将 CAN_RFR 寄存器的 FOVR位置 1 来指示上溢状况。丢失的消息取决于 FIFO 的配置: ● 如果禁止 FIFO 锁定功能( CAN_MCR 寄存器的 RFLM 位清零),则新传 入的消息将覆盖 FIFO 中存储的最后一条消息。在这种情况下,应用程序将始终能访问到最新的消息。 ● 如果使能 FIFO 锁定功能( CAN_MCR 寄存器的 RFLM 位置 1),则将丢 弃最新的消息,软件将提供 FIFO 中最早的三条消息。 消息存储到 FIFO 中后,FMP[1:0] 位即会更新,如果 CAN_IER 寄存器的 FMPIE 位置 1,将 产生中断请求。FIFO 存满消息(即存储了第三条消息)后,CAN_RFR 寄存器的 FULL 位置 1,如果 CAN_IER 寄存器的 FFIE 位置 1,将产生中断。出现上溢时,FOVR 位将置 1, 如果 CAN_IER 寄存器的 FOVIE 位置 1,将产生中断。 (5)标号 5:CAN2整体控制逻辑 CAN2与CAN1是一样的, 它们共用验收筛选器且由于存储访问控制器由 CAN1控制,所以要使用 CAN2 的时候必须要使能 CAN1 的时钟。 由于篇幅限制,并没有对 STM32F1 的 CAN 相关寄存器进行介绍,大家可 以参考《STM32F10x 中文参考手册》-22 控制器区域网络(bxCAN)章节,里面有详细的讲解。CAN 总线内部还是比较复杂的,如果看不懂的可以暂时放下,因为我们使用的是库函数开发,只需简单配置下即可使用。 |
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南