CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
CAN_FilterInitStructure.CAN_FilterIdHigh=((0x1801B0A0<<3) >>16) &0xffff; //32位ID 左移3位是因为CAN ID只有29位,把高3位移除(高位在前)
CAN_FilterInitStructure.CAN_FilterIdLow=(0x1801B0A0<<3) &0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=((0x1800FFFF<<3) >>16) &0xffff; //32位MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=((0x1800FFFF<<3) &0xffff); //最后3位不做屏蔽,网上写的是((0x1800FFFF<<3) &0xffff)|0x02 最后3位分别是IDE(1为扩展帧),RTR(0为数据帧),0;最后3位是000,可以不对是否为扩展数据帧做判断
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0
以上是根据正点原子的程序修改的具有硬件过滤器功能;