STM32的CAN外设

news2025/3/10 5:53:47

我们的CAN控制器支持最高的通讯速率为1Mb/s,可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID地报文,外设中具有3个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间,具有两个3级深度的接收FIFO,可使用过滤功能只接受或不接收某些ID号,可配置成自动重发,不支持使用DMA进行数据收发。

10aa738e465e415a8436ff90aa4323af.png

在上图中,我们可以发现STM32是有两组CAN,其中这个CAN1是主设备,我们这个CAN2是从设备,其中这个“存储器访问控制器”是由CAN1控制的,要是我们的CAN2想使用的话,我们就要打开CAN1的外设时钟才可以使用,

第一个是控制内核,第二个是发送邮箱,第三个是接收FIFO,第四个是验收筛选器。

下面我们就对这个几个部分分别介绍一下了

1.CAN控制内核

在CAN的控制内核中,包含着各种控制寄存器和状态寄存器,这次我们主要学习一下其中的主控制寄存器CAN_MCR以及位时序寄存器CAN_BTR。

主控制寄存器CAN_MCR

主控制器寄存器CAN_MCR负责管理CAN的工作模式,它使用以下寄存器位实现控制。

(1)DBF调试冻结功能

使用这个可设置我们CAN处于工作状态或禁止收发的状态,处于程序调试的时候才使用的。

置0的话就表示我们CAN处于工作状态

置1的话就表示我们CAN处于接收/发送冻结状态。接收FIFO仍可正常访问/控制

(2)TTCM时间触发模式

这个是用于配置CAN的时间触发通信模式,在此模式下,CAN使用它内部定时器产生时间戳,并把它保存在CAN_RDTxR , CAN_TDTxR寄存器中。内部定时器在每个CAN位时间累加,在接收和发送的帧起始位被采样,并生成时间戳。利用这个可以实现ISO 11898-4CAN标准的分时同步通信功能。

(3)ABOM自动离线管理

它用于设置是否使用自动离线管理功能,当节点检测到它发送错误或接收错误超过一定值时,会自动进入离线状态,在离线状态中,CAN不能接收或发送报文。处于离线状态的时候,可以软件控制恢复或者直接使用这个自动离线管理功能,它会在适当的时候自动恢复。

84a86354180e44d898ad4fb37bc08415.png

(4)AWUM自动唤醒

CAN外设可以使用软件进入低功耗的睡眠模式,如果使能这个自动唤醒功能,当CAN检测到总线活动的时候会自动唤醒。

d1539839475743f48f490398f378f4c6.png

(5)NART自动重传

设置了这个动能后,当报文发送失败时会自动重传至成功为止。若不使用这个功能,消息只发送一次。

584fced0ca2643298d876a1a1c1cf768.png

(6)RFLM锁定模式

该功能用于锁定接收FIFO,锁定后,当接收FIFO溢出时,会丢弃下一个接收的报文。

如果不锁定,我们下一个接收的报文会覆盖原来报文。

a0210b8207b64e3984415d36b5e047eb.png

(7)TXFP报文发送优先级的判定方法

当CAN外设的发送邮箱中有多个待发送报文时,本功能可以控制它是根据报文的ID优先级还是报文存进邮箱的顺序来发送。

e14100e8df564694b3a63d49d1befbd2.png

位时序寄存器(CAN_BTR)及波特率

CAN_BTR寄存器可用于配置测试模式,波特率以及各种位内的段参数

(1)测试模式

为方便调试,STM32的CAN提供了测试模式,我们配置位时序寄存器CAN_BTR的SILM和LBKM寄存器位可以控制使用正常模式,静默模式,回环模式,及静默回环模式。

022a245bf8704909952e95ee748e4f4c.png

0db0d14fc07741ecb677597a2170fba3.png

 

如上图,各种模式介绍如下:

1.正常模式

正常模式下就是一个正常的CAN节点,可以向总线发送数据和接收数据。

2.静默模式

在静默模式下,它自己的输出端的逻辑0会直接传输到它自己的输入端,逻辑1可以被发送到总线,所以它是不能向总线发送显性位(逻辑0),只能发送隐性位(逻辑1).输入端可以从总线接收内容.;由于它只发送隐性位不会强制影响总线的状态,所以我们称它为静默模式.

这种模式一般用于监测,它可以分析总线上的流量,但又不会因为发送显性位而影响总线.

3.回环模式

回环模式下,它自己的输出端的所有内容都直接传输到自己的输入端,输出端的内容同时也会被传输到总线上,即也可使用总线监测它的发送内容.输入端只接受自己发送端的内容,不接收来自总线上的内容.可以使用回环模式可以进行自检.

