關於STM32的CAN的過濾器

2022-07-04 18:42:16 字數 3529 閱讀 6112

stm32普通型晶元的can有14組過濾器組(互聯型有28組過濾器組)

,用以對接收到的幀進行過濾。每組過濾器包括了2個可配置的32位暫存器:can_fxr0和can_fxr1。對於過濾器組,可以將其配置成遮蔽位模式,這樣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)

位寬和模式都相同的過濾器,優先順序由過濾器號決定,過濾器號小的優先順序高。

按這樣的順序,報文能通過的第乙個過濾器,就是該報文的過濾器編號,被存入接收郵箱中。

原**:  

關於STM32的CAN的過濾器

關於stm32的can的過濾器 stm32普通型晶元的can有14組過濾器組,互聯型有28組過濾器組.一般我們用的都是普通型的,所以在本文中可以說stm32有14組過濾器組.根據配置,每1組過濾器組可以有1個,2個或4個過濾器.這些過濾器相當於關卡,每當收到一條報文時,can要先將收到的報文 從這些...

stm32 CAN過濾器組

在互聯型產品中,can1和can2分享28個過濾器組 其它stm32f103xx系列產品中有14個過濾器組 位寬設定 四種配置方式 1個32位的遮蔽位模式 2個32位的識別符號列表模式,可以過濾2個識別符號id 2個16位的遮蔽位模式 4個16位的識別符號列表模式,可以過濾4個標準識別符號id 擴充...

關於STM32 CAN的過濾器 濾波器

1.在設定cantxmsg.stdid時注意需要將其右移一位,比如如下濾波器配置 can filterinitstructure.can filternumber 0 can filterinitstructure.can filtermode can filtermode idmask can f...