STM32 CAN过滤器标识符学习笔记

news2024/11/27 16:52:32

最近看了下STM32 CAN 通讯其中标示符过滤器设置大有讲究。特别是你要使用ST库函数时,当过滤器工作在屏蔽模式下,并且你把屏蔽位设了1也就是标示符对应位必须全部匹配才能通过,这是由其要小心。

举个例子吧,过滤器长度为32位,模式为屏蔽模式,假如我要发送的标示符为0x1314;那过滤器设置如下

一、过滤器完全无效 接收到的标示符全部通过

0x1314 二进制码: 0000 0000 0000 0000 0001 0011 0001 0100

CAN_Filter xxxx xxxx xxxxxxxx xxxx xxxx xxxx xxxx

CAN_FilterMask 0000 0000 0000 0000 0000 0000 0000 0000

因为 CAN_FilterMask屏蔽寄存器所有位都是0 ,对应标示符全为“不关心”,也就是接收到数据的ID(标示符)不用与 CAN_Filter寄存器的任何一位进行匹配。

二、过滤器完全有效接收到的标示符要跟据MASK寄存器指定需要匹配的位进行比较

部分匹配

0x1314 二进制码: 0000 0000 0000 0000 0001 0011 0001 0100

CAN_Filter xxxx xxxx xxxxxxxx xxxx xxx1 xxxx xxxx

CAN_FilterMask 0000 0000 0000 0000 0000 0001 0000 0000

CAN_FilterMask 寄存器指定接收到的标示符要与第8位进行匹配,其他位不管。也就是说接收到的标示符第8位必须为1,否则报文就会被丢弃。

全部匹配

0x1314 二进制码: 0000 0000 0000 0000 0001 0011 0001 0100

CAN_Filter00000000000000000000 001100010100

CAN_FilterMask11111111111111111111 11111111 1111

这种情况最为严格,接收到的标示符必须每一位都得与过滤器中的标示符的每一位进行匹配,有一位不对报文就会被丢弃。(这个标示符匹配的工作是CAN 模块内部硬件自动完成的)

尤其是这个全部匹配模式,需要对过滤器设置非常清楚。(这里郁闷了半天)

首先这个寄存器是这样

如果分别设置标准帧和扩展帧的标识符过滤,每一位都需要匹配,那么需要这里的每一位发送和接受匹配都相同,也就是只接受这一个标识符的数据。

