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 协程 参考《愿神》游戏
在《愿神》的提瓦特大陆上,每一位冒险者都拥有自己的独特力量——“神之眼”,他们借助元素之力探索广袤的世界,解决谜题,战胜敌人。而在提瓦特的科技树中,存在着一项名为“协同程序”的高级秘术,它使冒险者…...
【C++】三大图像加载库实战对比:libpng、FreeImage与stb_image的选型指南
1. 为什么需要图像加载库? 在C项目中处理图像文件时,直接操作二进制数据就像用螺丝刀吃牛排——理论上可行,但实际体验极其糟糕。图像加载库就是帮我们解决这个问题的餐具套装。以最常见的PNG文件为例,它可能包含调色板、压缩数据…...
HuTool代理请求遇阻:深入解析HTTP/1.1 407 Proxy Authentication Required的成因与实战解决方案
1. 当HuTool遇上407:代理认证失败的典型场景 最近在项目中使用HuTool发送HTTPS请求时,突然遇到一个让人头疼的错误——HTTP/1.1 407 Proxy Authentication Required。这个错误就像高速公路上的收费站,明明已经交了通行费(设置了代…...
FastAdmin+PHPStudy保姆级安装教程:从下载到配置数据库的完整流程
FastAdminPHPStudy极速开发环境搭建实战指南 作为一名长期使用FastAdmin框架的开发者,我深知一个顺畅的本地开发环境对项目效率的影响。本文将带你从零开始,用最简洁的方式完成FastAdmin与PHPStudy的完美搭配,避开那些新手常踩的"坑&quo…...
ReaR实战:构建企业级Linux裸机灾难恢复体系
1. 为什么企业需要裸机灾难恢复方案 想象一下这样的场景:凌晨三点,机房突然响起刺耳的警报声。值班工程师冲进机房,发现核心数据库服务器已经宕机,硬盘指示灯全灭——这是一次严重的硬件故障。更糟糕的是,这台服务器上…...
【悬疑言情小说推荐】《血语玫瑰》
《血语玫瑰》国际标准书号:ISBN:978-986-6364-30-3 作者:追月逐花 本书地址:http://e.dangdang.com/products/1901197341.html 每个女孩都期待男友年轻英俊、家境优渥、学识出众,而 “魔鬼” 恰好符合所有条件&…...
热门编程语言全攻略:从入门到职业选手
目录 引言:为什么选择一门“热门”编程语言 1.1 编程语言热度背后的产业逻辑 1.2 初学者如何选择第一门语言 1.3 全栈/进阶者如何扩展技术栈 Python:万能胶水与人工智能首选 2.1 语言定位与核心应用领域 2.2 语法特点:简洁优雅的伪代码 2.3 学…...
注册表CLSID权限控制技术:通过权限管理实现IDM永久试用
注册表CLSID权限控制技术:通过权限管理实现IDM永久试用 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 问题引入:IDM试用期管理的技术困境…...
OpenClaw技能开发入门:为Qwen3-VL:30B编写图片翻译插件
OpenClaw技能开发入门:为Qwen3-VL:30B编写图片翻译插件 1. 为什么需要自定义技能开发 去年冬天,我接手了一个跨国团队的文档协作项目,每天需要处理大量包含多语言图片的飞书消息。当我在深夜第三次手动将日文截图粘贴到翻译软件时ÿ…...
知识管理新范式:跨平台无缝迁移与团队协作效能提升指南
知识管理新范式:跨平台无缝迁移与团队协作效能提升指南 【免费下载链接】outline Outline 是一个基于 React 和 Node.js 打造的快速、协作式团队知识库。它可以让团队方便地存储和管理知识信息。你可以直接使用其托管版本,也可以自己运行或参与开发。源项…...
OpenClaw+Qwen3.5-4B-Claude:5个提升效率的CLI增强技能
OpenClawQwen3.5-4B-Claude:5个提升效率的CLI增强技能 1. 为什么需要CLI增强技能 作为一个长期与终端打交道的开发者,我发现自己每天要重复输入大量相似命令。比如查看日志时要反复输入tail -f加路径,管理Docker时要不断敲docker ps -a。更…...