4.回环静默模式

这是回环模式和静默模式的结合,自己输出的端的所有内容都直接传输到自己的输入端,并且不会向总线发送显性位影响总线,不能通过总线监测它的发送内容,输入端只接受自己发送端的内容,不接收来自总线上的东西.这种方式一般在"热自检"时使用,即自我检查的时候,不会干扰总线

以上的四种模式都是不用修改硬件接线的.

(2)位时序及波特率

8d28f4fea3f74e779d615354015c7a97.png

STM32外设定义的位时序和我们前面解释的CAN标准时序有一点区别,

STM32的CAN外设位时序中只包含3段,分别是同步段SYNC_SEG,位段BS1及位段BS2,这个BS1段可以理解成前面介绍的PTS段与PBS1段合在一起的.

采样点位于BS1和BS2段的交界处,其中同步段SYNC_SEG固定为1Tq,而这个BS1和BS2段可以在位时序寄存器CAN_BTR设置它们的时间长度,它们可以在重新同步期间增长或缩短,该长度SJW也可在位时序寄存器中配置.

3dd4a4df99374dfabe3ab56b51558ac5.png

了解了位时序以后,我们就可以配置波特率了.通过配置位时序寄存器CAN_BTR的的TS1[3:0]以及TS2[2:0]寄存器位设定BS1及BS2段的长度后,我们就可以确定每个CAN数据位的时间:

BS1段时间:

Ts1 = Tq ✖ (TS1[3:0]+1),

BS2段时间:

Ts2 = Tq ✖ (TS2[3:0]+1),

一个数据位的时间:

T1bit = 1Tq+Ts1+Ts2 = 1+(TS1[3:0]+1)+(TS2[2:0]+1) = NTq

其中这个Tq时间片的长度与CAN外设的所挂载的时钟总线及分频器配置有关,CAN1和CAN2外设都是挂载在APB1总线上,而我们CAN_BTR中的BRP[9:0]寄存器位可以设置CAN外设时钟的分频值,所以:

Tq = (BRP[9:0]+1)✖Tpclk

其中的PCLK指APB1时钟,默认值为45Mhz.

最终可以计算出CAN通讯的波特率:

BaudRate = 1/N Tq;

如下表有一种波特率为1Mbps的方式,说明了一种把波特率配置为1Mbps的方式

efd481ed618946aeac447f1eea935278.png

理解一下就是 总的 9Tq, 45Mhz 拿来5分频就是9Mhz,波特率就是9Tq除以9Mhz等于1Mbps.

(3)CAN发送邮箱

我们STM32一共有3个发送邮箱,即最多可以缓存3个待发送的报文,

在每个发送邮箱中包含标识符寄存器CAN_TIxR,数据长度控制寄存器CAN_TDTxR及2个数据寄存器CAN_TDLxR,CAN_TDHxR,它们的功能见表发送邮箱的寄存器

f79950e60c3d4f1ca87418d27d00a769.png

当我们要使用CAN外设发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并对标识符寄存器CAN_TIxR中的发送请求寄存器位TMIDxR_TXRQ置1,即可把数据发送出去.

其中标识寄存器CAN_TIxR  将它的TXRQ置1 就可以发送出去数据,有一个地方比较特殊,就是当IDE置0的时候就是标准标识符,置1的时候就是扩展标识符,我们在标准标识符的时候因为总位数是11位数据,所以我们这个CAN_TIxR的寄存器只用在前11位,当我们是扩展标识符的时候,我们总位数是29位,所以就前29位完整的用起来了.

19b7b814966144f8a4065c63d277e441.png

(4)CAN接收FIFO

20e160a5213e47fcb43796c2ffe7ca9a.png

看在我们STM32的CAN外设有两个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收到的报文,当接收到报文时,FIFO的报文计数器会自增,而我们STM32内部读取FIFO数据之后,报文计数器会自减,我们通过状态寄存器可获知报文计数器的值,

463c33eeabf243f7ac9c2b01af81c507.png

 

和发送邮箱类似,每个接收FIFO中包含有标识寄存器CAN_RIxR,数据长度控制寄存器CAN_RDTxR及2个数据寄存器CAN_RDLxR,CAN_RDHxR,它们的功能如下图

cff63ed67db64b719306d93c6fb7f273.png

我们读取这些寄存器的值即可把接收到的报文加载到STM32的内存中

(5)验收筛选器

