STM32 的 CAN 外设简介
STM32 的芯片中具有 bxCAN 控制器 (Basic Extended CAN),它支持 CAN 协议 2.0A 和2.0B 标准。
该 CAN 控制器支持最高的通讯速率为 1Mb/s;可以自动地接收和发送 CAN 报文,支持使用标准 ID 和扩展 ID 的报文;外设中具有 3 个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间;具有 2 个 3 级深度的接收 FIFO,可使用过滤功能只接收或不接收某些 ID 号的报文;可配置成自动重发;不支持使用 DMA 进行数据收发。
STM32 的 CAN 架构剖析
STM32 的有两组 CAN 控制器,其中 CAN1 是主设备,框图中的“存储访问控制器”是由 CAN1 控制的,CAN2 无法直接访问存储区域,所以使用 CAN2 的时候必须使能CAN1 外设的时钟。
1. CAN 控制内核
框图中标号① 处的 CAN 控制内核包含了各种控制寄存器及状态寄存器,主要讲解其中的主控制寄存器 CAN_MCR 及位时序寄存器 CAN_BTR。
①. 主控制寄存器 CAN_MCR
主控制寄存器 CAN_MCR 负责管理 CAN 的工作模式,它使用以下寄存器位实现控制。
a. DBF 调试冻结功能
DBF(Debug freeze)调试冻结,使用它可设置 CAN 处于工作状态或禁止收发的状态,禁止收发时仍可访问接收 FIFO 中的数据。这两种状态是当 STM32 芯片处于程序调试模式时才使用的,平时使用并不影响。
b. TTCM 时间触发模式
TTCM(Time triggered communication mode)时间触发模式,它用于配置 CAN 的时间触发通信模式,在此模式下,CAN 使用它内部定时器产生时间戳,并把它保存在CAN_RDTxR、CAN_TDTxR 寄存器中。内部定时器在每个 CAN 位时间累加,在接收和发送的帧起始位被采样,并生成时间戳。利用它可以实现 ISO 11898-4 CAN 标准的分时同步通信功能。
c. ABOM 自动离线管理
ABOM(Automatic bus-off management) 自动离线管理,它用于设置是否使用自动离线管理功能。当节点检测到它发送错误或接收错误超过一定值时,会自动进入离线状态,在离线状态中,CAN 不能接收或发送报文。处于离线状态的时候,可以软件控制恢复或者直接使用这个自动离线管理功能,它会在适当的时候自动恢复。
d. AWUM 自动唤醒
AWUM(Automatic bus-off management),自动唤醒功能,CAN 外设可以使用软件进入低功耗的睡眠模式,如果使能了这个自动唤醒功能,当 CAN 检测到总线活动的时候,会自动唤醒。
e. NART 自动重传
NART(No automatic retransmission)报文自动重传功能,设置这个功能后,当报文发送失败时会自动重传至成功为止。若不使用这个功能,无论发送结果如何,消息只发送一次。
f. RFLM 锁定模式
RFLM(Receive FIFO locked mode)FIFO 锁定模式,该功能用于锁定接收 FIFO。锁定后,当接收 FIFO 溢出时,会丢弃下一个接收的报文。若不锁定,则下一个接收到的报文会覆盖原报文。
g. TXFP 报文发送优先级的判定方法
TXFP(Transmit FIFO priority)报文发送优先级的判定方法,当 CAN 外设的发送邮箱中有多个待发送报文时,本功能可以控制它是根据报文的 ID 优先级还是报文存进邮箱的顺序来发送。
②. 位时序寄存器(CAN_BTR)及波特率
CAN 外设中的位时序寄存器 CAN_BTR 用于配置测试模式、波特率以及各种位内的段参数。
a. 测试模式
为方便调试,STM32 的 CAN 提供了测试模式,配置位时序寄存器 CAN_BTR 的 SILM及 LBKM 寄存器位可以控制使用正常模式、静默模式、回环模式及静默回环模式。
正常模式
正常模式下就是一个正常的 CAN 节点,可以向总线发送数据和接收数据。
静默模式
静默模式下,它自己的输出端的逻辑 0 数据会直接传输到它自己的输入端,逻辑1 可以被发送到总线,所以它不能向总线发送显性位(逻辑 0),只能发送隐性位(逻辑 1)。输入端可以从总线接收内容。
由于它只可发送的隐性位不会强制影响总线的状态,所以把它称为静默模式。这种模式一般用于监测,它可以用于分析总线上的流量,但又不会因为发送显性位而影响总线。
回环模式
回环模式下,它自己的输出端的所有内容都直接传输到自己的输入端,输出端的内容同时也会被传输到总线上,即也可使用总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。使用回环模式可以进行自检。
回环静默模式
回环静默模式是以上两种模式的结合,自己的输出端的所有内容都直接传输到自己的输入端,并且不会向总线发送显性位影响总线,不能通过总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。这种方式可以在“热自检”时使用,即自我检查的时候,不会干扰总线。
以上说的各个模式,是不需要修改硬件接线的,如当输出直连输入时,它是在 STM32芯片内部连接的,传输路径不经过 STM32 的 CAN_Tx/Rx 引脚,更不经过外部连接的 CAN收发器,只有输出数据到总线或从总线接收的情况下才会经过 CAN_Tx/Rx 引脚和收发器。
b. 位时序及波特率
STM32 外设定义的位时序与我们前面解释的 CAN 标准时序有一点区别:
STM32 的 CAN 外设位时序中只包含 3 段,分别是同步段 SYNC_SEG、位段 BS1 及位段 BS2,采样点位于 BS1 及 BS2 段的交界处。
其中 SYNC_SEG 段固定长度为 1Tq,而BS1 及 BS2 段可以在位时序寄存器 CAN_BTR 设置它们的时间长度,它们可以在重新同步期间增长或缩短,该长度 SJW 也可在位时序寄存器中配置。
理解 STM32 的 CAN 外设的位时序时,可以把它的 BS1 段理解为是由前面介绍的CAN 标准协议中 PTS 段与 PBS1 段合在一起的,而 BS2 段就相当于 PBS2 段。
了解位时序后,我们就可以配置波特率了。通过配置位时序寄存器 CAN_BTR 的TS1[3:0]及 TS2[2:0]寄存器位设定 BS1 及 BS2 段的长度后,我们就可以确定每个 CAN 数据位的时间:
BS1 段时间:
TS1=Tq x (TS1[3:0] + 1)
BS2 段时间:
TS2= Tq x (TS2[2:0] + 1)
一个数据位的时间:
T1bit =1Tq+TS1+TS2 =1+ (TS1[3:0] + 1)+ (TS2[2:0] + 1)= N Tq
其中单个时间片的长度 Tq 与 CAN 外设的所挂载的时钟总线及分频器配置有关,CAN1 和 CAN2 外设都是挂载在 APB1 总线上的,而位时序寄存器 CAN_BTR 中的 BRP[9:0]寄存器位可以设置 CAN 外设时钟的分频值 ,所以:
Tq = (BRP[9:0]+1) x TPCLK
其中的 PCLK 指 APB1 时钟,默认值为 45MHz。
最终可以计算出 CAN 通讯的波特率:
BaudRate = 1/N Tq
例如将波特率配置为1Mbps 的方式:
2. CAN 发送邮箱
外设框图中标号② 处的是 CAN 外设的发送邮箱,它一共有 3个发送邮箱,即最多可以缓存 3 个待发送的报文。
每个发送邮箱中包含有标识符寄存器 CAN_TIxR、数据长度控制寄存器 CAN_TDTxR及 2 个数据寄存器 CAN_TDLxR、CAN_TDHxR:
当我们要使用 CAN 外设发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并对标识符寄存器 CAN_TIxR 中的发送请求寄存器位 TMIDxR_TXRQ 置 1,即可把数据发送出去。
其中标识符寄存器 CAN_TIxR 中的 STDID 寄存器位比较特别。我们知道 CAN 的标准标识符的总位数为 11 位,而扩展标识符的总位数为 29 位的。当报文使用扩展标识符的时候,标识符寄存器 CAN_TIxR 中的 STDID[10:0]等效于 EXTID[18:28]位,它与 EXTID[17:0]共同组成完整的 29 位扩展标识符。
3. CAN 接收FIFO
外设框图中在标号③ 处的是 CAN 外设的接收 FIFO,它一共有 2 个接收 FIFO,每个 FIFO 中有 3 个邮箱,即最多可以缓存 6 个接收到的报文。当接收到报文时,FIFO 的报文计数器会自增,而 STM32 内部读取 FIFO 数据之后,报文计数器会自减,我们通过状态寄存器可获知报文计数器的值,而通过前面主控制寄存器的 RFLM 位,可设置锁定模式,锁定模式下 FIFO 溢出时会丢弃新报文,非锁定模式下 FIFO 溢出时新报文会覆盖旧报文。
跟发送邮箱类似,每个接收 FIFO 中包含有标识符寄存器 CAN_RIxR、数据长度控制寄存器 CAN_RDTxR 及 2 个数据寄存器 CAN_RDLxR、CAN_RDHxR:
通过中断或状态寄存器知道接收 FIFO 有数据后,我们再读取这些寄存器的值即可把接收到的报文加载到 STM32 的内存中。
4. 验收筛选器
外设框图中在标号④ 处的是 CAN 外设的验收筛选器,一共有 28 个筛选器组,每个筛选器组有 2 个寄存器,CAN1 和 CAN2 共用的筛选器的。
在 CAN 协议中,消息的标识符与节点地址无关,但与消息内容有关。因此,发送节点将报文广播给所有接收器时,接收节点会根据报文标识符的值来确定软件是否需要该消息,为了简化软件的工作,STM32 的 CAN 外设接收报文前会先使用验收筛选器检查,只接收需要的报文到 FIFO 中。
筛选器工作的时候,可以调整筛选 ID 的长度及过滤模式。根据筛选 ID 长度来分类有有以下两种:
检查 STDID[10:0]、 EXTID[17:0]、 IDE 和 RTR 位,一共 31 位;
检查 STDID[10:0]、 RTR、 IDE 和 EXTID[17:15],一共 16 位。
通过配置筛选尺度寄存器 CAN_FS1R 的 FSCx 位可以设置筛选器工作在哪个尺度。而根据过滤的方法分为以下两种模式:
标识符列表模式。它把要接收报文的 ID 列成一个表,要求报文 ID 与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理;
掩码模式。它把可接收报文 ID 的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收 FIFO。
通过配置筛选模式寄存器 CAN_FM1R 的 FBMx 位可以设置筛选器工作在哪个模式。
不同的尺度和不同的过滤方法可使筛选器工作在图中的 4 种状态:
每组筛选器包含 2 个 32 位的寄存器,分别为 CAN_FxR1 和 CAN_FxR2,它们用来存储要筛选的 ID 或掩码,各个寄存器位代表的意义与图中两个寄存器下面“映射”的一栏一致,各个模式的说明见表:
例如下面的表格所示,在掩码模式时,第一个寄存器存储要筛选的 ID,第二个寄存器存储掩码,掩码为 1 的部分表示该位必须与 ID 中的内容一致,筛选的结果为表中第三行的ID 值,它是一组包含多个的 ID 值,其中 x 表示该位可以为 1 可以为 0。
而工作在标识符模式时,2 个寄存器存储的都是要筛选的 ID,它只包含 2 个要筛选的ID 值(32 位模式时)。
如果使能了筛选器,且报文的 ID 与所有筛选器的配置都不匹配,CAN 外设会丢弃该报文,不存入接收 FIFO。
5. 整体控制逻辑
结构框图中的标号⑤处表示的是 CAN2 外设的结构,它与 CAN1 外设是一样的,他们共用筛选器且由于存储访问控制器由 CAN1 控制,所以要使用 CAN2 的时候必须要使能 CAN1 的时钟。
CAN 初始化结构体
1. CAN_Prescaler
本成员设置 CAN 外设的时钟分频,它可控制时间片 Tq 的时间长度,这里设置的值最终会减 1 后再写入 BRP 寄存器位,即前面介绍的 Tq 计算公式:
Tq = (BRP[9:0]+1) x TPCLK
等效于:
Tq = CAN_Prescaler x TPCLK
2. CAN_Mode
本成员设置 CAN 的工作模式,可设置为正常模式(CAN_Mode_Normal)、回环模式(CAN_Mode_LoopBack)、静默模式(CAN_Mode_Silent)以及回环静默模式(CAN_Mode_Silent_LoopBack)
3. CAN_SJW
本成员可以配置 SJW 的极限长度,即 CAN 重新同步时单次可增加或缩短的最大长度,
它可以被配置为 1-4Tq(CAN_SJW_1/2/3/4tq)
4. CAN_BS1
本成员用于设置 CAN 位时序中的 BS1 段的长度,它可以被配置为 1-16 个 Tq 长度(CAN_BS1_1/2/3…16tq)
5. CAN_BS2
本成员用于设置 CAN 位时序中的 BS2 段的长度,它可以被配置为 1-8 个 Tq 长度(CAN_BS2_1/2/3…8tq)
SYNC_SEG、BS1 段及 BS2 段的长度加起来即一个数据位的长度,即前面介绍的原来计算公式:
T1bit =1Tq+TS1+TS2 =1+ (TS1[3:0] + 1)+ (TS2[2:0] + 1)
等效于:
T1bit = 1Tq+CAN_BS1+CAN_BS2
6. CAN_TTCM
本成员用于设置是否使用时间触发功能(ENABLE/DISABLE),时间触发功能在某些CAN 标准中会使用到。
7. CAN_ABOM
本成员用于设置是否使用自动离线管理(ENABLE/DISABLE),使用自动离线管理可以在节点出错离线后适时自动恢复,不需要软件干预。
8. CAN_ AWUM
本成员用于设置是否使用自动唤醒功能(ENABLE/DISABLE),使能自动唤醒功能后它会在监测到总线活动后自动唤醒。
9. CAN_NART
本成员用于设置是否使用自动重传功能(ENABLE/DISABLE),使用自动重传功能时,会一直发送报文直到成功为止。
10. CAN_RFLM
本成员用于设置是否使用锁定接收 FIFO(ENABLE/DISABLE),锁定接收 FIFO 后,若FIFO 溢出时会丢弃新数据,否则在 FIFO 溢出时以新数据覆盖旧数据。
11. CAN_TXFP
本成员用于设置发送报文的优先级判定方法(ENABLE/DISABLE)。
使能时,以报文存入发送邮箱的先后顺序来发送。
否则按照报文 ID 的优先级来发送。
CAN 发送及接收结构体
1. StdId
本成员存储的是报文的 11 位标准标识符,范围是 0-0x7FF。
2. ExtId
本成员存储的是报文的 29 位扩展标识符,范围是 0-0x1FFFFFFF。
ExtId 与 StdId 这两个成员根据下面的 IDE 位配置,只有一个是有效的
3. IDE
本成员存储的是扩展标志 IDE 位。
当它的值为宏 CAN_ID_STD 时表示本报文是标准帧,使用 StdId 成员存储报文 ID;
当它的值为宏 CAN_ID_EXT 时表示本报文是扩展帧,使用 ExtId 成员存储报文 ID。
4. RTR
本成员存储的是报文类型标志 RTR 位。
当它的值为宏 CAN_RTR_Data 时表示本报文是数据帧;
当它的值为宏 CAN_RTR_Remote 时表示本报文是遥控帧。
由于遥控帧没有数据段,所以当报文是遥控帧时,下面的 Data[8]成员的内容是无效的
5. DLC
本成员存储的是数据帧数据段的长度,它的值的范围是 0-8,当报文是遥控帧时 DLC值为 0。
6. Data[8]
本成员存储的就是数据帧中数据段的数据。
7. FMI
本成员只存在于接收结构体,它存储了筛选器的编号,表示本报文是经过哪个筛选器存储进接收 FIFO 的,可以用它简化软件处理。
当需要使用 CAN 发送报文时,先定义一个上面发送类型的结构体,然后把报文的内容按成员赋值到该结构体中,最后调用库函数 CAN_Transmit 把这些内容写入到发送邮箱即可把报文发送出去。
接收报文时,通过检测标志位获知接收 FIFO 的状态,若收到报文,可调用库函数CAN_Receive 把接收 FIFO 中的内容读取到预先定义的接收类型结构体中,然后再访问该结构体即可利用报文了。
CAN 筛选器结构体
1. CAN_FilterIdHigh
CAN_FilterIdHigh 成员用于存储要筛选的 ID。
若筛选器工作在 32 位模式,它存储的是所筛选 ID 的高 16 位;
若筛选器工作在 16 位模式,它存储的就是一个完整的要筛选的 ID。
2. CAN_FilterIdLow
类似地,CAN_FilterIdLow 成员也是用于存储要筛选的 ID。
若筛选器工作在 32 位模式,它存储的是所筛选 ID 的低 16 位;
若筛选器工作在 16 位模式,它存储的就是一个完整的要筛选的 ID。
3. CAN_FilterMaskIdHigh
CAN_FilterMaskIdHigh 存储的内容分两种情况。
当筛选器工作在标识符列表模式时,它的功能与 CAN_FilterIdHigh 相同,都是存储要筛选的 ID;
而当筛选器工作在掩码模式时,它存储的是 CAN_FilterIdHigh 成员对应的掩码,与 CAN_FilterIdLow 组成一组筛选器。
4. CAN_FilterMaskIdLow
类似地,CAN_FilterMaskIdLow 存储的内容也分两种情况。
当筛选器工作在标识符列表模式时,它的功能与 CAN_FilterIdLow 相同,都是存储要筛选的 ID;
而当筛选器工作在掩码模式时,它存储的是 CAN_FilterIdLow 成员对应的掩码,与CAN_FilterIdLow 组成一组筛选器。
具体配置可参考:
5. CAN_FilterFIFOAssignment
本成员用于设置当报文通过筛选器的匹配后,该报文会被存储到哪一个接收 FIFO,它的可选值为 FIFO0 或 FIFO1(宏 CAN_Filter_FIFO0/1)
6. CAN_FilterNumber
本成员用于设置筛选器的编号,即本过滤器结构体配置的是哪一组筛选器,CAN 一共有 28 个筛选器,所以它的可输入参数范围为 0-27。
7. CAN_FilterMode
本成员用于设置筛选器的工作模式,可以设置为列表模式(宏 CAN_FilterMode_IdList)及掩码模式(宏 CAN_FilterMode_IdMask)。
8. CAN_FilterScale
本成员用于设置筛选器的尺度,可以设置为 32 位长(宏 CAN_FilterScale_32bit)及 16 位长(宏 CAN_FilterScale_16bit)
9. CAN_FilterActivation
本成员用于设置是否激活这个筛选器(宏 ENABLE/DISABLE)
上一篇:stm32f429的u-boot、uclinux内核烧写说明
下一篇:STM32F429 >> 1. LED_RGB
推荐阅读
史海拾趣
随着公司的发展壮大,CAO Group开始面临来自各方面的竞争压力,其中包括知识产权的争议。近期,公司针对其在美国注册的三项专利——Lumist美白贴、SPRAY BOTTLE HEAD喷雾瓶头和透明氟塑料,发起了维权行动。公司积极应对,通过法律手段保护自身的知识产权,展示了其维护合法权益的决心和实力。
2019年,中微股份(Cmsemicon)迎来了又一个重要时刻——成为科创板首批上市公司之一。这一荣誉不仅是对公司过去成绩的肯定,也为公司的未来发展提供了更多的资金支持。上市以来,公司充分利用资本市场的优势,加大研发投入,推动技术创新和产品升级。同时,公司还积极拓展国际市场,提升品牌影响力。
作为一家以技术创新为核心竞争力的企业,中微股份(Cmsemicon)始终坚持以市场需求为导向,持续推动技术创新和产品升级。近年来,公司在刻蚀设备领域取得了一系列重要突破,包括成功研制出针对先进逻辑和存储器件制造中关键刻蚀工艺的高端产品等。这些技术成果不仅提升了公司的核心竞争力,也为行业的发展做出了积极贡献。
背景:1966年,在贵州凯里白午山区,国营新云器材厂(后更名为振华新云)正式成立,标志着公司的诞生。
内容:成立初期,公司面临着技术落后、设备陈旧等困难。然而,在老一辈员工的艰苦奋斗下,公司逐渐摸索出适合自身的发展道路。通过引进新技术、优化生产流程,不断提高产品质量和生产效率。
成果:经过几年的努力,振华新云逐渐在电子元器件行业崭露头角,为后续的快速发展奠定了坚实基础。
[作者:上海丰宝公司开发工程师 康立伟 日期:2006-7-21 8:15:00 来源:中国电子报 编辑:亚锋 点击: 在未来几年,电源管理产品的发展将围绕节能降耗展开。电源设计周期加快、低待机功耗、 ...… 查看全部问答∨ |
把启动的时间不小心搞成0了,现在启动直接进入系统,无法重新烧录了。 重SD卡启动也是需要读取这个时间的。我想把他的时间固定为几个秒,这样就能改回来了。 可是没找到bsp里面有相关的代码,三星没提供吗?… 查看全部问答∨ |
求救!关于mpeg4的编码问题。avi,mp4视频文件的编码 求助大家: 谁有关于mpeg4编码的资料,有人做过找方面的程序吗? 关键问题:在录像时是怎么把数据写成avi文件或者mp4文件的啊? 给点思路啊! 谢谢各位拉! 顺便问一下:wince支持透明对话框吗?用evc能实现对话框透 ...… 查看全部问答∨ |
无聊客大哥,你好啊,看过你写的文章:CE MAPI实例讲解 --- 如何获取Inbox里的所有消息收益非浅.现在我的问题是能否得到收到短信的时间,是否有像以下的一个属性得到短信的内容来得到每条短信的接收到的时间? SPropValue *pspvSubject = NULL; SizedS ...… 查看全部问答∨ |
近来搞win2000的驱动开发. 做了一个filem.sys文件,由filemon.exe文件执行的时候加载这个"驱动设备"(是不是可以称作驱动设备,偶也不是很清楚). 但是发现这个filem.sys不是每次随着filemon.exe的执行重新加载到内存里面,而是加载一次后,只能在 ...… 查看全部问答∨ |
大家好,有个问题希望大家帮忙看看: 我要使用GPRS MODEM来收发短信,但首先我得知道这个模块好用不,看到有人说超级终端中用AT命令:如输入一个AT则有“ok”返回,但是我在超级终端中输什么都没反应(已设置回显), 我在网上下过一些串口测试软 ...… 查看全部问答∨ |
一:实际应用线路 二:特性 特性 PT4317 PT4316 IC 封装 SSOP16 SOP16/SSOP16 LO Type SAW Resonator SAW Resonator 待机电流 <1uA <1uA 工作电流(@433.92MHz) 4.2mA~4.8mA 4.2mA~4.8mA 工 ...… 查看全部问答∨ |
|
把自制的模拟器的SDK安装到EVC中,做好一个应用程序后,链接上自制的模拟器,运行程序时却在EVC自带的模拟器上运行,这是怎么回事呢。好像是自己自制的模拟器总是被EVC自带的模拟器覆盖呢。… 查看全部问答∨ |
用的mcu是f149 接口是硬件SPI at45db041d是flash存储IC 我买的是模块 。流程很简单 就是通过SPI接口 mcu向flash芯片发送指令 通过指令的不同 分别有写flash缓存 读flash缓存 或者是从flash存储中写到flash缓存等等功能 但是我按照例程写 ...… 查看全部问答∨ |