USART_串口通讯中断案例(HAL库实现)
引言
本次,继续对前面寄存器实现的串口通讯中断案例使用HAL库进行二次实现,因此这里会省略一些重复内容,如果大家不清楚的话请参考下面链接:USART_串口通讯中断案例(一)(寄存器实现)-CSDN博客https://blog.csdn.net/2301_79475128/article/details/145233910https://blog.csdn.net/2301_79475128/article/details/145233910https://blog.csdn.net/2301_79475128/article/details/145233910
一、需求分析
二、硬件电路设计与分析
与寄存器实现案例一模一样,直接参考上面链接即可,这里不再赘述。
三、软件设计
前面,我们使用HAL库实现了串口通讯的轮询案例,接下来,我们基于前面轮询的工程进行修改,来实现本次串口通讯的中断案例。
怎么做呢?步骤如下。当然如果没看过前面HAL库实现的轮询案例的话,这里可参见下方链接跳转:USART_串口通讯轮询案例(HAL库实现)-CSDN博客https://blog.csdn.net/2301_79475128/article/details/145263748?spm=1001.2014.3001.5501https://blog.csdn.net/2301_79475128/article/details/145263748?spm=1001.2014.3001.5501
接下来,我们就开始串口通讯中断案例的HAL库实现:
3.1 STM32CubeMX工程配置
找到上一次轮询案例的工程目录,然后打开.ioc后缀的文件,可打开其STM32CubeMX中所做的配置。
这个过程就相当于是将这个工程复制了另存为另一个新的工程,然后新的工程名我叫10_usart_interrupt_hal,表示这是串口通讯中断案例的HAL库实现。
这时候,我们发现在STM32CubeMX中对应工程管理配置部分的名字和路径已经变成我们重新命名的新工程,如下图所示
我们保险起见,可以再过一遍本来需要配的内容看看是不是都还是配好的
工程管理部分中第二个的勾选
系统部分调试器的设置
时钟配置汇总外部时钟的设置
系统内部时钟的配置
串口部分,模式设置异步功能,不开启硬件流控
串口配置中参数的设置
由于本次是使用串口中断,所以我们将多开启一个串口中断的NVIC使能
再看看串口配置中的GPIO设置
最后生成代码、在keil中打开工程即可
然后在keil中进行配置一下就行,就是魔法棒中debug的settings中常见的量大配置——复位并运行以及取消勾选打印日志的enable。
3.2 程序补充
把上面的配置做好以后,我们就可以进入VSCode导入工程开始代码补充了。
关于这里自动生成的东西因为和前面轮询差不多,所以就不再赘述。
这里需要说的是,由于本次借助串口中断,因此我们需要注意一下stm32f1xx_it.c文件,因为关于32的中断处理函数主要就是放在这里面
进入该文件,我们翻到下面就能看见一个关于USART1的中断处理函数,和前面按键中断案例的HAL库实现的时候一样,这里也是放了一个函数调用。在这里,这个调用的函数实际上是总的串口中断处理函数,按理说进入应该主要就是一些弱实现的中断回调函数,然后我们对其进行重写就行。我们进去看看
会发现和我们想的不太一样,这个总串口中断处理函数里面有很多东西,所以我们想去找到我们想要重写的中断函数可能还需要仔细看看。更合适的办法就是查看这个函数头上提供的关于该文件的详细介绍,我们翻到最上面看看
可以发现全是英文的,可能看的会比较头疼,但是咱还是不能退缩,去看看。我们现在是想找一下串口中断相关的回调函数,所以先得知道怎么样用该文件中定义的内容,如上图有描述“如何使用这个driver”,大概就是会涉及到咱要找的回调函数了。我们继续往下翻看看
可以看见有一部分提到【Callback registration】回调注册,就是对于相关回调函数的名称定义,可以看见里面有大量的回调函数名并在旁边给出了解释。当然本次我们主要是借助中断实现数据的接收,所以看看关于数据接收的中断回调函数即可,其他的我们有时间自己去同理试一试也可以的。由上图可以看见关于接收数据的中断回调函数应该是【RxCpltCallback】
然后,我们继续往下翻,可以看见更清楚地描述
如上图所示,这里直接地介绍了三种数据发送和接收的模式,并告诉我们要使用那些函数。其中我们就可以知道要重写的弱实现中断回调函数了,同时还提示中断模式下还需要使用一个中断处理的函数。所以我们现在就直接找到这两个接收中断的函数
由这个中断处理的函数可以看出,这对接收中断他只能接受一定长度的字符串,而不能接收变长数据,其传入的参数Size就是给接收到字符的长度。这样说来,我们此时仍旧需要分两种情况进行测试了,即接收定长数据或者变长数据,他们对应不同的两种函数。
3.2.1 定长数据接收测试
接下来,我们就来补充一下定长数据接收情况的代码并进行测试。了解了要用到的函数,那么就来写呗。首先我们对接收中断回调函数在中断文件中进行重写。
里面写一些什么呢?就是写当数据接收完成后要做的事,我们想数据接收完了以后就是继续把数据发给电脑呗,同时我们要把发送函数放在主程序运行,所以在中断回调函数中我们就写一个标志位变量就行了,这里我在main.c中设置存放数据的全局缓冲区buffer[100]存放接收的数据,大小自己定,这里我们给100;同时再定义一个全局标志位isToSend,初值为0,当触发接收中断时值置为1即可。
所以此时重写的接收数据完成的中断回调函数代码如下
// 中代码处理程序 定长接收中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{isToSend = 1;
}
然后,我们再去main.c中while循环里面添加接收完成后标志位置1时的发送函数调用代码,同时发送完以后注意清零标志位。
// 定长数据发送if (isToSend){HAL_UART_Transmit(&huart1, buffer, 10, 2000);isToSend = 0;}
最后,我们在main.c中的while循环中加接收中断处理的函数调用,这可以看作是中断处理的使能
// 开启中断处理使能 定长接收HAL_UART_Receive_IT(&huart1, buffer, 10);
OK,这样我们定长数据接收代码就写好了,按理说是发送接收的10个字符,然后我们编译烧录看效果
显然,测试成功,可以接受到。当然,由于只能接受定长数据,所以当给的不是规定长度的字符时,发送到电脑上看见的字符就会不符合预期了。这时候我们就需要用更灵活的变长数据接收方式进行更合适。
3.2.2 变长数据接收测试
接下来,我们再来进行变长数据接收测试。首先回过头来继续往下翻文件描述
继续往下翻时有如上图描述,这里说了文件中还提供了额外的函数,例如可以用在被接受数据的长度未知的地方。这就意味着下面提供了我们变长数据接收中断的相关函数。
所以咱继续往下翻着看看,如下图
根据描述可以发现这里给出了变长数据接收的中断回调函数名以及对应的中断处理函数名。接下来我们找到对应函数位置
可见,这俩函数中参数的变化,其中断回调函数介绍也表明了提供的参数Size实际上是获取到的实际接收的数据长度,这就说明我们此时不是自己给长度了,其会自动检测数据长度,因此我们可以直接从中断回调函数中拿到我们接受到的数据的长度,然后在发送接收数据时传进去即可。
所以,这里我们在主程序中需要继续再定义一个全局变量size存放接收数据长度。接着在接受变长数据的中断回调函数中我们此时除了修改发送标志位以外,还要将自动获取到的数据长度Size给到我们存放长度的全局变量size,代码如下
// 中断处理函数 变长数据接收
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{isToSend = 1;size = Size;
}
然后,我们进入main.c中,在while循环中添加发送标志位置1后执行的发送函数,同时执行后清零标志位,代码如下
// 变长数据发送if (isToSend){HAL_UART_Transmit(&huart1, buffer, size, 2000);isToSend = 0;}
最后,我们再在这之前加上对应的中断处理函数调用,相当于开启变长数据接收中断使能。
// 开启中断处理使能 变长接收HAL_UARTEx_ReceiveToIdle_IT(&huart1, buffer, 100);
这样,关于变长数据接收的代码就写完了,下面开始编译烧录测试看效果
很显然,我们此时可以接收到任意长度的字符了,说明测试成功!
四、总结
到目前为止,我们关于变长数据接收的测试就进行完毕,同时也意味着本次使用HAL库实现的串口通讯中断案例(中断主要在于数据接收)也实现完成了。我们可以明显发现代码编写上简单了很多,唯一麻烦的是我们不知道相关函数的调用,需要在进入相应函数所在文件稍微看看对应的描述才好。当然了,后面我们使用多了以后,自然就会熟悉,因此这里不是问题。
以上便是本次文章的所有内容,欢迎各位朋友在评论区讨论,本人也是一名初学小白,愿大家共同努力,一起进步吧!
鉴于笔者能力有限,难免出现一些纰漏和不足,望大家在评论区批评指正,谢谢!
相关文章:

