STM32 HAL库 CAN过滤器配置

之前在STM32 f407 CAN收发 基于HAL库和Cubemx配置_stm32f407can收发程序-CSDN博客这篇博文里写了一下配置CAN收发的方法,当时由于并没有使用过滤器的现实需求,所以就也没仔细研究。现在工作中确实需要用到过滤器了,有些项目中控制器和发动机ECU是连接在一路总线的,而发动机ECU会产生大量的报文,这就不得不配置过滤器了。

先放上配置过滤器的代码,然后再分析原理:

cpp 复制代码
CAN_FilterTypeDef  CAN2_filter1;  // Define the filter structure
// parameter of the filter
CAN2_filter1.FilterBank = 14;      /* The filter number can be set from 0 to 27
									  depending on the setting of SlaveStartFilterBank */
CAN2_filter1.FilterMode = CAN_FILTERMODE_IDMASK;  // 
CAN2_filter1.FilterScale = CAN_FILTERSCALE_32BIT; // 
CAN2_filter1.FilterIdHigh = (0x18F60000 >> 13) & 0xFFFF;
CAN2_filter1.FilterIdLow = (0x18F60000 << 3) & 0xFFF8;
CAN2_filter1.FilterMaskIdHigh = (0xFFFF0000 >> 13) & 0xFFFF;   
CAN2_filter1.FilterMaskIdLow = (0xFFFF0000 << 3) & 0xFFF8;      
CAN2_filter1.FilterFIFOAssignment = CAN_RX_FIFO1; // FIFO1 for CAN2
CAN2_filter1.FilterActivation = ENABLE;           // 
CAN2_filter1.SlaveStartFilterBank = 13;           
// Configure CAN2 filter
while(HAL_CAN_ConfigFilter(&hcan2, &CAN2_filter1) != HAL_OK); 

首先,CAN1_filter1.SlaveStartFilterBank这个参数怎么设置?

**比如上面的CAN2_filter1.SlaveStartFilterBank = 13,就是把0~12 号过滤器给 CAN1,13~27 号过滤器给 CAN2,**然后CAN2_filter1.FilterBank就是在13~27中选出来的数字

小声BB:我觉得把SlaveStartFilterBank放在FilterBank之前配置其实更合理也更易于理解,因为只有SlaveStartFilterBank配置好之后才能确定FilterBank的可选范围。但目前好像所有的手册和教程都是先配置FilterBank

然后就是最重要的四个参数:

这张表很好的概括了设置方法:

要看懂这张表,首先要明白掩码的意义。放张图,不细说:

然后必须要明白,标准ID是11位,扩展ID是29位!

**所以上面那张大图中上面那两块的STID实际上代表的是扩展ID的高11位!**这是这张广泛流传的图很caodan的一点,非常容易让人产生困惑!

至于IDE,RTR,不用管,设置为0就行了。其他的地方都比较好理解了,下面直接举例:

例1:32位掩码模式,接收0x18F6开头的扩展ID

cpp 复制代码
  CAN2_filter1.FilterMode = CAN_FILTERMODE_IDMASK;  // 
  CAN2_filter1.FilterScale = CAN_FILTERSCALE_32BIT; // 
  CAN2_filter1.FilterIdHigh = (0x18F60000 >> 13) & 0xFFFF;
  CAN2_filter1.FilterIdLow = (0x18F60000 << 3) & 0xFFF8;
  CAN2_filter1.FilterMaskIdHigh = (0xFFFF0000 >> 13) & 0xFFFF;   
  CAN2_filter1.FilterMaskIdLow = (0xFFFF0000 << 3) & 0xFFF8;     

FilterIdHigh储存ID的高16位,往右移13位就是去掉了13位的低位! FilterIdLow储存低13位,往左移3位是给"IDE,RTR,0"让位置,以及&0xFFF8,也是为了空出"IDE,RTR,0"的位置!

例2:16位列表模式,接受0x0F0,0x0F1,0x0F2这三个ID

cpp 复制代码
  CAN1_filter1.FilterMode = CAN_FILTERMODE_IDLIST;  // 
  CAN1_filter1.FilterScale = CAN_FILTERSCALE_16BIT; // 
  CAN1_filter1.FilterIdHigh = 0x0F0 << 5;           // 
  CAN1_filter1.FilterIdLow = 0x0F1 << 5;            // 
  CAN1_filter1.FilterMaskIdHigh = 0x0F2 << 5;       // 
  CAN1_filter1.FilterMaskIdLow = 0x0000; 

多组过滤器如何配置?

多写几组多调用几次HAL_CAN_ConfigFilter,记得SlaveStartFilterBank要一致,FilterBank要不同!

相关推荐
AI的探索之旅7 小时前
AI辅助原理图评审:电源去耦、BOOT引脚、VCAP——19项逐一核查,遗漏?不存在的
人工智能·vscode·嵌入式硬件
茯苓gao7 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
GeekArch8 小时前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
Freedom_my8 小时前
STM32项目3
stm32·单片机·嵌入式硬件
国科安芯9 小时前
星间光链路:AS32S601型抗辐射MCU在空间激光通信终端控制中的技术实现
服务器·网络·单片机·嵌入式硬件·物联网·安全·信息与通信
小李不困还能学11 小时前
基于 51 单片机的8 路抢答器设计教程
单片机·嵌入式硬件·mongodb·抢答器
萌动的小火苗11 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件
振浩微433射频芯片12 小时前
工业遥控器总在关键时刻“掉链子”?——433MHz芯片方案如何破局
网络·单片机·嵌入式硬件·物联网·工业遥控
blevoice12 小时前
抖抖燃脂机单 AC6966B 主控调试踩坑:Type-C 整机供电喇叭无声排障
c语言·开发语言·单片机
三易串口屏13 小时前
三易串口屏开发教程:如何使用键盘控件输入参数并发送给单片机
单片机·嵌入式硬件·串口屏·三易串口屏·键盘控件