stm32 CAN过滤器组

在互联型产品中, 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过滤器组
文章图片

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

    推荐阅读