当前位置: 首页 > article >正文

HAl库开发中断方式接收Can报文的详细流程

下面给出一个基于 HAL 库的中断方式接收 CAN 报文的详细流程说明,描述每一步的硬件配置、软件调用和中断处理机制,而不涉及具体代码细节,只讲解整体原理和步骤:

在使用 HAL 库时,不需要手动清除中断标志位。原因如下:

  • 当你在中断回调函数(例如 HAL_CAN_RxFifo0MsgPendingCallback)中调用 HAL_CAN_GetRxMessage() 读取报文时,HAL 库会自动清除相应的中断标志,使得 CAN 控制器的 FIFO 可以继续接收下一条报文。

  • 这种设计保证了用户只需要专注于数据处理,而不必额外处理中断标志的清除操作。

因此,只要你按照 HAL 库的使用流程,在中断函数中正确调用了 HAL_CAN_GetRxMessage,就无需手动清零中断标志位。

如果使用 标准库(寄存器级别编程) 而不是 HAL 库,那么在 CAN 中断接收报文后,需要手动清除中断标志位,否则 CAN 控制器可能无法接收新的报文。


1. 系统与外设初始化

1.1 HAL 库初始化
  • 调用 HAL_Init()
    初始化 HAL 库,包括重置外设、初始化系统定时器和配置中断分组,为后续外设初始化做准备。
1.2 系统时钟配置
  • 调用 SystemClock_Config()
    配置系统时钟(如 PLL、总线分频等),确保 CAN 模块所属的总线时钟正常,为 CAN 外设提供稳定的时钟信号。
1.3 GPIO 初始化
  • 配置 CAN 引脚
    通过 GPIO 初始化函数(例如 MX_GPIO_Init())配置 CAN_TX 和 CAN_RX 对应的引脚,设置为“复用功能”(Alternate Function),并选择正确的复用映射(例如 GPIO_AF9_CAN1)。
1.4 CAN 外设低级资源配置(MSP 初始化)
  • 在 HAL_CAN_MspInit() 中完成
    • 使能 CAN 外设及其所在总线的时钟。
    • 配置 CAN 引脚(如 PA11、PA12)为复用功能。
    • 配置 NVIC:设置 CAN 接收中断的优先级,并使能相应的中断通道(例如 CAN1_RX0_IRQn)。

2. CAN 外设初始化与滤波器配置

2.1 CAN 参数初始化
  • 设置 CAN_HandleTypeDef 结构体
    配置 CAN 的基本参数,如波特率、工作模式(正常模式、回环模式等)、时间段、重传策略等。
  • 调用 HAL_CAN_Init()
    根据配置初始化 CAN 外设,此时 HAL 库会自动调用 HAL_CAN_MspInit() 完成低级硬件初始化。
2.2 滤波器配置
  • 设置 CAN 滤波器参数
    根据实际应用需求配置 CAN 滤波器(例如使用 ID 掩码模式或列表模式),以便让 CAN 模块只接收符合条件的报文。
  • 调用 HAL_CAN_ConfigFilter()
    将滤波器参数写入 CAN 滤波器寄存器。
    注:滤波器配置一般在 CAN 初始化之后、启动之前完成。
2.3 启动 CAN 模块
  • 调用 HAL_CAN_Start()
    启动 CAN 外设,使其进入正常工作状态,同时使能发送与接收功能。

3. 启用中断接收

  • 使能接收中断
    在 HAL_CAN_MspInit() 中已经配置并使能了 CAN 接收中断(例如使能 FIFO0 接收中断),这样当有报文到达时,CAN 控制器会自动触发中断。

4. 中断处理流程

当 CAN 模块检测到 FIFO0 中有新报文等待接收时,自动触发 CAN 接收中断,HAL 库会调用预定义的回调函数,其详细流程如下:

4.1 进入中断回调
  • *调用回调函数 HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef CanHandle)
    这是用户实现的回调函数,专门用于处理 FIFO0 中待接收的 CAN 报文。
4.2 读取接收到的报文
  • 调用 HAL_CAN_GetRxMessage()
    在回调中,使用该函数从 FIFO0 中读取报文数据和报文头信息:
    • 报文头包含标识符(标准或扩展 ID)、数据长度(DLC)、帧类型(数据帧或远程帧)等信息。
    • 数据部分为 0~8 字节(或更多字节,在 CAN FD 中)。
  • 返回状态检查
    如果返回值为 HAL_OK,则说明报文已正确接收。