我们一共28个筛选器组,每个筛选器组有2个寄存器,CAN1和CAN2公用的筛选器.

在CAN协议中,消息的标识符与节点地址无关,但是和消息内容有关.因此,发送节点将报文广播给所有接收器时,接收节点会根据报文标识符的值来确定软件是否需要该消息,

为了简化软件的工作.STM32的CAN外设接收报文前会先使用验收筛选器检查,只接收需要的报文到FIFO中.

筛选器工作的时候,可以调整筛选ID的长度以及过滤模式.根据筛选ID长度来分类有以下两种:

(1)检查STDID[10:0],EXTID[17:0],IDE和RTR位,一共31位

(2)检查STDID[10:0],RTR,IDE和EXTID[17:15],一共16位

通过配置筛选尺度寄存器CAN_FSIR的FSCx位可以设置筛选器工作在哪个尺度

6bae8b9122044bf98934c78c5b6f1e3c.png

而根据过滤的方法分为以下两种模式:

(1)标识符列表模式,它要把接收报文的ID列成一个表,要求报文ID与列表中的某一个标识符完全相同才可以接收,白名单管理

(2)掩码模式,它把可接受收报文ID的某几位作为列表,这几位被称为掩码,可以理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到FIFO

通过配置筛选尺度寄存器CAN_FSIR的FBMx位可以设置筛选器工作在哪个模式

d8ad1eb5fa4a4667b6cd69558a77821e.png

具体全部总结如下图

8b43a3d5af224b03ae7393dbe413275e.png

每组筛选器包含2个32位的寄存器,分别位CAN_FxR1和CAN_FxR2,他们用来存储要筛选的ID或掩码,各个寄存器位代表的意义与下图所示一致

5f44bfbf27e44ea0936ed2d416a33add.png

我们举个例子,大概理解一下

d597bbda2d42472d8cdccba6c0113692.png

就像这个表格,

在掩码模式下的时候,第一个寄存器存储的就是要筛选的ID,第二个寄存器存储的掩码,

这个掩码为1的地方,表示该位必须与ID中的内容一样,而0的话就是表示该位可以是0也可以是1

最后筛选的ID 就是第三行所示

如果是标识符模式,2个寄存器存储的都是要筛选的ID,不一样的直接丢弃掉.

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1569278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

langchain + azure chatgpt组合配置并运行

首先默认你已经有了azure的账号。 最重要的是选择gpt-35-turbo-instruct模型、api_version:2023-05-15,就这两个参数谷歌我尝试了很久才成功。 我们打开https://portal.azure.com/#home,点击更多服务: 我们点击Azure OpenAI&#…

MacBook安装使用XMind

MacBook安装使用XMind XMind简介 官方地址: https://www.xmind.cn/ XMind 是一个全功能的思维导图和头脑风暴软件,为激发灵感和创意而生。作为一款有效提升工作和生活效率的生产力工具,受到全球百千万用户的青睐。 XMind 是一款非常实用的商业思维导图软件,应用…

《QT实用小工具·十一》Echart图表JS交互之仪表盘

1、概述 源码放在文章末尾 该项目为Echart图表JS交互之炫酷的仪表盘,可以用鼠标实时改变仪表盘的读数。 下面为demo演示: 该项目部分代码如下: #include "widget.h" #include "ui_widget.h" #include "qurl.h&q…

【Java程序员面试专栏 综合面试指南】5年资深程序员面试指南

基础知识对于5年内工作经验的同学考察相对比较多。包括编程语言、计算机网络、操作系统、设计模式、分布式知识、MySQL、Redis这种。其中随着年限的增长,基础知识考察的会越来越少,例如操作系统基本上只在学生阶段考察,计算机网络对于5年经验来说也考察的相对较少。5年以上对…

蓝桥杯单片机速成8-NE555频率测量

一、原理图 NOTE:使用NE555测量频率之前,需要将J3-15(SIGNAL)与J3-16(P34短接) 在使用矩阵键盘的时候也记得把跳冒拔下,因为有公共引脚P34 又是因为他的输出引脚是P34,所以只能用定时器0来作为计数器进行频率测量了 二、代码实现 …

清明时节雨纷纷,AI达人用Bedrock(第一季)

今天是清明小长假第一天,没有外出踏青,在家体验Amazon Bedrock的强大能力。Amazon Bedrock是专门为创新者量身打造的平台,它提供了构建生成式人工智能应用程序所需的一切。 这次我主要尝试的是通过 Amazon Bedrock 里的 Stability AI SDXL 1…