#define EXT_Fileter_ID (uint32_t)(0x1FFF1314)  // EXT模式下扩展帧的位数为[31:3],不超过限制均可设置
#define STD_Fileter_ID (uint32_t)(0x314)  // STD模式下标准帧STDID[11:0]最多12位,再多不配了
CAN_FilterInitStructure.CAN_FilterIdHigh = ((STD_Fileter_ID << 3 | CAN_ID_STD | CAN_RTR_DATA) & 0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = ((STD_Fileter_ID << 3 | CAN_ID_STD | CAN_RTR_DATA) & 0xFFFF); 
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xffff;

我将对应的发送和接受在过滤器ID都不需要匹配的情况下打印出来,防止因为某一位不匹配,系统丢弃我的数据,方便观察这个标识符是怎么控制匹配的。

设置 #define STD_Fileter_ID (uint32_t)(0x314) 

 可以匹配

如果超过STD_Fileter_ID 的设置范围,会是什么样呢?

 发现发送和接受不匹配了。如果设置

CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xffff;

全部位都要匹配的话,这时候这条消息是会被过滤掉了。

那么这就是扩展帧在标识符过滤的设置。也不能超过其寄存器规定的范围。另外如果在这种情况下,接受过滤和发送过滤标识ID不相同,这条数据也会被过滤。

这样发送数据和过滤全量匹配不一致被丢弃。 

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

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

相关文章

【MindSpore易点通】在开发环境中如何使用MindInsight在线调试器

背景信息 在使用开发环境训练任务过程中&#xff0c;为方便开发人员更形象地观察到实时训练任务中的数值变化情况以分析精度问题&#xff0c;ModelArts在线调节器应运而生。与离线调试器的区别在于&#xff0c;离线调试器只能待整个任务运行完成后&#xff08;收集到整个任务过…

【机器学习大杀器】Stacking堆叠模型

1.前言 Kaglle比赛中使用Stacking模型是非常常见的大杀器&#xff0c;这是为什么呢&#xff1f; 【机器学习大杀器】Stacking堆叠模型 1.前言 2.Model 3: Stacking model 2.1 description of the algorithms: 2.2 interpretation of the estimated models: 3. Extend 3.1 …

终于盼到了,Python 数据科学速查表中文版来了

近几年以来&#xff0c;Python 的应用场景越来越多&#xff0c;几乎可以应用于自然科学、工程技术、金融、通信和商业等各种领域。究其原因在于 Python 的简单易学、功能强大。 想系统地学点东西&#xff0c;发现很多不错的技术文档都是英文资料&#xff0c;发现英文竟然成为了…

数据结构考研第六章——图(内含动图)

大纲要求&#xff1a;图的相关算法相对较多&#xff0c;通常只要求掌握其基本思想和实现步骤&#xff0c;而算法的具体实现不是重点。 一、图的基本概念 图的概念&#xff1a;图G由顶点集V和边集E组成的&#xff0c;记为G&#xff08;V&#xff0c;E&#xff09;有向图&#x…

6_显示登录信息以及上传图片

目录一 显示登录信息二 账号设置修改用户图片一 显示登录信息 实现思路 书写一个拦截器 loginTicketInterceptor 在 preHandle 方法中获取用户发送请求时携带的 cookie书写一个专门获取cookie的工具类 CookieUtil查数据库,数据库是否存在该 ticket,判断该凭证是否有效,-凭证是…

【论文阅读】EDPLVO: Efficient Direct Point-Line Visual Odometry

一、公式及符号约定 这篇论文是将直接法的残差计算从点扩展到了线段&#xff0c;所以一些符号在第三章的部分提前做了约定。用Π表示投影的函数&#xff0c;也就是用像素坐标和内参矩阵以及深度信息&#xff0c;投影出点的空间坐标&#xff0c;反之Π-1表示的是将空间坐标投影…

Git使用详细教程

1. cmd面板的常用命令 clear&#xff1a;清屏cd 文件夹名称----进入文件夹cd … 进入上一级目录(两个点)dir 查看当前目录下的文件和文件夹(全拼:directory)Is 查看当前目录下的文件和文件夹touch 文件名----创建文件echo 内容 > 创建文件名----创建文件并写入内容rm 文件名…

基于udp实现回显服务器,翻译服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 udp socket 要掌握的类&#xff1a; 1.DatagramSocket 2.DatagramPacket 一、udp版本回显服务器 服务端&#xff1a; 完整代码 客户端&#xff1a; 完整代码 udp版本翻译…

Spring注入和生命周期

目录 获取Bean对象&#xff08;对象装配&#xff09; 属性注入 构造注入 Setter注入 三种注入的优缺点分析 注入的注解&#xff1a; 一个类型多个bean对象的注入方式 1.让变量名等于bean的id 2.用Resource注解&#xff08;name“bean的id”&#xff09; 3.用Qualif…

Java 核心技术 0 —— Class加载 和 运行时数据区域

JVM 是 字节码的运行环境&#xff0c;负责装载class到JVM内部&#xff0c;解释编译为对应平台的机器码指令进行执行&#xff0c;对于JVM设计有权威的定义规范&#xff0c;了解 JVM 类加载各部的主要功能 和 运行时数据区域组成 很有意义。 磁盘上有一个.java文件&#xff0c;通…

【目标检测】swin-transformer训练自己的数据集

文章目录1. 数据集的制作1.1. Labelme制作数据集1.2 COCO数据集格式2. 配置swin-transformer3. 训练自己的数据集4. 训练5.参考链接1. 数据集的制作 1.1. Labelme制作数据集 pip install labelme然后在桌面搜索框中找到labelme&#xff0c;然后打开&#xff0c;或者直接在命令…

Python 工匠 第一章 变量与注释

1.1 基础知识 1.1.1 变量常见用法 Python 是一门动态类型的语言&#xff0c;因此无须提前声明变量类型&#xff1b;并且由于其是弱类型语言&#xff0c;即可以更改其变量类型。动态类型语言/弱类型语言 a 10 # 不需要提前声明变量类型 a "a" # 可以更改其变量类…

【架构师】解决方案架构师常用的5种类型架构图

0. 背景 在给不同部门的同学讲解系统时&#xff0c;如果用手势解释解决方案&#xff0c;还有很多“这块和这块通过...”在解释复杂的概念时&#xff0c;大部分人都会晕。我们需要一个视觉效果。有人说一个架构图不就行了吗&#xff1f;但架构图不是一个“放之四海而皆准”的解决…

一、springcloud-eureka服务注册与发现

SpringCloud简介 Spring Cloud 为开发者提供了工具来快速构建分布式系统中的一些常见模式&#xff08;例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话&#xff0c;集群状态&#xff09;。分布式系统的协调导致了样板…

04 Vue属性配置

1、ref属性 App.vue代码&#xff1a; <template><div><h1 v-text"msg" ref"myTitle"></h1><button click"showDom">点我输出上方的DOM元素</button><school ref"school" id"sch"/&…

Node.js | Express+MongoDB 实现简易用户管理系统(一)(项目搭建 | RESTful API架构 | 前后端交互)

&#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&#xff09; &#x1f5a5;️ TypeScript知识总结&…

【javaEE】多线程进阶(Part1 锁策略、CAS、synchronized )

目录前言/补充4. 描述一下线程池的执行流程和拒绝策略有哪些&#xff1f;【面试题&#xff01;】一、常见锁策略一&#xff09;乐观锁VS悲观锁二&#xff09;读写锁VS普通互斥锁三&#xff09;重量级锁VS轻量级锁四&#xff09;自旋锁VS挂起等待锁五&#xff09;公平锁VS非公平…

Vue框架背后的故事

文章目录前言Vue萌芽Vue名字的由来因着Vue免试进入MeteorVue逐步完善Taylor推荐VueVue因受质疑发布1.0LinusBorg加入萌生全职做Vue想法Vue在恰到好处的时机出现探索经济来源Serah Drasner加入全职投入Vue建设Vue引入国内Vue受拥国内Vue在决策背景方面的独有优势总结本期推荐前言…

JVM垃圾回收系列之垃圾收集器二

随笔 最近两个星期因为要忙公司项目上线的事情以至于发表的文章会显得碌碌庸流&#xff0c;在此以示歉意 引言 本文将介绍HotSpot中的G1GC 参考书籍&#xff1a;“深入理解Java虚拟机” 个人java知识分享项目——gitee地址 个人java知识分享项目——github地址 G1GC 介…

双向链表的操作

什么是双向链表&#xff1f; 指针域&#xff1a;用于指向当前节点的直接前驱节点&#xff1b; 数据域&#xff1a;用于存储数据元素。 指针域&#xff1a;用于指向当前节点的直接后继节点&#xff1b; typedef struct line{struct line * prior; //指向直接前趋&#xff0c;结…