4.3 数据处理与分发
  • 解析报文
    根据接收到的报文头字段判断报文类型和标识符,决定如何处理:
    • 对于特定 ID 的报文,可直接解析数据内容,例如拆分成多个数据变量、转换为实际物理量(如角度、速度等)。
    • 如果需要,可以将接收到的数据存入全局变量、结构体或推送到消息队列中,以便后续任务处理。
  • 业务处理
    根据应用需求,对接收到的数据进行进一步处理(如校验、转换、报警处理等)。
4.4 清除中断标志
  • 自动处理
    在调用 HAL_CAN_GetRxMessage 后,CAN 模块会自动清除相应的 FIFO 标志,确保可以接收下一条报文。

5. 后续处理

  • 非中断模式下的数据处理
    接收到的数据通常会通过中断回调保存到某个缓冲区或队列中,主循环或专门的任务会定期检查该缓冲区并对数据进行处理。
  • 错误处理
    如果在中断过程中检测到错误(例如报文校验失败、溢出等),可以调用 HAL_CAN_ErrorCallback() 或自定义错误处理函数,进行必要的错误记录或重传机制。

总结

整个中断接收 CAN 报文的详细流程为:

  1. 初始化阶段
    • 完成 HAL 库、时钟、GPIO、CAN 外设以及 NVIC 中断的初始化。
  2. CAN 配置阶段
    • 设置 CAN 参数,配置滤波器,启动 CAN 模块。
  3. 使能中断
    • 在 MSP 初始化中使能 CAN 接收中断,使得接收 FIFO0 报文时能触发中断。
  4. 中断回调处理
    • 当 CAN 检测到新报文时自动进入 HAL_CAN_RxFifo0MsgPendingCallback 回调函数。
    • 在回调中调用 HAL_CAN_GetRxMessage 从 FIFO0 读取报文。
    • 对报文头和数据进行解析,根据报文 ID 和数据内容进行相应处理,如存入队列或直接计算处理。
  5. 后续数据处理
    • 主循环或后台任务读取缓冲队列中的数据进行后续业务处理。

这种中断驱动的接收方式能保证 CAN 模块在实时接收数据时不会漏报,同时将数据处理与中断服务分离,确保系统稳定高效运行。

相关文章:

HAl库开发中断方式接收Can报文的详细流程

下面给出一个基于 HAL 库的中断方式接收 CAN 报文的详细流程说明,描述每一步的硬件配置、软件调用和中断处理机制,而不涉及具体代码细节,只讲解整体原理和步骤: 在使用 HAL 库时,不需要手动清除中断标志位。原因如下&…...

[笔记] TinyWebServer编译及demo运行过程

文章目录 前言环境搭建ubuntumysql 8.0c/c开启root用户TinyWebServer 搭建及编译过程运行结果常见问题./threadpool/../CGImysql/sql_connection_pool.h:6:10: fatal error: mysql/mysql.h: No such file or directory./server运行后直接退出了 前言 哎 也就帮帮新手看看问题 …...

基于springboot的电影院管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 互联网技术的成熟和普及,势必会给人们的生活方式带来不同程度的改变。越来越多的经营模式中都少不了线上运营,互联网正强力推动着社会和经济发展。国人对民族文化的自信和不同文化的包容,再加上电影行业的发展,如此繁荣吸引…...

基于Redis分布锁+事务补偿解决数据不一致性问题

基于Redis的分布式设备库存服务设计与实现 概述 本文介绍一个基于Redis实现的分布式设备库存服务方案,通过分布式锁、重试机制和事务补偿等关键技术,保证在并发场景下库存操作的原子性和一致性。该方案适用于物联网设备管理、分布式资源调度等场景。 …...

虚拟电商-延迟任务系统的微服务改造(二)注册中心和Feign调用

一、微服务注册中心Consul 编写完延迟任务系统的web层接口,也就是说可以基于http协议来访问延迟系统,接下来要将延迟任务改造成一个服务。首要考虑的问题就是服务的注册与发现,服务的注册与发现都离不开服务的注册中心,本项目选取…...

数智读书笔记系列022《算力网络-云网融合2.0时代的网络架构与关键技术》读书笔记

一、书籍核心价值与定位 1.1 书籍概述:中国联通研究院的权威之作 《算力网络 —— 云网融合 2.0 时代的网络架构与关键技术》由中国联通研究院算力网络攻关团队精心撰写,是业界首部系统性探讨云网融合 2.0 与算力网络的专著。在云网融合从 1.0 迈向 2.0 的关键节点,本书的…...

