STM32 CAN过滤器细节

STM32 CAN过滤器细节

简介

  • 每组筛选器包含2个32位的寄存器,分别为CAN_FxR1CAN_FxR2,它们用来存储要筛选的ID或掩码

在这里插入图片描述

四种模式

模式说明
32位掩码模式CAN_FxR1存储ID, CAN_FxR2存储哪个位必须要与CAN_FxR1中的ID一致 , 2个寄存器表示1组掩码。
32位标识符模式CAN_FxR1和CAN_FxR2各存储1个ID, 2个寄存器表示2个筛选的ID
16位掩码模式CAN_FxR1高16位存储ID, 低16位存储哪个位必须要与高16位的ID一致; CAN_FxR2高16位存储ID, 低16位存储哪个位必须要与高16位的ID一致 2个寄存器表示2组掩码。
16位标识符模式CAN_FxR1和CAN_FxR2各存储2个ID, 2个寄存器表示4个筛选的ID

过滤器结构体 CAN_FilterInitTypeDef

在这里插入图片描述

  • CAN_FilterIdHigh
    • CAN_FilterIdHigh成员用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的高16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。
  • CAN_FilterIdLow
    • 类似地, CAN_FilterIdLow成员也是用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的低16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。
  • CAN_FilterMaskIdHigh
    • CAN_FilterMaskIdHigh存储的内容分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdHigh相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdHigh成员对应的掩码,与CAN_FilterIdLow组成一组筛选器。
  • CAN_FilterMaskIdLow
    • 类似地, CAN_FilterMaskIdLow存储的内容也分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdLow相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdLow成员对应的掩码,与CAN_FilterIdLow组成一组筛选器。
  • CAN_FilterFIFOAssignment
    • 本成员用于设置当报文通过筛选器的匹配后,该报文会被存储到哪一个接收FIFO,它的可选值为FIFO0或FIFO1(宏CAN_Filter_FIFO0/1)。
  • CAN_FilterNumber
    • 本成员用于设置筛选器的编号,即本过滤器结构体配置的是哪一组筛选器, CAN一共有28个筛选器,所以它的可输入参数范围为0-27。
  • CAN_FilterMode
    • 本成员用于设置筛选器的工作模式,可以设置为列表模式(宏CAN_FilterMode_IdList)及掩码模式(宏CAN_FilterMode_IdMask)。
  • CAN_FilterScale
    • 本成员用于设置筛选器的尺度,可以设置为32位长(宏CAN_FilterScale_32bit)及16位长(宏CAN_FilterScale_16bit)。
  • CAN_FilterActivation
    • 本成员用于设置是否激活这个筛选器(宏ENABLE/DISABLE)。

代码示例

32位掩码模式

  • 0x581
    • 0101 1000 0001
  • 0x582
    • 0101 1000 0010
  • 也就是忽略倒数两位,可同时接收0x581和0x582
void CAN_Filter_Config(void) {
    // 定义一个CAN_FilterInitTypeDef结构体变量,用于配置CAN过滤器
    CAN_FilterInitTypeDef CAN_Filter_InitStruct;

    // 设置过滤器编号,这里使用编号14。CAN控制器可能支持多个过滤器,编号用于区分它们。
    CAN_Filter_InitStruct.CAN_FilterNumber = 14;

    // 设置过滤器模式为掩码模式。在掩码模式下,接收的消息ID会与掩码进行逻辑与操作,结果与ID比较来决定是否接收消息。
    CAN_Filter_InitStruct.CAN_FilterMode = CAN_FilterMode_IdMask;

    // 设置过滤器的规模为32位。这意味着过滤器将使用32位的ID和掩码进行匹配。
    CAN_Filter_InitStruct.CAN_FilterScale = CAN_FilterScale_32bit;

    // 设置过滤器的ID高位部分。因为ID是32位,这里只需要设置高16位。ID被左移5位以匹配32位寄存器的格式。
    // 这里以0x581为例,作为需要接收的ID之一。
    CAN_Filter_InitStruct.CAN_FilterIdHigh = (0x581 << 5) & 0xFFFF;

    // 设置过滤器的ID低位部分。在32位模式下,通常将其设置为0。
    CAN_Filter_InitStruct.CAN_FilterIdLow = 0x0000;

    // 设置掩码的高位部分。掩码确定了哪些位需要匹配。这里0x7FC左移5位,忽略ID的最后两位,允许0x581和0x582通过。
    CAN_Filter_InitStruct.CAN_FilterMaskIdHigh = (0x7FC << 5) & 0xFFFF;

    // 设置掩码的低位部分。在32位模式下,通常将其设置为0。
    CAN_Filter_InitStruct.CAN_FilterMaskIdLow = 0x0000;

    // 指定匹配到的消息应该被存储在哪个FIFO中。CAN控制器通常有多个接收FIFO。
    CAN_Filter_InitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;

    // 启用过滤器。在配置完所有参数后,需要将过滤器激活,以开始对传入的消息进行过滤。
    CAN_Filter_InitStruct.CAN_FilterActivation = ENABLE;

    // 使用前面设置的参数初始化CAN过滤器。这一步是将上面的配置应用到硬件上。
    CAN_FilterInit(&CAN_Filter_InitStruct);

}

