标准库这个地方设计的非常不好,需要用户手动做偏移计算。
例如,如果你想要接收EXTID为0x20000到0x27FFF的消息,你可以设置滤波器的高16位(FilterIdHigh)和低16位(FilterIdLow)来匹配这个范围。具体的设置方法如下
[C] 纯文本查看 复制代码 CAN_FilterInitTypeDef CAN_FilterInitStructure;
// 16位滤波器配置
CAN_FilterInitStructure.CAN_FilterNumber = 0; // 选择滤波器编号
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; // 标识符屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit; // 16位滤波器
// 根据需要接收的EXTID范围设置ID和掩码
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x20000 << 5) >> 16; // EXTID[17:15]设置为'001'
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; // 其他位设置为0
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x07FFF << 5) >> 16; // 掩码设置为'0011111111111111'
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; // 其他位设置为0
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; // 分配到FIFO 0
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; // 激活滤波器
CAN_FilterInit(&CAN_FilterInitStructure);
在上面的代码中,CAN_FilterIdHigh和CAN_FilterMaskIdHigh的设置决定了EXTID[17:15]的匹配规则。这个例子中,滤波器将会接收EXTID[17:15]为001的所有CAN消息1。
|