人工智能在智能交通中的应用:以L4级无人电动物流拖车为例

一、引言 人工智能(AI)技术的飞速发展正在深刻改变各个行业,其中智能交通领域尤为显著。从自动驾驶汽车到智能交通管理系统,AI的应用不仅提高了交通效率,还增强了安全性。本文将重点探讨L4级无人电动物流拖车技术及其在…...

【愚公系列】《高效使用DeepSeek》024-儿童教育

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

第十六届蓝桥杯康复训练--6

题目链接&#xff1a;790. 数的三次方根 - AcWing题库 思路&#xff1a;二分&#xff0c;注意正负号和小数判断退出的方法&#xff08;虽然正负无所谓&#xff09; 代码&#xff1a; #include<bits/stdc.h> using namespace std;#define exs 0.00000018812716007232667…...

【QA】单件模式在Qt中有哪些应用?

单例设计模式确保一个类仅有一个实例&#xff0c;并提供一个全局访问点来获取该实例。在 Qt 框架中&#xff0c;有不少类的设计采用了单例模式&#xff0c;以下为你详细介绍并给出相应代码示例。 1. QApplication QApplication 是 Qt GUI 应用程序的核心类&#xff0c;每个 Q…...

logisim安装以及可能出现的问题

阅读提示&#xff1a;我这篇文章更偏向于安装出现问题的解决方案 目录 一、安装步骤 二、安装问题 1、出错的问题 2、出错的原因与解决方法 一、安装步骤 1、下载logisim 官方网站&#xff1a;https://sourceforge.net/projects/circuit/ 下载适用于你操作系统的版本&…...

Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发

DAY15.2 Java核心基础 JavaWeb 要想通过浏览器或者客户端来访问java程序&#xff0c;必须通过Servlet来处理 没有Servlet&#xff0c;java是无法处理web请求的 Web交互&#xff1a; 接收请求HttpServletRequest&#xff1a;可以获取到请求的信息&#xff0c;比如uri&#…...

2300年直线公理使数学一直存在尖锐自相矛盾

2300年直线公理使数学一直存在尖锐自相矛盾 黄小宁 复平面z各点z的对应点2z的全体是2z平面。z面拉伸&#xff08;平移&#xff09;变换为2z面&#xff08;z2面&#xff09;就使x轴⊂z面沿本身拉伸&#xff08;平移&#xff09;变换为u2x轴&#xff08;ux2轴&#xff09;。R可…...

hackmyvm-Icecream

arp-scan -l nmap -sS -v 192.168.222.106 enum4linux 192.168.222.106 445端口 smbmap -H 192.168.222.106 icecream为只读模式 smbclient \\192.168.222.106\icecream 反弹shell(上传put php-reverse-shell.php) 开启监听 nc -lnvp 1234 拿到webshell cat /etc/passwd 9000端…...

Apache Tomcat漏洞公开发布仅30小时后即遭利用

近日&#xff0c;Apache Tomcat曝出一项安全漏洞&#xff0c;在公开发布概念验证&#xff08;PoC&#xff09;仅30小时后&#xff0c;该漏洞即遭到攻击者利用。这一漏洞编号为CVE-2025-24813&#xff0c;主要影响以下版本&#xff1a; 1. Apache Tomcat 11.0.0-M1 至 11.0.2 …...

告别低效人工统计!自动计算计划进度

实时监控任务进度一直是项目管理中的一项巨大挑战。 人工统计方式不仅耗时耗力&#xff0c;而且往往由于信息传递的延迟和人为误差&#xff0c;导致无法实时获得准确的项目进展信息。 这种不准确性可能掩盖潜在的风险点&#xff0c;从而影响项目的整体进度和成果。 Ganttable …...

AI比人脑更强,因为被植入思维模型【16】反脆弱

毛选中就有言&#xff0c;不经历困难&#xff0c;我们就不会掌握战胜困难的方法。 这个世界纷繁复杂&#xff0c;不是强者总是运气好&#xff0c;而是他们能够失败后快速复原&#xff0c;不断找到战胜困难的方法。 定义 马斯洛需求层次模型是一种将人类需求从低到高按层次进…...

L2TP实验

放开安全策略机制&#xff0c;FW1不配IP [FW1]firewall zone trust [FW1-zone-trust]add interface GigabitEthernet 1/0/0 [FW1]security-policy [FW1-policy-security]default action permit FW2 和FW3 [FW2]interface g1/0/1 [FW2-GigabitEthernet1/0/1]ip address 2…...