32位标识符模式

  • 同时接收0x581和0x582
void CAN_Filter_Config(void) {
    // 定义一个CAN_FilterInitTypeDef结构体变量,用于配置CAN过滤器
    CAN_FilterInitTypeDef CAN_Filter_InitStruct;

    // 设置过滤器编号,这里使用编号14。CAN控制器可能支持多个过滤器,编号用于区分它们。
    CAN_Filter_InitStruct.CAN_FilterNumber = 14;

    // 设置过滤器模式为标识符列表模式。在这种模式下,可以直接指定要接收的消息ID。
    CAN_Filter_InitStruct.CAN_FilterMode = CAN_FilterMode_IdList;

    // 设置过滤器的规模为32位。这意味着过滤器将直接比较32位的ID。
    CAN_Filter_InitStruct.CAN_FilterScale = CAN_FilterScale_32bit;

    // 设置第一个ID。在32位标识符模式下,将0x581左移5位后赋值给CAN_FilterIdHigh。
    // 左移5位是因为在硬件中,标识符通常需要对齐到特定的位置。
    CAN_Filter_InitStruct.CAN_FilterIdHigh = (0x581 << 5) & 0xFFFF;

    // 在32位模式下,ID的低16位不用设置,所以赋值为0。
    CAN_Filter_InitStruct.CAN_FilterIdLow = 0x0000;

    // 设置第二个ID。在32位标识符模式下,将0x582左移5位后赋值给CAN_FilterMaskIdHigh。
    // 尽管变量名包含“Mask”,在标识符列表模式下,这里实际上用于存放第二个ID。
    CAN_Filter_InitStruct.CAN_FilterMaskIdHigh = (0x582 << 5) & 0xFFFF;

    // 在32位模式下,第二个ID的低16位同样不用设置,所以赋值为0。
    CAN_Filter_InitStruct.CAN_FilterMaskIdLow = 0x0000;

    // 指定匹配到的消息应该被存储在哪个FIFO中。CAN控制器通常有多个接收FIFO。
    CAN_Filter_InitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;

    // 启用过滤器。在配置完所有参数后,需要将过滤器激活,以开始对传入的消息进行过滤。
    CAN_Filter_InitStruct.CAN_FilterActivation = ENABLE;

    // 使用前面设置的参数初始化CAN过滤器。这一步是将上面的配置应用到硬件上。
    CAN_FilterInit(&CAN_Filter_InitStruct);

}

AN_FilterActivation = ENABLE;

// 使用前面设置的参数初始化CAN过滤器。这一步是将上面的配置应用到硬件上。
CAN_FilterInit(&CAN_Filter_InitStruct);

}


  • 41
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F407的CAN通信接口具有丰富的过滤器设置功能,通过设置过滤器可以过滤CAN总线上的消息,只接收特定的消息。以下是stm32f407CAN通信过滤器的设置方法: 1. 首先,配置CAN的工作模式为过滤器模式。可以通过CAN的控制寄存器(CAN_CTLR)来设置工作模式。 2. 配置过滤器的数量和模式。通过CAN过滤器数量寄存器(CAN_FMR)设置需要使用的过滤器数量。可以选择单个过滤器模式或双个过滤器模式。 3. 针对每个过滤器,设置过滤器编号、过滤器模式和过滤器掩码。可以通过CAN过滤器控制寄存器(CAN_FMCR)和CAN过滤器位寄存器(CAN_FiR)来分别设置过滤器控制和过滤器位。 4. 配置过滤器的类型和匹配规则。可以选择过滤器类型为屏蔽位模式或标识符模式,并设置过滤器的标识符和屏蔽位。 5. 配置过滤器的操作。可以通过CAN过滤器模式寄存器(CAN_FMR)来配置过滤器的操作,例如是否使能过滤器、是否使能过滤器的FIFO接收和是否使能过滤器的流控制。 通过以上步骤设置完毕后,可以使CAN模块根据过滤器的设置来接收特定的CAN消息。只有符合过滤器设置条件的CAN消息才会被接收和处理,其他不符合条件的消息会被过滤掉。 需要注意的是,过滤器的设置需要根据实际的应用需求进行调整。对于具体的过滤器设置细节,可以参考STM32F407的相关技术手册或参考资料,以获取更详细的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YRr YRr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值