STM32 双CAN中Filter配置

过滤器配置示例代码:

 1     CAN_FilterConfTypeDef can_filter;
 2
 3   /* CAN‘s filter banks configuration. */
 4 //  can_filter.BankNumber = 5;                      // Valid after the last time configration.
 5     can_filter.FilterNumber = 3;
 6     can_filter.FilterMode = CAN_FILTERMODE_IDMASK;
 7     can_filter.FilterScale = CAN_FILTERSCALE_32BIT;
 8     can_filter.FilterIdHigh = 0;
 9     can_filter.FilterIdLow = 0;
10     can_filter.FilterMaskIdHigh = 0;
11     can_filter.FilterMaskIdLow = 0;
12     can_filter.FilterFIFOAssignment = CAN_FIFO0;
13     can_filter.FilterActivation = ENABLE;
14     HAL_CAN_ConfigFilter(&hcan1, &can_filter);        // Only CAN1 own filter banks, CAN2 just read it.
15
16 //  can_filter.BankNumber = 5;                      // Valid after the last time configration.
17     can_filter.FilterNumber = 4;
18     can_filter.FilterMode = CAN_FILTERMODE_IDMASK;
19     can_filter.FilterScale = CAN_FILTERSCALE_32BIT;
20     can_filter.FilterIdHigh = 0;
21     can_filter.FilterIdLow = 0;
22     can_filter.FilterMaskIdHigh = 0;
23     can_filter.FilterMaskIdLow = 0;
24     can_filter.FilterFIFOAssignment = CAN_FIFO0;
25     can_filter.FilterActivation = ENABLE;
26     HAL_CAN_ConfigFilter(&hcan1, &can_filter);        // Only CAN1 own filter banks, CAN2 just read it.
27
28 //  can_filter.BankNumber = 5;                      // Valid after the last time configration.
29     can_filter.FilterNumber = 5;
30     can_filter.FilterMode = CAN_FILTERMODE_IDMASK;
31     can_filter.FilterScale = CAN_FILTERSCALE_32BIT;
32     can_filter.FilterIdHigh = 0;
33     can_filter.FilterIdLow = 0;
34     can_filter.FilterMaskIdHigh = 0;
35     can_filter.FilterMaskIdLow = 0;
36     can_filter.FilterFIFOAssignment = CAN_FIFO0;
37     can_filter.FilterActivation = ENABLE;
38     HAL_CAN_ConfigFilter( &hcan1, &can_filter );      // Only CAN1 own filter banks, CAN2 just read it.
39
40   can_filter.BankNumber = 5;                        // Valid after this time configration.
41     can_filter.FilterNumber = 6;
42     can_filter.FilterMode = CAN_FILTERMODE_IDMASK;
43     can_filter.FilterScale = CAN_FILTERSCALE_32BIT;
44     can_filter.FilterIdHigh = 0;
45     can_filter.FilterIdLow = 0;
46     can_filter.FilterMaskIdHigh = 0;
47     can_filter.FilterMaskIdLow = 0;
48     can_filter.FilterFIFOAssignment = CAN_FIFO0;
49     can_filter.FilterActivation = ENABLE;
50     HAL_CAN_ConfigFilter( &hcan1, &can_filter );      // Only CAN1 own filter banks, CAN2 just read it.

请注意:

  1. 以上配置均通过调用 "HAL_CAN_ConfigFilter( &hcan1, &can_filter)" 生效。这是因为STM32F107中的双路CAN共用过滤器组,而且过滤器组寄存器与CAN1配置寄存器在物理上是挨着的,HAL库将这些寄存器合并在一个结构里访问而已。

 1 /**
 2   * @brief Controller Area Network
 3   */
 4
 5 typedef struct
 6 {
 7   __IO uint32_t MCR;
 8   __IO uint32_t MSR;
 9   __IO uint32_t TSR;
10   __IO uint32_t RF0R;
11   __IO uint32_t RF1R;
12   __IO uint32_t IER;
13   __IO uint32_t ESR;
14   __IO uint32_t BTR;
15   uint32_t  RESERVED0[88];
16   CAN_TxMailBox_TypeDef sTxMailBox[3];
17   CAN_FIFOMailBox_TypeDef sFIFOMailBox[2];
18   uint32_t  RESERVED1[12];
19   __IO uint32_t FMR;
20   __IO uint32_t FM1R;
21   uint32_t  RESERVED2;
22   __IO uint32_t FS1R;
23   uint32_t  RESERVED3;
24   __IO uint32_t FFA1R;
25   uint32_t  RESERVED4;
26   __IO uint32_t FA1R;
27   uint32_t  RESERVED5[8];
28   CAN_FilterRegister_TypeDef sFilterRegister[28];
29 } CAN_TypeDef;

   显然对于CAN2->FMR及后面的寄存器没有意义。

  2. 最后一组过滤器配置中使用了 “can_filter.BankNumber” 项。作用是将过滤器组分成两个段,第一段为CAN1使用(范围是:0~BankNumber-1),第二段为CAN2使用(范围是:BankNumber~27)。