【数据预测】基于遗传算法GA的LSTM光伏功率预测 GA-LSTM光伏功率预测【Matlab代码#91】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 遗传算法GA2. 长短期记忆网络LSTM3. 基于GA-LSTM的光伏功率预测4. 部分代码展示5. 运行结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 …...

【记录一下】LMDeploy学习笔记及遇到的问题

LMDeploy 是一个用于大型语言模型&#xff08;LLMs&#xff09;和视觉-语言模型&#xff08;VLMs&#xff09;压缩、部署和服务的 Python 库。 其核心推理引擎包括 TurboMind 引擎和 PyTorch 引擎。前者由 C 和 CUDA 开发&#xff0c;致力于推理性能的优化&#xff0c;而后者纯…...

Ciura序列

一 概述 Ciura序列是一种用于希尔排序(Shell Sort)的高效增量序列。 由Marcin Ciura于2002年通过实验提出。 1)经验证最优的初始序列为:[1, 4, 10, 23, 57, 132, 301, 701] 2) 后续增量可通过最后一个元素乘以2.25生成(如:701*2.25=1577,1577*2.25=3548...)。 3)时…...

一、MySQL8的my.ini文件

MySQL8.0.11的安装版本my.ini配置文件默认存放在&#xff1a;C:/Program Files/MySQL/MySQL Server 8.0/ 目录下&#xff1b;而MySQL8.0.11绿色免安装版本是没有my.ini配置文件&#xff0c;用户可以自行构建后&#xff0c;再通过my.ini进行数据库的相关配置 一、MySQL8.0.11默…...

【贝叶斯定理(Bayesian Theorem)】

贝叶斯定理&#xff08;Bayesian Theorem&#xff09;是概率论中一个革命性的工具&#xff0c;它将主观信念与客观数据结合&#xff0c;形成了独特的贝叶斯统计体系。以下我们将从数学原理、哲学内涵、实际应用三个维度进行深度解析。 一、贝叶斯定理的数学本质 1. 核心公式的…...

HC-05与HC-06蓝牙配对零基础教程 以及openmv识别及远程传输项目的概述

这个是上一年的项目&#xff0c;之前弄得不怎么完整&#xff0c;只有一个openmv的&#xff0c;所以openmv自己去我主页找&#xff0c;这篇主要讲蓝牙 这个是我在使用openmv连接单片机1然后单片机1与单片机2通过蓝牙进行通信 最终实现的效果是&#xff1a;openmv识别到图形和数…...

如何在1分钟内编写Cursorrules

如何在1分钟内编写Cursorrules&#xff1a;Cursor AI用户的快速指南 编写Cursor AI的.cursorrules文件并不需要花费太多时间或显得复杂。无论你是希望定制AI编码助手的开发者&#xff0c;还是想确保团队编码标准一致&#xff0c;你都可以在短短一分钟内创建一个有效的.cursorr…...

Linux中mutex机制

在Linux中&#xff0c;mutex是一种用于多线程编程的同步机制&#xff0c;用于保护共享资源&#xff0c;防止多个线程同时访问或修改这些资源&#xff0c;从而避免竞态条件的发生。mutex 是“mutual exclusion”的缩写&#xff0c;意为“互斥”。 1. Mutex 的基本概念 互斥锁&…...

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测 目录 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预…...

AMD公司

本文来自腾讯元宝 AMD&#xff08;Advanced Micro Devices, Inc.&#xff09;&#xff08;先进的微型计算机设备&#xff09;是一家全球领先的半导体公司&#xff0c;成立于1969年&#xff0c;总部位于美国加利福尼亚州圣克拉拉。AMD 主要从事设计、开发和销售计算机处理器、图…...

数字证书 与 数字签名 介绍

目录 数字签名 什么时候公钥加密数据&#xff0c;什么时候私钥加密数据&#xff1f; 消息认证码&#xff08;MAC&#xff09;和数字签名 区别 数字证书 如何使用数字证书验证服务器身份&#xff1f; 数字签名 定义&#xff1a;它类似于现实生活中的手写签名。 手写签名的法律…...

通过webrtc+canvas+css实现简单的电脑滤镜拍照效果

这里我们用的是webrtc中的MediaDevices.getUserMedia()的浏览器api进行的效果实现&#xff0c;MediaDevices.getUserMedia() 会提示用户给予使用媒体输入的许可&#xff0c;媒体输入会产生一个MediaStream&#xff0c;里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道…...