欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

stm32 CAN过滤器组

程序员文章站 2022-04-02 10:40:27
...

在互联型产品中, CAN1和CAN2分享28个过滤器组
其它STM32F103xx系列产品中有14个过滤器组

位宽设置
stm32 CAN过滤器组

四种配置方式:
1个32位的屏蔽位模式
2个32位的标识符列表模式,可以过滤2个标识符id
2个16位的屏蔽位模式
4个16位的标识符列表模式,可以过滤4个标准标识符id

扩展标识符必须选择32位宽

标识符列表模式
在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一
个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符
相同

CAN_FilterInitStructure.CAN_FilterNumber = 0; //过滤器组0(FM1R)
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
//第一个标识符id(FR1)- 标准标识符举例
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x123 << 5;  //根据位宽设置图
CAN_FilterInitStructure.CAN_FilterIdLow = CAN_ID_STD;   //选择标准标识符
//第二个标识符id(FR2)- 扩展标识符举例
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x321 << 3 | CAN_ID_EXT; //根据位宽设置图 | 选择扩展标识符

发送方标识符id必须是0x123或0x321

屏蔽位模式
屏蔽位模式可以过滤出一组标识符

//标准标识符举例
CAN_FilterInitStructure.CAN_FilterNumber = 0; //过滤器组0(FM1R)
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x123 << 5;
CAN_FilterInitStructure.CAN_FilterIdLow = CAN_ID_STD;   //选择标准标识符
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x23 << 5;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0;

CAN_FilterIdx:期望的标识符id
CAN_FilterMaskIdx:屏蔽位。关心的位

期望的标识符id:
stm32 CAN过滤器组
关心的位:
只关心为1的位,必须和期望的标识符id位一致。其他位是多少不关心
stm32 CAN过滤器组

优先级规则

位宽为32位的过滤器,优先级高于位宽为16位的过滤器
对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式
位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高