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);

}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/553943.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

具有图形化衬底与空气腔反射镜混合结构的深紫外Micro-LED阵列芯片

具有倾斜侧壁结构的深紫外Micro-LED的侧壁反射率是影响器件光提取效率的重要因素。由于TM模式偏振光在发生全反射时&#xff0c;产生的倏逝波诱导的金属表面等离子激元降低了倾斜侧壁处的集成全向反射镜&#xff08;ODR&#xff09;的反射率&#xff0c;从而导致光提取效率降低…

【安全】查杀linux挖矿病毒 kswapd0

中毒现象 高cpu占用&#xff0c;使用top命令查看cpu使用率长时间50%以上&#xff0c;cpu占用异常的进程八成就是挖矿病毒进程 此病毒隐藏了自己&#xff0c;top命令无法查看到挖矿病毒进程&#xff0c;可通过sysdig命令找到隐藏进程 安装sysdig curl -s https://s3.amazonaw…

java大作业(9)--实现银行基本操作(第一遍)

一.题目&#xff1a; 二.代码&#xff1a; 实现代码&#xff1a; import java.util.Date; //银行账户类 class Account{public String accountid;public String name;public double balance;public Date creatTime;public Account(String accountid,String name, double bala…

虚拟天空解决方案,创造出令人惊叹的换天效果

在汽车视频领域&#xff0c;如何打破传统拍摄限制&#xff0c;呈现出更具创意和想象力的画面&#xff0c;成为众多企业和创作者追求的目标。美摄科技作为业界领先的视频技术提供商&#xff0c;凭借其强大的AI技术和三维渲染引擎&#xff0c;推出了全新的虚拟天空解决方案&#…

MediaStream使用webRtc多窗口传递

最近在做音视频通话&#xff0c;有个需求是把当前会话弄到另一个窗口单独展示&#xff0c;但是会话是属于主窗口的&#xff0c;多窗口通信目前不能直接传递对象&#xff0c;所以想着使用webRtc在主窗口和兄弟窗口建立连接&#xff0c;把主窗口建立会话得到的MediaStream传递给兄…

分布式搭载博客网站

一.运行环境&#xff1a; IP主机名系统服务192.168.118.128Server-WebLinuxWeb192.168.118.131Server-NFS-DNSLinuxNFS/DNS 二.基础配置 1. 配置主机名&#xff0c;hosts映射 [rootserver ~]# hostnamectl set-hostname Server-Web [rootserver ~]# hostname Server-Web [r…

大模型LLM架构--Decoder-Only、Encoder-Only、Encoder-Decoder

目录 1 LLM演变进化树 2 每种架构的优缺点 2.1 Decoder-Only 架构 2.2 Encoder-Only 2.3 Encoder-Decoder 参考文献&#xff1a; 1 LLM演变进化树 基于 Transformer 模型以非灰色显示&#xff1a;decoder-only 模型在右边的浅蓝色分支&#xff0c;encoder-only 模型在粉色…

【学习】测试新项目该如何高效的展开测试?需要做哪些规划?

当我们收到测试项目时&#xff0c;如何高效地展开测试是我们作为测试人员所要面临的一大挑战。测试是软件开发过程中不可或缺的一环&#xff0c;它确保了产品的质量&#xff0c;降低了出现问题的风险&#xff0c;提高了用户的满意度。因此&#xff0c;我们需要制定合理的测试计…

操作教程丨MaxKB+Ollama:快速构建基于大语言模型的本地知识库问答系统

2024年4月12日&#xff0c;1Panel开源项目组正式对外介绍了其官方出品的开源子项目——MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB是一款基于LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB的产品命名内涵为“Max …

java对接IPFS系统-以nft.storage为列

引言 之前我们已经说过了、NFT.Storage是一个基于IPFS的分布式存储服务&#xff0c;专门用于存储和管理非同质化代币&#xff08;NFT&#xff09;相关的数据和资产。它是由Protocol Labs和Pinata共同推出的服务。今天我们基于nft.storage为列、使用java对接打通这个ipfs分布式存…

成为程序员后的领悟与展望-ApiHug

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 选择一个…

【代码】Python3|Requests 库怎么继承 Selenium 的 Headers (2024,Chrome)

本文使用的版本&#xff1a; Chrome 124Python 12Selenium 4.19.0 版本过旧可能会出现问题&#xff0c;但只要别差异太大&#xff0c;就可以看本文&#xff0c;因为本文对新老版本都有讲解。 文章目录 1 难点解析和具体思路2 注意事项2.1 PDF 资源获取时注意事项2.2 Capabiliti…

关于老iPad 能够重新使用经过的一些列折腾

背景 搞了一台IPad air一代给家里老人看戏曲或者电视用,芯片是A7处理器,目前IOS系统是IOS12,也就是能支持的最后一个版本。并且可能是之前刷机问题,IPad基带丢失,显示无法连接激活服务器,无法进入系统。 本人没有MAC设备,没有相关越狱经验,没有黑苹果经验,一切都是从头…

制冷铜管焊接介绍

铜管是制冷装置的重要原材料&#xff0c;它主要有两种用途&#xff1a;①制作换热器。②制作连接管道和管件。常用的焊料类型有铜磷焊料、银铜焊料、铜锌焊料等。在焊接时要根据管道材料的特点&#xff0c;正确的选择焊料及熟练的操作&#xff0c;以确保焊接的质量。 1.1对同类…

基于springboot实现图书进销存管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现图书进销存管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了图书进销存管理系统的开发全过程。通过分析图书进销存管理系统管理的不足&#xff0c;创建了一个计算机管理图书进销…

QML QtObject轻量级非可视化元素

QtObject 理论1. 父指针形式代指子类2. 自定义组件中定义一些私有属性 理论 QtObject类型是一个非常轻量级且非可视元素&#xff0c;它只包含objectName属性&#xff0c;其本质上是QObject。 用途一般是两个&#xff1a; 父指针形式代指子类&#xff1b;自定义组件中定义一些…

Java基于SpringBoot+Vue的蜗牛兼职网系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Python零基础从小白打怪升级中~~~~~~~多线程

线程安全和锁 一、全局解释器锁 首先需要明确的一点是GIL并不是Python的特性&#xff0c;它是在实现Python解析器(CPython)时所引入的一个概念。 GIL全称global interpreter lock&#xff0c;全局解释器锁。 每个线程在执行的时候都需要先获取GIL&#xff0c;保证同一时刻只…

MySQL(2024.4.17)

目录 1. 什么是MySQL的MVCC机制&#xff1f; 2. 如何理解InnoDB的Next-Key Lock机制&#xff1f; 3. 快照读和当前读的区别&#xff1f; 4. 如何在SQL语句中触发当前读&#xff1f; 5. MySQL默认的隔离级别是什么&#xff1f; 6. 如何避免在使用当前读时可能出现的死锁问…

Docker部署metahuman-stream数字人系统

metahuman-stream是基于ernerf模型的流式数字人&#xff0c;实现音视频同步对话。 metahuman-stream xtts-streaming-server srs 部署 srs # rtmpserver docker run -it -d \ -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 8000:8000/udp -p 10080:10080/udp \ --name srs \ reg…
最新文章