STM32 CAN过滤器细节

news2024/11/26 14:33:16

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.coloradmin.cn/o/1604316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络配置和操作命令

网络配置命令 Linux系统中最常用的网络配置命令包括 ifconfig route 其中 ifconfig 用来查看和配置网络接口 通常是网卡 信息 包括网络接口设备的 IP 地址 掩码等 route 用来管理 Linux系统内核中的路由表 它最大的用途就是用来设定静态的路由表项 通常是在系统用 ifconfig 配…

内置管线升级到SBP,如何复用之前打包的AssetBundle

1&#xff09;内置管线升级到SBP&#xff0c;如何复用之前打包的AssetBundle 2&#xff09;安卓真机&#xff0c;在Unity 2021.3.31版本下Buffer数据异常 3&#xff09;URP里CullResults.CreateSharedRendererScene下面的消耗 4&#xff09;移动端是否支持曲面细分着色 这是第3…

Element——组件

element官网 https://element.eleme.cn/#/zh-CN/component/layout vscode格式化快捷键&#xff1a;shiftaltf table表格 <template><el-table:data"tableData"style"width: 100%"><el-table-columnprop"date"label"日期…

idea在controller或者service使用ctrl+alt+b进入方法后,如何返回到 进入前的那一层

idea在controller或者service使用ctrlaltb进入方法后&#xff0c;如何返回到进入方法的最外层 解决方案使用 ctrlalt ← /→← /→ 键盘上的左右键盘

Linux 搭建私有yum源仓库

一、环境准备 IP系统版本作用192.168.140.155CentOS 7.9.2009yum源仓库192.168.140.153CentOS 7.9.2009测试 准备两台服务器&#xff0c;一台作为yum源仓库&#xff0c;另一台作为测试使用。 二、搭建yum源服务器 &#xff08;无法连接外网的情况&#xff0c;需要去官网下载镜…

MobX入门指南:快速上手状态管理库

一、什么是MobX MobX 是一个状态管理库&#xff0c;它可以让你轻松地管理应用程序的状态&#xff0c;并且可以扩展和维护。它使用观察者模式来自动传播你的状态的变化到你的 React 组件。 二、安装及配置 安装 MobX 和 MobX-React&#xff1a;你可以使用 npm 或 yarn 安装这…

MDK stm32怎么生成bin文件

第一种 D:\Keil_v5\ARM\ac5.6\bin\fromelf.exe --bin -o ../../Output/atk_f407.bin ../../Output/atk_f407.axf 空格解析 D:\Keil_v5\ARM\ac5.6\bin\fromelf.exe一个空格--bin一个空格-o两个空格../../Output/atk_f407.bin ../../Output/atk_f407.axf &#xff08;注意后…

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

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

爬虫 | 网易新闻热点数据的获取与保存

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目是一个简单的网络爬虫&#xff0c;用于从网易新闻的热点新闻列表中提取标题和对应的链接&#xff0c;并将提取到的数据保存到一个 CSV 文件中。 目录 一、技术栈 二、功能说明 三、注意事项 四、代码解析 1. 导入所需…

html+vue编写分页功能

效果&#xff1a; html关键代码&#xff1a; <div class"ui-jqgrid-resize-mark" id"rs_mlist_table_C87E35BE"> </div><div class"list_component_pager ui-jqgrid-pager undefined" dir"ltr"><div id"pg…

MySQL(2024.4.17)

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

【LLM】认识LLM

文章目录 1.LLM1.1 LLM简介1.2 LLM发展1.3 市面常见的LLM1.4 LLM涌现的能力 2.RAG2.1 RAG简介2.2 RAG 的工作流程2.3 RAG 和 Finetune 对比2.4 RAG的使用场景分析 3. LangChain3.1 LangChain简介3.2 LangChain的核心组件3.3 LangChain 入门 4.开发 RAG 应用的整体流程5. 环境配…

虚幻引擎源码版安装下载,点击GenerateProjectFiles.bat报错 error NU1101NuGet包问题解决参考方案

开发环境配置与源码安装使用 安装VS2022 按照官方文档安装需要的vs配置 虚幻引擎源代码下载 Epic里面下载的引擎与源代码引擎区别&#xff1a;Epic里面下载的引擎是已经编译过的它的源代码访问权限不完整&#xff0c;源代码版本提供比较完整引擎代码&#xff0c;并且可以修…

OpenHarmony社交分享类APP开发实战

介绍 本示例是一个社交分享类APP&#xff0c;搭建了不同的页面向用户提供获取社交信息等能力。为了减少频繁权限弹窗对用户的干扰&#xff0c;同时提供更小的授权范围&#xff0c;使用了安全控件做临时授权场景。当用户实际点击了某种类型的安全控件时&#xff0c;会由系统弹出…

uni.uploadFile上传图片后台接收不到数据

今天遇到一个很奇怪的问题&#xff0c;通过使用uni.uploadFile上传文件时后端接收不到文件&#xff0c;查过很多资料&#xff0c;原来是自定义了header的Content-Type问题。取消即可&#xff0c;另把自定义文件上传的代码贴出来。 分析&#xff1a;当我们加上请求头的时候 不…

Java中使用JTS对空间几何计算(距离、点在面内、长度、面积、相交等)模拟的大概写法

场景 基于GIS相关的集成系统&#xff0c;需要对空间数据做一些判断处理。比如读取WKT数据、点到点、点到线、点到面的距离&#xff0c; 线的长度、面的面积、点是否在面内等处理。 JTS (Java Topology Suite) Java拓扑套件&#xff0c;是Java的处理地理数据的API。 github地址&…

【NLP】大语言模型基础之Transformer结构

大语言模型基础之Transformer结构 1. Transformer结构总览2. 嵌入表示层2. 注意力层3. 前馈层4. 残差连接与层归一化5. 编码器和解码器结构参考文献 Transformer是一种深度学习模型架构&#xff0c;由Vaswani等人于2017年在论文《Attention is All You Need》中首次提出。它在自…

用友NC avatar接口文件上传漏洞

产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具&#xff0c;用友NC提供了一系列业务管理模块&#xff0c;包括财务会计、采购管理销售管理、物料管理、生产计划和人力资源管理等&#xff0c;帮助企业实现数字化转型和高效管理。 漏洞介绍 用友 NC avatar接口处…

【OpenHarmony】TDD-FUZZ环境配置

零、参考 1、AttributeError: ‘ElementTree‘ object has no attribute ‘getiterator‘&#xff1a;https://blog.csdn.net/suhao0911/article/details/110950742 一、创建工作目录 1、新建工作目录如&#xff1a;D:\0000_TDD_FUZZ\0000_ohos_tdd_fuzz。 2、gitee上下载 t…

前端网络---http缓存

什么是http缓存&#xff1f; 1、HTTP 缓存会存储与请求关联的响应&#xff0c;并将存储的响应复用于后续请求。 2、缓存的原理是在首次请求后保存一份请求资源的响应副本&#xff0c;当用户再次发起相同请求时&#xff0c;判断缓存是否命中&#xff0c;如果命中则将前面的响应…