资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划stm32,can滤波器配置总结STM32CAN过滤器、滤波屏蔽器配置总结下面内容为转载:一、在STM32互联型产品中,CAN1和CAN2分享28个过滤器组,其它STM32F103xx系列产品中有14个过滤器组,用以对接收到的帧进行过滤。1、过滤器组每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文从这些过滤器上过一下,能通过的报文是有效报文,收进相关联FIFO,不能通过的是无效报文(不是发给我的报文),直接丢弃。每组过滤器组有两种工作模式:标识符列表模式和标识符屏蔽位模式。标识符屏蔽位模式:可过滤出一组标识符。此时,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。标识符列表模式:可过滤出一个标识。此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。注意:CAN_FilterIdHigh是指高16位CAN_FilterIdLow是低16位应该将需要得到的帧的和过滤器的设置值左对齐起。所有的过滤器是并联的,即一个报文只要通过了一个过滤器,就是算是有效的。按工作模式和宽度,一个过滤器组可以变成以下几中形式之一:(1)1个32位的屏蔽位模式的过滤器。(2)2个32位的列表模式的过滤器。(3)2个16位的屏蔽位模式的过滤器。(4)4个16位的列表模式的过滤器。每组过滤器组有两个32位的寄存器用于存储过滤用的标准值,分别是FxR1,FxR2。在32位的屏蔽位模式下:有1个过滤器。FxR1用于指定这些位的标准值,FxR2用于指定需要关心哪些位。在32位的列表模式下:有2个过滤器。FxR1指定过滤器0的标准值,FxR2指定过滤器1的标准值。在16位的屏蔽位模式下:有2个过滤器。FxR1配置过滤器0,其中,31-16位指定要关心的位,15-0位指定这些位的标准值。FxR2配置过滤器1,其中,31-16位指定要关心的位,15-0位指定这些位的标准值。在16位的列表模式下:有4个过滤器。FxR1的15-0位配置过滤器0,FxR1的31-16位配置过滤器1。FxR2的15-0位配置过滤器2,FxR2的31-16位配置过滤器3。STM32的CAN有两个FIFO,分别是FIFO0和FIFO1。为了便于区分,下面FIFO0写作FIFO_0,FIFO1写作FIFO_1。每组过滤器组必须关联且只能关联一个FIFO。复位默认都关联到FIFO_0。所谓“关联”是指假如收到的报文从某个过滤器通过了,那么该报文会被存到该过滤器相连的FIFO。从另一方面来说,每个FIFO都关联了一串的过滤器组,两个FIFO刚好瓜分了所有的过滤器组。每当收到一个报文,CAN就将这个报文先与FIFO_0关联的过滤器比较,如果被匹配,就将此报文放入FIFO_0中。如果不匹配,再将报文与FIFO_1关联的过滤器比较,如果被匹配,该报文就放入FIFO_1中。如果还是不匹配,此报文就被丢弃。每个FIFO的所有过滤器都是并联的,只要通过了其中任何一个过滤器,该报文就有效。如果一个报文既符合FIFO_0的规定,又符合FIFO_1的规定,显然,根据操作顺序,它只会放到FIFO_0中。每个FIFO中只有激活了的过滤器才起作用,换句话说,如果一个FIFO有20个过滤器,但是只激话了5个,那么比较报文时,只拿这5个过滤器作比较。一般要用到某个过滤器时,在初始化阶段就直接将它激活。需要注意的是,每个FIFO必须至少激活一个过滤器,它才有可能收到报文。如果一个过滤器都没有激活,那么是所有报文都报废的。一般的,如果不想用复杂的过滤功能,FIFO可以只激活一组过滤器组,且将它设置成32位的屏蔽位模式,两个标准值寄存器(FxR1,FxR2)都设置成0。这样所有报文均能通过。2、过滤器编号过滤器编号用于加速CPU对收到报文的处理。收到一个有效报文时,CAN会将收到的报文以及它所通过的过滤器编号,一起存入接收邮箱中。CPU在处理时,可以根据过滤器编号,快速的知道该报文的用途,从而作出相应处理。不用过滤器编号其实也是可以的,这时候CPU就要分析所收报文的标识符,从而知道报文的用途。由于标识符所含的信息较多,处理起来就慢一点了。会消耗CPU资源。STM32使用以下规则对过滤器编号:(1)FIFO_0和FIFO_1的过滤器分别独立编号,均从0开始按顺序编号。(2)所有关联同一个FIFO的过滤器,不管有没有被激活,均统一进行编号。(3)编号从0开始,按过滤器组的编号从小到大,按顺序排列。(4)在同一过滤器组内,按寄存器从小到大编号。FxR1配置的过滤器编号小,FxR2配置的过滤器编号大。(5)同一个寄存器内,按位序从小到大编号。15-0位配置的过滤器编号小,31-16位配置的过滤器编号大。(6)过滤器编号是弹性的。当更改了设置时,每个过滤器的编号都会改变。但是在设置不变的情况下,各个过滤器的编号是相对稳定的。这样,每个过滤器在自己在FIFO中都有编号。在FIFO_0中,编号从0-(M-1),其中M为它的过滤器总数。在FIFO_1中,编号从0-(N-1),,其中N为它的过滤器总数。一个FIFO如果有很多的过滤器,,可能会有一条报文,在几个过滤器上均能通过,这时候,,这条报文算是从哪儿过来的呢?STM32在使用过滤器时,按以下顺序进行过滤:(1)位宽为32位的过滤器,优先级高于位宽为16位的过滤器。(2)对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式。(3)位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高。按这样的顺序,报文能通过的第一个过滤器,就是该报文的过滤器编号,被存入接收邮箱中。二、代码:u32slave_id=0x11;/*CAN1配置函数*/voidCAN_Configuration(void)CAN_InitTypeDefCAN_InitStructure;CAN_FilterInitTypeDefCAN_FilterInitStructure;/CANregisterinitCAN_DeInit(CAN1);CAN_StructInit(&CAN_InitStructure);前言在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符(CANID)的值决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(130),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。为了让大家了解STM32的bxCAN的接收过滤机制,首先大家需要了解几个概念。2几个重要的概念过滤器组STM32总共提供14个过滤器组来处理CAN接收过滤问题,每个过滤器组包含两个32位寄存器CAN_FxR0和CAN_FxR1组成,在设置为屏蔽位模式下,其中一个作为标识符寄存器,另一个作为屏蔽码寄存器。过滤器组中的每个过滤器,编号(叫做过滤器号)从0开始,到某个最大数值。过滤器的过滤模式STM32提供两种过滤模式供用户设置:屏蔽位模式和标识符列表模式。屏蔽位模式为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。标识符列表模式为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。过滤器的位宽每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:1个32位过滤器,包括:STDID10:0、EXTID17:0、IDE和RTR位2个16位过滤器,包括:STDID10:0、IDE、RTR和EXTID17:15位过滤器组的过滤模式和位宽设置过滤器组可以通过相应的CAN_FMR寄存器配置。但是不是什么时候都可以直接配置,在配置一个过滤器组前,必须通过清除CAN_FAR寄存器的FACT位,把它设置为禁用状态。然后才能设置或设置过滤器组的配置。?通过设置CAN_FS1R的相应FSCx位,可以配置一个过滤器组的位宽。通过CAN_FM1R的FBMx位,可以配置对应的屏蔽/标识符寄存器的标识符列表模式或屏蔽位模式。(见后续节)应用程序不用的过滤器组,应该保持在禁用状态。关于过滤器配置,可参见下图:图1过滤器匹配序号一旦收到的报文被存入FIFO,就可被应用程序访问。通常情况下,报文中的数据被拷贝到SRAM中;为了把数据拷贝到合适的位置,应用程序需要根据报文的标识符来辨别不同的数据。bxCAN提供了过滤器匹配序号,以简化这一辨别过程。根据过滤器优先级规则,过滤器匹配序号和报文一起,被存入邮箱中。因此每个收到的报文,都有与它相关联的过滤器匹配序号。过滤器匹配序号可以通过下面两种方式来使用:把过滤器匹配序号跟一系列所期望的值进行比较把过滤器匹配序号当作一个索引来访问目标地址对于标识符列表模式下的过滤器(非屏蔽方式的过滤器),软件不需要直接跟标识符进行比较。对于屏蔽位模式下的过滤器,软件只须对需要的那些屏蔽位(必须匹配的位)进行比较即可。在给过滤器编号时,并不考虑过滤器组是否为激活状态。另外,每个FIFO各自对其关联的过滤器进行编号,如下图:图2过滤器优先级规则根据过滤器的不同配置,有可能一个报文标识符能通过多个过滤器的过滤;在这种情况下,存放在接收邮箱中的过滤器匹配序号,根据下列优先级规则来确定:位宽为32位的过滤器,优先级高于位宽为16位的过滤器对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高如下图:图3如上图,在接收一个报文时,其标识符首先与配置在标识符列表模式下的过滤器相比较;如果匹配上,报文就被存放到相关联的FIFO中,并且所匹配的过滤器的序号被存入过滤器匹配序号中。如同例子中所显示,报文标识符跟#4标识符匹配,因此报文内容和FMI4被存入FIFO。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号