CAN总线是目前应用非常多的一种总线,在汽车电子,航空航天中应用广泛,博主用的是战舰的STM32开发板。CAN的介绍和功能特点就不讲了,书本上网上都有,请大家在阅读本文前了解CAN总线协议的特点和功能。今天博主将和大家共同学习CAN总线标识符过滤器的使用(非常重要!)
请认真读这段话(来自STM32中文参考手册):在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接受者。节点在接收报文时,根据标识符的值,决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就丢弃,且无需软件的干预。在,STM32F103ZET6这款芯片中,bxCAN控制器为应用程序提供了14个位宽可变的,可配置的过滤器组(13~0),以便只接受那些软件需要的报文。硬件过滤的做法节省了CPU的开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。
有些读者看了之后觉得,报文,标识符,过滤器,他们是什么?他们有什么联系?有这些问题说明你就要懂了。。别急,听我慢慢道来~~~
过滤器:过滤器在接收时使用,在发送时不需配置过滤器!过滤器会根据标识符而决定节点要不要发送者发过来的报文。通俗一点:是我想要的,我就要;不是我想要的,我就不要。
报文:报文(MESSAGE)是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,期长短不一致,长度不限且可变。注意(这里才是重点!):报文也是网络传输的单位,传输过程中会不断的封装成分组,包,帧来传输,封装的方式就是加一些信息段,那些就是报文头以一定格式组织起来的数据。
这里补充一点:CAN总线上的报文传输由4个不同的帧类型表示和控制。1、数据帧 2、远程帧 3、错误帧 4、过载帧。接着看下文:
标识符:标识符主要包括如下,也可以理解为仅包含ID号,但是在这里下面这些都是要包含的:
例如在数据帧和远程帧中,标识符都是包含在里面的,而数据帧和远程帧是报文的一种表示类型。故,发送端发帧数据给接收端后,接收端根据标识符来进行筛选,决定取舍。
看完上面三个定义,再回头看上面那段话应该没有问题了吧~
下面重点介绍过滤器:
STM32提供两种过滤器模式供用户选择,屏蔽位模式(标识符屏蔽位模式)和标识符列表模式。上图:
屏蔽位模式:
在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”和“不用关心”处理。
标识符列表模式:
在标识符列表模式下,屏蔽寄存器也被当做标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是采用两个标识符寄存器。接收报文的每一位都必须跟过滤器标识符相同。
标识符列表模式很好理解:就是指过滤器寄存器的所有位都用来过滤,也就是说,发送端发送的标识符所有的位必须和接收端的过滤器的寄存器定义的一模一样,有一个为不同,都拒收次消息!
而屏蔽位模式稍微复杂一点,但也好理解:举个简单的例子,我们过滤器组0工作在:1个32位过滤器-标识符屏蔽模式,然后设置CAN_F0R1=0XFFFF0000,CAN_F0R2=0XFF00FF00。其中,存放到CAN_F0R1的值是期望收到的ID,即我们希望收到的映像(STID+EXTID+IDE+RTR)最好是:0XFFFF0000。而0XFF00FF00就是设置我们需要必须关心的ID,表示收到的映像,其位[31:24]和位[15:8]这16个位,必须和CAN_F0R1中对应的位一模一样,而另外的16个位则不必关心,可以一样,也可以不一样,都认为是正确的ID,即收到的映像必须是0XFFxx00xx,才算是正确的(x表示不关心)。也就是说,屏蔽位(CAN_F0R2)中的数值:
1:必须匹配,到来的标识符位必须和过滤器对应的标识符寄存器位相一致。
0:不关心,可以一样,也可以不一样,都认为是正确的ID
因此:
为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式
为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式
注意:应用程序不用的过滤器组,应该保持在禁用模式。(这个很好理解)
最后关于CAN的发送和接收流程,这个可以看看手册上的流程图,讲的很详细。
关键字:STM32 CAN总线 标识符 过滤器
引用地址:
STM32 CAN总线标识符过滤器难点解析
推荐阅读最新更新时间:2024-03-16 15:37
Stm32-输入捕获
输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单地说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)中。 1. 相关寄存器介绍 1) 捕获/比较模式寄存器 (TIMx_CCMRx) 当在输入捕获模式下使用的时候,对应上图的第二行描述,从图中可以看出,TIMx_CCMR1 明显是针对 2 个通道的配置,低八位 用于捕获/比较通道 1 的控制,而高八位 则用于捕获/比较通道 2 的控制
[单片机]
ST扩展STM32MP1生态系统,促进AI和IoT应用开发
意法半导体宣布进一步扩大资源丰富的STM32MP1*双核微处理器开发生态系统,增加新软件包,系统可支持最先进的开源安全计划。 通过提供实现OP-TEE(开放式便携式受信任执行环境)和TF-A(可信固件-A)项目等安全机制的软件代码,意法半导体帮助STM32MP1开发人员分析解决在实际应用开发中遇到的重要的信息安全概念:机密性、完整性、可用性和真伪验证。此外,意法半导体还与Sequitur Labs公司合作扩大嵌入式安全授权合作伙伴名单。 Sequitur Labs 的EmSPARK™ Security Suite for STM32MP1安全套件可简化安全启动、设备验证等保护技术的固件开发。Sequitur Labs
[单片机]
STM32学习笔记001:点亮RGB
我学习stm32使用的是f103c8t6核心板、洞洞板和外设,并没有使用开发板,我个人的观点是不要被开发板限制住,接线也是一门学问,可以同时学到些电路的知识,一举两得;我参考的是正点原子的教程,但是用的芯片和他们不一样,工程结构有借鉴,但是不完全一样,代码都是自己一行行敲的,也不涉及抄袭,就是想记录一下自己的学习过程,在这声明一下。 下载和调试器是 jlink ob ,tb上那种20多的就可以 配置MDK和建工程就跳过了,网上有详细教程,认真看看都会 工程文件里最重要是单片机的启动文件,一定要选对,比如我这个就是startup_stm32f10x_md.s,就是中等容量的f103芯片 下面上代码,注释都很清晰了,点
[单片机]
分析一个关于STM32 芯片异常复位的经典案例!
前言 本篇主要是介绍一种处理问题的思路,即当我们在做STM32应用开发过程中,遇到芯片异常复位,或者进入了异常处理时,如何通过集成开发环境,如IAR,KEIL等查看相应的ARM内核寄存器,定位出应用软件产生异常的地方! 问题描述 某STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位。复位后程序继续运行,但是还会继续复位,原因不详! 问题分析 针对于此类问题,我们可以按照一个统一的思路去处理。分析本案例的大致步骤如下: 1、初步确定复位的原因,是硬件复位,如外部NRST被拉低,还是软件复位,包括软件直接调用复位,或者看门狗复位,还是低功耗模式如standby模式被唤醒时产生中断; 2、查看复位
[单片机]
STM32自带硬件编码器接口的设置
在这里使用TIM3的通道1和通道2做为A B项的电平捕捉。 由于STM32自带硬件编码器接口,因此只要设置好就可使用,非常强大,下面程序测试通过。 void TIM3_Mode_Config(void) { //u16 CCR1_Val = 2500; //u16 CCR2_Val = 1000; GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; //TIM_OCInitTypeDef TIM
[单片机]
STM32 MCU内置的一些主要硬件安全属性
对于功能安全,ST MCU从芯片内置的硬件安全属性,经过认证的软件自检库和完备的安全文档三个层面来支持STM32用户在系统级进行开发,达到要求的功能安全等级。 下表中列出了STM32MCU内置的一些主要硬件安全属性。下面我们一起来看看这些属性在功能安全中的用处。 双看门狗:独立看门狗和窗口看门狗 看门狗是我们常用到的针对CPU运行状态监测的手段之一。它本质上就是一个定时器,启动之后,需要不断的去刷新(我们通常把这个动作叫做“喂狗”),否则当看门狗的定时器减到规定的值后,就会引起系统复位。我们可以利用它来检测程序是否跑飞,并通过芯片复位,来让系统恢复到正常状态。 STM32 MCU提供两个看门狗,独立看门狗和窗口看门狗。
[单片机]
stm32 usb数据缓冲区疑问
USB不同的应用需要使用到的端点数和端点数据长度各不相同,如果为每个端点都单独规划一个存储区非常浪费。 所以STM32为USB模块提供了共512个字节的存储区,至于如何为每个端点分配使用这512B的空间,就是用户自己的事情了,这样存储区的分配就非常经济灵活。这512B空间的首地址是0x40006000。 你看到的#define ENDP2_RXADDR (0xD8),这个0xD8就是在这512B空间里的偏移地址,说明端点2收到的数据将放在0x40006000 + 0xD8 * 2的地址空间里。至于为什么要 2,是因为这部分存储区是按照2字节访问的,即每存放1个字节的数据要占据2个字节的空间。所以这段存储区的地址是从
[单片机]
模糊控制在基于CAN总线的数据采集与控制系统中的应用
L.A.扎德教授于1965年创立的模糊集合理论(Fuzzy Sets)及模糊数学(Fuzzy Mathematics)为模糊逻辑控制的形成提供了理论基础。近年来,随着各企业生产规模的不断扩大,生产过程控制系统也变得越来越复杂。由于整个系统的非线性增强、时滞增大,而且不是系统中的每个环节都需要建立精确的数学模型,使得模糊逻辑控制在生产过程中的应用成为可能。随着模糊控制的迅速发展,不需要对控制对象建立精确数学模型的模糊控制方法已进入实用化的阶段,它主要是把对被控系统的熟练的操作经验转换成模糊规则。现场总线的出现,为复杂现场采用模糊控制技术进行直接控制提供了很好的途径,也使模糊控制算法可以利用现场总线的强大网络功能实现集中化管理,而对各个
[工业控制]