USART_串口通讯中断案例(HAL库实现)
引言 本次,继续对前面寄存器实现的串口通讯中断案例使用HAL库进行二次实现,因此这里会省略一些重复内容,如果大家不清楚的话请参考下面链接:USART_串口通讯中断案例(一)(寄存器实现)…...

【MySQL】存储引擎有哪些?区别是什么?
频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大,只是涉及到的相关知识比较繁杂,比如事务、锁机制等等,都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎࿰…...

[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)
一、简介 本文介绍了 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO) 的基本概念,实现流程和简单的代码实现。实现 SSAO 时使用到了 OpenGL 中的延迟着色 (Deferred shading)技术。 按照本文代码实现后,可以实现以下…...

linux-NFS网络共享存储服务配置
1.NFS服务原理 NFS会经常用到,用于在网络上共享存储,这样讲,你对NFS可能不太了解,举一个例子, 加入有三台机器A,B,C,它们需要访问同一个目录,目录中都是图片,传统的做法是把这些 图…...

w-form-select.vue(自定义下拉框组件)
文章目录 1、w-form-select.vue 组件中每个属性的含义2、实例3、源代码 1、w-form-select.vue 组件中每个属性的含义 好的,我们来详细解释 w-form-select.vue 组件中每个属性的含义,并用表格列出它们是否与后端字段直接相关: 属性解释表格&…...
ovs实现lb负载均衡
负载均衡定义 负载均衡器的实现原理是通过硬件或软件设备将客户端访问流量根据转发策略分发到多个服务器或设备上,以确保系统的负载均衡。常见的实现方式包括: 二层负载均衡:使用虚拟MAC地址方式,根据OSI模型的二层进行负载均…...

