问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32 CAN过滤器配置详解

创作时间:
作者:
@小白创作中心

STM32 CAN过滤器配置详解

引用
CSDN
1.
https://blog.csdn.net/m0_73636161/article/details/128123949

CAN过滤器基础知识

在使用STM32微控制器进行CAN总线通信时,过滤器是一个非常重要的概念。过滤器的主要作用是帮助接收器只接收感兴趣的CAN帧,而忽略其他无关的帧,从而提高系统的效率和可靠性。

过滤器的基本配置

STM32的bxCAN接收时必须使用过滤器接收。根据CAN外设数量的不同,过滤器的数量也会有所不同:

  • 只有CAN1:CAN1有14个过滤器
  • 有CAN1和CAN2:CAN1和CAN2共享28个过滤器
  • 有CAN1~3:CAN1和CAN2共享28个过滤器,CAN3有独立的14个过滤器

过滤器可以过滤CAN总线上帧的ID号,可以不处理不想接收的ID号,只接收想要的ID号。

过滤模式

过滤器总长度为64位,可以分为2个32位单元或4个16位单元。主要有两种过滤模式:

  • 掩码模式:由两个单元组成,通过掩码匹配。
  • 列表模式:由一个单元组成,ID号完全匹配即通过。

ID号对齐最高位(MSB)。仅32位单元可以过滤扩展ID。在列表模式下,scale为32时,每个过滤器的列表只能写入两个报文ID;若scale为16时,每个过滤器的列表最多可写入4个CAN ID。

掩码模式详解

掩码模式通过按位与运算来实现过滤。例如:

  • 匹配ID为0x200,掩码为0x000,则所有ID号都能通过
  • 匹配ID为0x200,掩码为0x700,则ID为0x200~0x2FF均可通过
  • 匹配ID为0x200,掩码为0x7FF,则只有0x200能通过

过滤器的工作模式包括:

  • 32位宽的掩码模式,配置过滤2个不同的ID号
  • 32位宽的列表模式,配置过滤4个不同的ID号
  • 16位宽的列表模式,配置过滤2个不同的ID号
  • 16位宽的掩码模式,配置过滤1个不同的ID号

过滤器的位宽包括16位和32位两种。

双接收中断

每个CAN有两个接收中断,对应两组接收邮箱(FIFO)。每个过滤器可以绑定一个CAN接收中断。经过过滤器过滤的帧会进入该过滤器绑定的接收中断对应的邮箱。匹配时,列表模式的优先级高于掩码模式,其次过滤器编号更小的优先级更高。

实验示例:使用CAN2过滤ID号

以STM32为例,展示如何配置CAN2过滤器:

  1. 列表模式配置
sFiterconfig.FilterActivation = CAN_FILTER_ENABLE;
sFiterconfig.FilterBank=14; // 过滤器编号,CAN2是14~27
sFiterconfig.FilterFIFOAssignment=CAN_FILTER_FIFO0; // 接收到的报文放入到FIFO0中
sFiterconfig.FilterMode=CAN_FILTERMODE_IDLIST; // 列表模式
sFiterconfig.FilterScale=CAN_FILTERSCALE_32BIT; // 设置32位宽
sFiterconfig.FilterIdHigh=0x200<<5; // 基本ID放入到STID中  
sFiterconfig.FilterIdLow=0x201<<5;
sFiterconfig.FilterMaskIdHigh=0x202<<5;
sFiterconfig.FilterMaskIdLow=0x203<<5;
sFiterconfig.SlaveStartFilterBank=14;
  1. 掩码模式配置
sFiterconfig.FilterActivation = CAN_FILTER_ENABLE;
sFiterconfig.FilterBank=15; // 过滤器编号,CAN2是14~27
sFiterconfig.FilterFIFOAssignment=CAN_FILTER_FIFO1;
sFiterconfig.FilterMode=CAN_FILTERMODE_IDMASK;
sFiterconfig.FilterScale=CAN_FILTERSCALE_16BIT;
sFiterconfig.FilterIdHigh=0x200<<5; // ID和掩码都要移5位
sFiterconfig.FilterMaskIdHigh=0x202<<5;
sFiterconfig.FilterIdLow=0x201<<5;
sFiterconfig.FilterMaskIdLow=0x203<<5;
sFiterconfig.SlaveStartFilterBank=14;

通过上述配置,可以实现对特定ID范围的过滤。

参考资料

  • CH4.2 CAN 第2讲 过滤器【南工骁鹰嵌入式软件培训】
  • STM32 CAN过滤器配置详解
  • 对于can通信过滤器的理解
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号