单目标跟踪 多目标跟踪 目标跟踪 运动估计/光流 OPENCV光流源码分析 基于卷积神经网络的光流预测算法 相关滤波方法

目标跟踪 目标跟踪算法总结 目标跟踪算法是指通过视频分析技术,实时追踪视频序列中的目标并获取其位置、形状、速度等信息的一种算法。目标跟踪在多个领域有着广泛的应用,如监控安防、无人驾驶、人机交互以及虚拟现实等。 目标跟踪算法有多种分类方式。一种分类是基于主动…

Qt | 发布程序(以 minGW 编译器为例)

1、注意:修改 pro 文件后,最好执行“构建”>“重新构建项目”,否则 pro 文件的更改将不会反应到程序上。 2、发布程序的目的:就是让编译后生成的可执行文件(如 exe 文件),能在其他计算机上运行。 一、编译后生成的各种文件简介 Qt Creator 构建项目后产生的文件及目录…

KIl5:Stm32L071下载出现flash download faild “cortex-m0+“的解决方法

首先看看有没有芯片,没有芯片下载一下 下载并在device选择对应的芯片 选择调试器 选择flash

如何保护IP地址不被泄露?

当互联网成为每个家庭的重要组成部分后,IP地址就成了你的虚拟地址。您的请求从该地址开始,然后 Internet 将消息发送回该地址。那么,您担心您的地址被泄露吗? 对于安全意识高或者某些业务需求的用户,如果您正在寻找保护…

《YOLOv8:从入门到实战》专栏介绍 专栏目录

🌟YOLOv8:从入门到实战 | 目录 | 使用教程🌟 本专栏涵盖了丰富的YOLOv8基础知识源码解析入门实践算法改进项目实战系列教程,专为学习YOLOv8的同学而设计,堪称全网最详细的教程!该专栏针对YOLOv8内容的学习…

蓝桥杯备考2

P8839 [传智杯 #4 初赛] 组原成绩 题目描述 花栗鼠科技大学(Hualishu University of Science and Technology, HUST)的计算机组成原理快要出分了。你现在需要计算你的组原成绩如何构成。 具体来说,组原成绩分为三部分,分别是平…

卡奥斯工业互联网平台分析

一、 背景 卡奥斯是海尔推出的具有中国自主知识产权、全球首家引入用户全流程参与体验的工业互联网平台。其核心是大规模定制模式,通过持续与用户交互,将硬件体验变为场景体验,将用户由被动的购买者变为参与者、创造者,将企业由原…

刷题之Leetcode34题(超级详细)

34. 在排序数组中查找元素的第一个和最后一个位置 力扣链接(opens new window)https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/ 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始…

3. python练习题3-自由落体

3. python练习题3-自由落体 【目录】 文章目录 3. python练习题3-自由落体1. 目标任务2. 解题思路3. 知识回顾-%占位符格式化处理3.1 概述3.2 占位符的多种用法3.3 格式化操作符辅助指令3.4 将整数和浮点数格式化为字符串 4. 解题思路4.1 球第1次下落4.2 球第2次下落 5. 最终代…

数字化导师坚鹏:招商银行数字化转型的4次模式升级与5大关键举措

招商银行数字化转型的4次模式升级与5大关键举措 招商银行数字化转型取得了较大的成功,从目前的财务数据来看,招商银行在数字化转型领域已经成为国内最优秀的股份制银行。招商银行是如何取得数字化转型成功的?从招商银行数字化转型的4次模式升…

MHA高可用配置与故障切换

前言: MHA高可用故障就是单点故障,那么我们如何解决单点故障MHA中Master如何将故障的机器停止,使用备用的Slave服务器 一 MHA定义 MHA(MasterHigh Availablity)是一套优秀的Mysql高可用环境下故障切换和主从复制的…

SpringBoot参数校验@Valid 和 @Validated注解使用详解

JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。 注意:JSR-303实现与 Hibernate ORM 没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。 Spring MVC 3.x 之中也大力支持 JS…

备战蓝桥杯---多路归并与归并排序刷题

话不多说,直接看题 1. 我们考虑一行一行合并,一共m次,我们合并两个并取前n小,那么我们怎么取? 我们采用分组的思想: 我们选第一列的min,然后把后面那个再纳入考虑,用优先队列实现即可。 下面…

一致性hash问题(负载均衡原理)

一致性哈希问题 简介 一致性Hash是一种特殊的Hash算法,由于其均衡性、持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和memcached都采用了一致性Hash来作为集群负载均衡的方案。 本文将介绍一致性Hash的基本思路,并讨论其…