CAN控制器,供给了28个可装备的挑选器组(F1仅互联型才有28个,其他的只需14个),
STM32 CAN控制器每个挑选器组由2个32位寄存器组成(CAN_FxR1和CAN_FxR2,x=0~27)。依据位宽不同,每个挑选器组可供给:
● 1个32位挑选器,包含:STDID[10:0]、EXTID[17:0]、IDE和RTR位
● 2个16位挑选器,包含:STDID[10:0]、IDE、RTR和EXTID[17:15]位
关于组, 能够将其装备成屏蔽位方式, 这样 CAN_FxR0中保存的便是标识符匹配值,
CAN_FxR1中保存的是屏蔽码,即 CAN_FxR1中假设某一位为1,则 CAN_FxR0中相应
的位有必要与收到的帧的标志符中的相应位契合才干经过过滤器; CAN_FxR1中为0的位表
示 CAN_FxR0中的相应位可不必与收到的帧进行匹配。 过滤器组还能够被装备成标识符列
表方式,此刻 CAN_FxR0和 CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必
须与其间的一个契合才干经过过滤。

留意:CAN_FilterIdHigh 是指高16位 CAN_FilterIdLow 是低16位应该将需求得到的帧
的和过滤器的设置值左对齐起。
一般咱们用的都是普通型的,所以在本文中能够说 STM32有14组过滤器组。
依据装备,每1组过滤器组能够有1个,2个或4个过滤器。
这些过滤器相当于关卡,每逢收到一条报文时,CAN 要先将收到的报文从这些过滤器上”
过”一下,能经过的报文是有用报文,收进 FIFO,不能经过的是无效报文(不是发给”我”
的报文),直接丢掉。
一切的过滤器是并联的,即一个报文只需经过了一个过滤器,便是算是有用的。
每组过滤器组有两种作业方式:标识符列表方式和标识符屏蔽位方式。
在标识符列表方式下,收到报文的标识符有必要与过滤器的值彻底持平才干经过。
在标识符屏蔽位方式下,能够指定标识符的哪些位为何值时就算经过。这其实便是限制了
处于某一规模的标识符能够经过。
在一组过滤器中,整组的过滤器都运用同一种作业方式。
别的,每组过滤器中的过滤器宽度是可变的,可所以32位或16位。
按作业方式和宽度,一个过滤器组能够变成以下几中方式之一:
(1) 1个32位的屏蔽位方式的过滤器。
(2) 2个32位的列表方式的过滤器。
(3) 2个16位的屏蔽位方式的过滤器。
(4) 4个16位的列表方式的过滤器。
一切的过滤器是并联的,即一个报文只需经过了一个过滤器,便是算是有用的。
每组过滤器组有两个32位的寄存器用于存储过滤用的”规范值”,别离是 FxR1,FxR2。
在32位的屏蔽位方式下:
有1个过滤器。
FxR2用于指定需求关怀哪些位,FxR1用于指定这些位的规范值。
在32位的列表方式下:
有两个过滤器。
FxR1指定过滤器0的规范值,收到报文的标识符只需跟 FxR1彻底相同时,才算经过。
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。这样一切报文均能经过。
(STM32供给的例程里便是这么做的! )
STM32 CAN 中,另一个较难了解的便是过滤器编号。
过滤器编号用于加快 CPU 对收到报文的处理。
收到一个有用报文时, CAN 会将收到的报文 以及它所经过的过滤器编号, 一同存入接
收邮箱中。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) 位宽和方式都相同的过滤器,优先级由过滤器号决议,过滤器号小的优先级高。
按这样的次序,报文能经过的第一个过滤器,便是该报文的过滤器编号,被存入接纳邮箱
中。