也就是说当CAN1上收到消息,STM32会在0~BankNumer-1这些过滤器中依次查询是否通过过滤,如果通过则将消息放入配置好的CAN1的FIFO里面等待使用,否则就丢弃。

当CAN2上收到消息,STM32会在BankNumer~27这些过滤器中依次查询是否通过过滤,如果通过则将消息放入配置好的CAN2的FIFO里面等待使用,否则就丢弃。

上述代码配置了四组过滤器(滤波内容无意义,这里只讨论过滤器组是否可用)。

  1. 编号为3的过滤器

  2. 编号为4的过滤器

  3. 编号为5的过滤器

  4. 编号为6的过滤器

并在最后一组配置中使BankNumber=5,意味着CAN1可以使用编号为3,4的过滤器,CAN2可以使用编号为5,6的过滤器。

结论:STM32F107中CAN1和CAN2共用过滤器组,通过FMR寄存器中的CAN2SB段将过滤器组分为两段分别给CAN1和CAN2使用,也可以完全配置给一路CAN使用。应该说增加了CAN的使用灵活性,但配套的API却不全面,难以使用。

最后附上BankNumber配置不同的值时的测试结果:


BankNumber(FMR->CAN2SB)


对于CAN1生效的过滤器段


对于CAN2生效的过滤器段


0


0


0~27


num = 1~27


0~num-1


num~27

时间: 2024-10-12 13:28:46

STM32 双CAN中Filter配置的相关文章

stm32编译前为什么要配置keil中C/C++中的define 和include Paths?

这是Keil与编译器的一个相互通信的过程,准确的来说,是编译器读取Keil的配置 ARM系列的有一些公司的库编译器,是与Keil的一些配置通信的. 比如你说的那个 Define,include path 一般来说,我们用Keil做51或者STR710等等一些单片机的程序时候,不需要配置刚才的两个选项,为什么? 因为C51和ARM7的编译器不去读取上述的配置. 而Cortex-M3编译器,则读取上述的配置,并转换成自己的内编译器配置 比如:你在Define里面写:THIS_MY_DEF 那么,编译

JSP中filter详解以及应用实例(转载)

filter功能.它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链). 一个filter 包括: 1. 在servlet被调用之前截获; 2. 在servlet被调用之前检查servlet reques

Maven(一)——如何在Windows操作系统中安装配置Maven环境

今天难得的周末,借此难的机会总结一下关于maven的一些操作: 1.在安装maven之前要确认计算机已经安装并配置了JDK: 2.下载maven: maven-3.0.3:http://download.csdn.net/detail/wangshuxuncom/7367413 maven-3.0.5:http://download.csdn.net/detail/wangshuxuncom/7551799 说明:上述资源均免费下载 这里选择maven-3.0.3来演示安装.将maven-3.0

转 Java中Filter、Servlet、Listener的学习

1.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链). 一个Filter包括: 1).在servlet被调用之前截获; 2).在servlet被调用之前检查serv

Archlinux 下Intel + NVIDIA 双显卡3D 游戏配置([email protected])

贴吧里问这问那中午睡醒后做好的,下午打了几场dota2 感觉流畅度还算很不错的,写点东西记录一下.用Archlinux 的一般来说都会用搜索引擎,所以只说下需要注意的地方即可. 1. steam 自带的OpenGL 库是过时的,运行可能会抱怨"Cannot find OpenGL GX" 之类的东西,看ArchWiki 「steam」条目,删除steam 自带的几个库. 2. 但是删除了steam 自带的那些库之后你需要在系统中安装新版的库,除去64 位的库之外(不可能还有人在用32

Java中Filter、Servlet、Listener的学习

1.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链). 一个Filter包括: 1).在servlet被调用之前截获; 2).在servlet被调用之前检查serv

stm32工程建立中关于宏定义和启动文件的选择

在STM32的学习过程中,第一步关于stm32工程的建立就会难倒很多人,因为他不像其他AVR 51单片机这些,options中的配置比较复杂,其中最让人头疼的就是关于c/c++ compiler选项中preprocessor这个选择框,现在我就对其中的两项进行说明,一是为了让以后学习STM32的同学能更快的了解,二是为了让我自己更好的复习. 如上图所示  其中 additional include directories下面的框需要添加工程内头文件所在的路径,'$PROJ_DIR$'表示的是工程

Java中Filter、Servlet、Listener的学习 (转)

1.Filter的功能 filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链). 一个Filter包括: 1).在servlet被调用之前截获; 2).在servlet被调用之前检查ser

SiteMesh在项目中的配置

SiteMesh在项目中的配置 首先在web.xml里面增加siteMesh的配置: <filter> <filter-name>sitemesh</filter-name> <filter-class> com.opensymphony.module.sitemesh.filter.PageFilter </filter-class> </filter> <filter-mapping> <filter-name&