机器学习-核函数(Kernel Function)
核函数(Kernel Function)是一种数学函数,主要用于将数据映射到一个更高维的特征空间,以便于在这个新特征空间中更容易找到数据的结构或模式。核函数的主要作用是在不需要显式计算高维特征空间的情况下,通过内积操作来实…...
计算最接近的数
计算最接近的数 真题目录: 点击去查看 E B卷 100分题型 题目描述 给定一个数组X和正整数K,请找出使表达式: X[i] - X[i 1] - … - X[i K - 1] 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 i. 其中&…...
【QNX】QNX侧查看内存信息的方法
在QNX实时操作系统中,🉑查看内存信息的方法有showmem、pidin、top以及hogs等👇🏻。 ① showmem 🦋🦋🦋showmem可用于显示进程的内存使用情况。 🦋🦋🦋通过…...
逐笔成交逐笔委托Level2高频数据下载和分析:20250121
逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/15NI2zLXYiczrUMQtwHgUrg?pwdbeiu 提取码: beiu Level2逐笔成交逐笔委托数据分享下载 通过Level2的逐笔成交与委托记录,这种高精度的毫秒级数据能够洞察诸多重要信息,包括庄家目的、误导性行为&am…...

AutoSar架构学习笔记
1.AUTOSAR(Automotive Open System Architecture,汽车开放系统架构)是一个针对汽车行业的软件架构标准,旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元(ECU…...

2024年智慧消防一体化安全管控年度回顾与2025年预测
随着科技的飞速发展,智慧营区一体化安全管控在2024年取得了显著进展,同时也为2025年的发展奠定了坚实基础。 2024年年度回顾 政策支持力度持续加大:国家对消防安全的重视程度不断提高,出台了一系列涵盖技术创新、市场应用、人才培…...
基于单片机的智能台灯设计
摘要: 方向和亮度,采用的是手动调节。而对于儿童来说,他们通常不知道如何调整以及调整到何种程度。本文设计了一款智能台灯,当有人的 台灯是用于阅读学习而设计使用的灯,一般台灯用的灯泡是白炽灯、节能灯泡以及市面上流行的护眼台灯,可以调节高度、光照的时候,可以根据…...
HJ108 求最小公倍数(Java版本)
一、试题地址 求最小公倍数_牛客题霸_牛客网 二、试题描述 描述 对于给定的两个正整数 a,b,它们的最小公倍数 lcm(a,b) 是指能同时被 a 和 b 整除的最小正整数。 求解 lcm(a,b)。 输入描述: 在一行上输入两个整数 a,b(1≦a,b≦105)。 输出描述…...

使用tritonserver完成clip-vit-large-patch14图像特征提取模型的工程化。
1、关于clip-vit-large-patch14模型 关于openapi开源的clip-vit-large-patch14模型的特征提取,可以参考之前的文章:Elasticsearch向量检索需要的数据集以及768维向量生成这篇文章详细介绍了模型的下载地址、使用方式、测试脚本,可以让你一步…...

实操演练第003讲-数据通途:客户端连接SQL Server的完美攻略
SQL Server简介 基本概念 SQL Server是由微软公司开发的关系型数据库管理系统。它基于SQL(Structured Query Language,结构化查询语言)来管理和操作数据。SQL Server可以存储大量结构化数据,如客户信息、订单记录、库存数据等&a…...
golang接口
1.概念 golang接口是一个动态类型和动态值的集合,定义了对象的行为,不指定实现。只要一个类型定义了接口全部的方法,就可被认为是实现接口 **动态类型:**实现接口的具体数据类型 **动态值:**实现接口的数据的值或者引…...

LeetCode:37. 解数独
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:37. 解数独 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则ÿ…...

数据结构与算法之递归: LeetCode 37. 解数独 (Ts版)
解数独 https://leetcode.cn/problems/sudoku-solver/description/ 描述 编写一个程序,通过填充空格来解决数独问题数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次数字 1-9 在每一列只能出现一次数字 1-9 在每一个以粗实线分隔的 3x3 宫内…...

【氮化镓】香港科技大学陈Kevin-单片集成GaN比较器
一、引言(Introduction) GaN HEMT的重要性 文章开篇便强调了氮化镓(GaN)高电子迁移率晶体管(HEMT)在下一代功率转换系统中的巨大潜力。GaN HEMT具备高开关频率、低导通电阻、高击穿电压以及宽工作温度范围等优势,使其成为功率电子领域的热门研究对象。这些特性使得GaN…...

ETL脚本节点使用的方式
随着大数据时代的到来,企业对数据处理的需求日益增长,ETL 作为数据整合的关键技术,逐渐走进我们的视野。本文将为您揭秘 ETL 脚本节点的使用方式,助您轻松驾驭数据处理新境界。 一、ETL脚本的优势 1.提高效率:ETL 脚…...
Linux 中 m、mm、mmm 函数和 make 的区别
在 Linux 内核开发和 Android 开发中,构建系统通常使用 make 命令来编译和构建项目。而在 Android 开发环境中,还有 m、mm 和 mmm 等命令,这些命令是 Android 构建系统的一部分,提供了更高效和便捷的构建方式。以下将详细介绍这些…...

汽车总线分析总结(CAN、LIN、FlexRay、MOST、车载以太网)
目录 一、汽车总线技术概述 二、主流汽车总线技术对比分析 1. CAN总线(Controller Area Network) 2. LIN总线(Local Interconnect Network) 3. FlexRay总线 4. MOST总线(Media Oriented Systems Transport&#x…...
麒麟v10,arm64架构,编译安装Qt5.12.8
Window和麒麟x86_64架构,官网提供安装包,麒麟arm64架构的,只能自己用编码编译安装。 注意,“桌面”路径是中文,所以不要把源码放在桌面上编译。 1. 下载源码 从官网下载源码:https://download.qt.io/arc…...

Axure RP11安装、激活、汉化
一:注册码 Axure RP11.0.0.4122在2025-5-29日亲测有效: 49bb9513c40444b9bcc3ce49a7a022f9...

【c++】【数据结构】红黑树
目录 红黑树的定义红黑树的部分模拟实现颜色的向上更新旋转算法单旋算法双旋算法 红黑树与AVL树的对比 红黑树的定义 红黑树是一种自平衡的二叉搜索树,通过特定的规则维持树的平衡。红黑树在每个结点上都增加一个存储位表示结点的颜色,结点的颜色可以是…...

JavaScript 模块系统:CJS/AMD/UMD/ESM
文章目录 前言一、CommonJS (CJS) - Node.js 的同步模块系统1.1 设计背景1.2 浏览器兼容性问题1.3 Webpack 如何转换 CJS1.4 适用场景 二、AMD (Asynchronous Module Definition) - 浏览器异步加载方案2.1 设计背景2.2 为什么现代浏览器不原生支持 AMD2.3 Webpack/Rollup 如何处…...

【MFC】初识MFC
目录 01 模态和非模态对话框 02 静态文本 static text 01 模态和非模态对话框 首先我们需要知道模态对话框和非模态对话框的区别: 模态对话框是一种阻塞时对话框,它会阻止用户与应用程序的其他部分进行交互,直到用户与该对话框进行交互并关…...

Java设计模式从基础到实际运用
第一部分:设计模式基础 1. 设计模式概述 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结,它描述了在软件设计过程中一些不断重复出现的问题以及该问题的解决方案。设计模式是在特定环境下解决软件设计问题…...
java导入excel
这样读取excel时,得到的是结果值,而不是单元格的公式 import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil;InputStream inputStream file.getInputStream(); ExcelReader reader ExcelUtil.getReader(inputStream, 1); L…...