STM32 CAN过滤器细节
STM32 CAN过滤器细节
简介
- 每组筛选器包含2个32位的寄存器,分别为CAN_FxR1和CAN_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);
}
相关文章:

STM32 CAN过滤器细节
STM32 CAN过滤器细节 简介 每组筛选器包含2个32位的寄存器,分别为CAN_FxR1和CAN_FxR2,它们用来存储要筛选的ID或掩码 四种模式 模式说明32位掩码模式CAN_FxR1存储ID, CAN_FxR2存储哪个位必须要与CAN_FxR1中的ID一致 , 2个寄存器…...

网络编程(现在不重要)
目录 网络编程三要素与InetAddress类的使用 软件架构 面临的主要问题 网络编程三要素(对应三个问题) InetAddress的使用 TCP与UDP协议剖析与TCP编程案例(了解) TCP协议 UDP协议 例子 UDP、URL网络编程 URL:&…...

10-菜刀连接木马
找到了漏洞后,并且上传了木马之后才能使用的两款工具 中国菜刀和冰蝎 想办法获取别人的cookie,cookie中有session-id 一、中国菜刀 1、必须提前已经完成木马植入然后才能使用 2、木马必须是POST请求,参数自定义,在菜刀里给出…...
Unity数据持久化—Json存档
项目需求为: 1.实现存档列表,显示存档截图,可以查看之前保存的所有存档 2.点击存档直接加载到场景 首先,定义两个类,用于声明存档列表和存档所需要的List [System.Serializable] public class SaveData {//存储目标…...

基于SSM的在线学习系统的设计与实现(论文+源码)_kaic
基于SSM的在线学习系统的设计与实现 摘要 随着信息互联网购物的飞速发展,一般企业都去创建属于自己的管理系统。本文介绍了在线学习系统的开发全过程。通过分析企业对于在线学习系统的需求,创建了一个计算机管理在线学习系统的方案。文章介绍了在线学习系…...

数据库SQL语言实战(二)
目录 检索查询 题目一 题目二 题目三 题目四 题目五 题目六 题目七 题目八 题目九(本篇最难的题目) 分析 实现(两种方式) 模板 总结 检索查询 按照要求查找数据库中的数据 题目一 找出没有选修任何课程的学…...
idea错误地commit后如何处理
如果你想使用命令行重新初始化 Git 仓库,可以按照以下步骤进行: 删除该项目的.git文件夹 打开命令行终端。 切换到项目所在的目录,使用 cd 命令。 在项目目录下运行以下命令来重新初始化 Git 仓库 git init这将在当前目录下创建一个新的 Git …...
VRTK(Virtual Reality Toolkit)深入介绍
VRTK是一个为Unity引擎设计的开源虚拟现实(VR)开发框架,旨在简化和加速VR应用的开发过程。这个工具包包含了一系列的模块和预设,使得开发者可以快速集成标准的VR功能,如物体交互、环境导航、用户界面管理等。下面将对V…...
【LeetCode热题100】【贪心算法】划分字母区间
题目链接:763. 划分字母区间 - 力扣(LeetCode) 要将一个字符串划分为多个子串,要求每个字母只能出现在一个子串里面 如果一个字母的当前位置是它在这个字符串里面最后一次出现的位置,那么这里就应该划分出来成为子串…...

第二届数据安全大赛暨首届“数信杯”数据安全大赛数据安全积分争夺赛-东区预赛部分WP
这里写目录标题 检材下载:1.理论题2.数据安全:pb:Sepack: 3.数据分析:数据分析(1)数据分析1-1:数据分析1-2:数据分析1-3: 数据分析(3)数据分析3-1:数据分析3-2࿱…...
如何在Python中使用matplotlib库进行数据可视化?
如何在Python中使用matplotlib库进行数据可视化? 在Python中使用matplotlib库进行数据可视化 数据可视化是将数据以图形或图像的形式展示出来的过程,它有助于我们更好地理解和分析数据。在Python中,matplotlib是一个非常受欢迎的数据可视化…...

网工基础协议——TCP/UDP协议
TCP和UDP的不同点: TCP(Transmission Control Protocol,传输控制协议); UDP(User Data Protocol,用户数据报协议); TCP:传输控制协议,面向连接可靠的协议,只能适用于单播通信&…...

ClickHouse--16--普通函数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、日期函数1、时间或日期截取函数(返回非日期)2、时间或日期截取函数(返回日期)3、日期或时间日期生成函数 二、类…...

03-JAVA设计模式-组合模式
组合模式 什么是组合模式 组合模式(Composite Pattern)允许你将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端以统一的方式处理单个对象和对象的组合。组合模式让你可以将对象组合成树形结构,并且能像单独对象一…...
C++发票识别、发票查验接口示例,您的“发票管理专家”
发票识别发票查验接口。当财务人员在进行发票的数字化管理时,仅需一键上传发票图片,翔云发票识别接口即可快速、精准对发票的全票面信息进行提取,翔云发票查验接口可根据识别接口提取的发票信息实时联网进行真伪查验。助财务工作者从发票海洋…...

【电控笔记6.2】拉式转换与转移函数
概要 laplace:单输入单输出,线性系统 laplace 传递函数 总结...

第十五届蓝桥杯题解-数字接龙
题意:经过所有格子,并且不能进行交叉,走的下一个格子必须是当前格子值1%k,输出路径最小的那一条(有8个方向,一会粘图) 思路:按照8个方向设置偏移量进行dfs,第一个到达终…...

【vue】绑定事件 v-on
v-on 简写: clickkeyupkeydownkeyup.wkeyup.ctrl.a <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

【应用】SpringBoot-自动配置原理
前言 本文简要介绍SpringBoot的自动配置原理。 本文讲述的SpringBoot版本为:3.1.2。 前置知识 在看原理介绍之前,需要知道Import注解的作用: 可以导入Configuration注解的配置类、声明Bean注解的bean方法;可以导入ImportSele…...

中文编程入门(Lua5.4.6中文版)第十二章 Lua 协程 参考《愿神》游戏
在《愿神》的提瓦特大陆上,每一位冒险者都拥有自己的独特力量——“神之眼”,他们借助元素之力探索广袤的世界,解决谜题,战胜敌人。而在提瓦特的科技树中,存在着一项名为“协同程序”的高级秘术,它使冒险者…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
ffmpeg(三):处理原始数据命令
FFmpeg 可以直接处理原始音频和视频数据(Raw PCM、YUV 等),常见场景包括: 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装(如封装为 MP4、TS) 处理原始 YUV 视频…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...