嵌入式学习笔记 - STM32 U(S)ART 模块HAL 库函数总结
一 串口发送方式:
①轮训方式发送,也就是主动发送,这个容易理解,使用如下函数:
HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout);
②中断方式发送,使用如下函数
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
过程如下:
首先使能发送中断__HAL_UART_ENABLE_IT(huart, UART_IT_TXE); 如果发送数据寄存器为空(第一次发送前为空),则进入USARTx_IRQHandler()中断向量入口,这个中断向量里面会调用总的串口中断处理函数HAL_UART_IRQHandler(&huart1);
里面有发送中断处理分支部分UART_Transmit_IT(huart),连续发送想要发送的多个字节下图红线部分所示,每调用一次发送一个字节数据,字节发送结束后发送寄存器变为空时再次进入此中断,每发一次huart->TxXferCount减一次,减为0时,失能发送中断,打开发送完成中断,如下图黄色色部分所示
然后再次回到USARTx_IRQHandler,调用 发送完成处理分支UART_EndTransmit_IT(huart);
UART_EndTransmit_IT函数会调用发送完成回调函数HAL_UART_TxCpltCallback(huart);
用户可以自行定义此函数进行相应处理
③ DMA 方式发送:
HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
二 串口接收方式:
1)轮训方式接收,也就是主动去检查,这个容易理解,使用如下函数
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
2)DMA方式接收
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
3)中断方式接收,有两种方式,这里过程比较多比较难理解详细讲述:
不使用HAL库函数,直接寄存器方式,如下图,直接在中断向量表入口里面通过判断接收标志位RXNE,直接读寄存器DR,这样每一个收到一个字节会进一次中断
使用HAL库函数的回调函数,注意这里有两种接收方式以及相应的两种回调函数:
① 标准回调函数(接收完成回调函数):HAL_UART_RxCpltCallback()
接收到启动时设置的字节数(启动接收时需要设置接收数据长度)后的回调函数
a) 首先通过HAL_UART_Receive_IT(&huart1,(uint8_t *)RxBuff,BUFFSIZE)启动,这个启动函数要在初始化时首次启动,并且要在接收完定长数据后回调函数中再次启动,如下图
里面有开启中断接收数据的条件
以及条件赋值语句,这是选择进入标准回调函数的条件,
b) 发生中断时(接收到一个字节时)中断向量里面会调用总的串口中断处理函数HAL_UART_IRQHandler(&huart1);此函数会调用 UART_Receive_IT(huart);
此函数里面会对数据进行接收保存,如下,从此函数可以看出,不开启上面的a)步骤的条件,UART_Receive_IT是不会读接收寄存器的是数据的,如下图,所以想要使用HAL库回调函数接收数据,必须在初始化时通过HAL_UARTEx_ReceiveToIdle_IT或者HAL_UART_Receive_IT()函数开启接收状态,这是HAL库函数决定的。
c)此函数最终还会调用定长数据接收回调函数HAL_UART_RxCpltCallback(huart);如下图
用户可以在回调函数中对数据进行想要的处理。
② 接收完成或者空闲回调函数HAL_UARTEx_RxEventCallback()
接收完成或者空闲回调函数。当接收到预先设置好的字节数或者接收空闲(IDLE中断)时会回调这个函数
a) 首先通过HAL_UARTEx_ReceiveToIdle_IT(&huart1,(uint8_t *)RxBuff,BUFFSIZE);开启接收状态如下图
里面有开启进入空闲回调函数的条件如下图
以及开启中断接收数据的条件,如下图
b) 发生中断时,串口中断向量入口会调用总处理函数HAL_UART_IRQHandler(&huart1)
此函数会调用函数UART_Receive_IT进行数据读取,从此函数可以发现如果不开启上面的a)步骤的条件,UART_Receive_IT是不会读接收寄存器的是数据的,如下图,所以想要使用HAL库回调函数接收数据,必须在初始化时通过HAL_UARTEx_ReceiveToIdle_IT或者HAL_UART_Receive_IT()函数开启接收状态,这是HAL库函数决定的。
c)以及最终调用完成或者空闲回调函数HAL_UARTEx_RxEventCallback(huart, nb_rx_data);
首先第一个情况下UART_Receive_IT里面在发送完成条件下,同标准回调函数一样,也调用了此回调函数
另外注意黄线所示语句,huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;如果这是一个发送满一个RxBuffer量程的情况,就赋值接收模式为标准模式,就不会进入下面这个情况进行空闲模式分析与调用。
第二个情况:
首先有个条件,就是在第a)步骤中提及的条件,启动了HAL_UARTEx_ReceiveToIdle_IT空闲接收状态,并且前面没有接收满一个量程,上面紫色字体所述,如下图
其次是接收未满一个RxBuffer量程的条件,圆圈处代表总线空闲,接收未达到RxBuffer 满量程,进行此函数调用
两个回调函数的使用总结如下:
比如定义接收缓冲区大小为RxBuffer[10],也就是函数HAL_UART_Receive_IT(&huart1,(uint8_t *)RxBuff,BUFFSIZE)或者HAL_UARTEx_ReceiveToIdle_IT(&huart1,(uint8_t *)RxBuff,BUFFSIZE);中的BUFFERSIZE=10,调用机制如下图
相关文章:

嵌入式学习笔记 - STM32 U(S)ART 模块HAL 库函数总结
一 串口发送方式: ①轮训方式发送,也就是主动发送,这个容易理解,使用如下函数: HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout); ②中断方式发送ÿ…...

【VLNs篇】04:SayNav-为新环境中的动态规划到导航进行大型语言模型的基础构建
栏目内容论文标题SayNav: 为新环境中的动态规划到导航进行大型语言模型的基础构建 (SayNav: Grounding Large Language Models for Dynamic Planning to Navigation in New Environments)研究问题自主代理在未知环境中执行复杂导航任务(如MultiON)时&…...
MySQL中添加一个具有创建数据库权限的用户
要在MySQL中添加一个具有创建数据库权限的用户,可按以下步骤操作: 1. 登录MySQL 使用拥有足够权限(一般是root用户 )的账号登录到MySQL数据库。在命令行输入: mysql -u root -p然后输入对应的密码,即可进…...

oracle使用SPM控制执行计划
一 SPM介绍 Oracle在11G中推出了SPM(SQL Plan management),SPM是一种主动的稳定执行计划的手段,能够保证只有被验证过的执行计划才会被启用,当由于种种原因(比如统计信息的变更)而导致目标SQL产生了新的执…...
[Java实战]Spring Boot整合Seata:分布式事务一致性解决方案(三十一)
[Java实战]Spring Boot整合Seata:分布式事务一致性解决方案(三十一) 引言 在微服务架构中,业务逻辑被拆分为多个独立的服务,每个服务可能拥有独立的数据库。当需要跨服务操作多个数据库时,如何保证数据的…...

Openwrt下使用ffmpeg配合自建RTSP服务器实现推流
目前在Openwrt下时mjpg_streamer实现UVC摄像头转网络摄像头的方案很多,这种方案视频服在路由模组中,在局域网中使用很方便。但是对于需要远程监控管理的情况,mjpg_streamer不适应,因为不在局域网中的播放器无法访问到路由模组中的…...
MySQL 索引的增删改查
MySQL 索引的增删改查 1 建表时创建索引 [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY [别名] (字段名 [(长度)] [ASC|DESC] )主键直接写: PRIMARY KEY (Id)例如: CREATE TABLE people (id int NOT NULL PRIMARY KEY AUTO_INCREMENT,last_name varchar(10)…...
MySQL Host 被封锁解决方案(全版本适用 + Java 后端优化)
引言 MySQL 中 “Host is blocked because of many connection errors” 是生产环境常见问题,若处理不当会导致服务中断。本文结合 MySQL 官方文档(5.5/8.0)、Java 后端最佳实践及企业级经验,提供从 “快速解封” 到 “根源优化”…...

wifi 如果检查失败,UI 就会出现延迟或缺失打勾的现象。
问题:connectedSsid 的初始化依赖 onCreate 中的状态检查,如果检查失败,UI 就会出现延迟或缺失打勾的现象。 WIFI界面上上的一个标识代表成功连接。重启后出现偶尔不打勾的情况。 原始代码: // if (connectedSsid !…...

点云(point cloud):自动驾驶的“三维扫描图“
点云(Point Cloud):就是用很多“点”来表示一个物体或场景的三维形状和结构。(用点描绘的3D画,好比素描,但不是用线条勾勒,而是“点点点点”拼出物体形状) 观察这幅图像,…...
Redis 中如何保证缓存与数据库的数据一致性?
在 Redis 中保证缓存与数据库的数据一致性是一个关键问题,尤其是在高并发环境下。由于缓存和数据库是两个独立的数据存储系统,它们之间的数据同步存在延迟和不确定性,因此需要采取一系列策略来保证数据的一致性。以下是几种常用的方法和策略&…...

Oracle RAC节点时间差异同步测试
前言: Oracle Real Application Clusters (RAC) 集群依赖于各节点间的心跳检测与缓存融合等机制,这些机制对节点间的时钟同步性有极高的要求。如果集群内不同节点之间存在显著的时间偏差,可能会导致整个集群运行异常。在较早版本的RAC中&…...
python 打卡DAY27
##注入所需库 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import random import numpy as np import time import shap # from sklearn.svm import SVC #支持向量机分类器 # # from sklearn.neighbors import KNeighborsClassifier …...
位运算及其算法
计算机中的所有数在内存中都是以二进制形式进行存储的 ,位运算就是直接对整数二进制位进行操作,有些时候在程序中使用位运算进行操作,会得到极高的便利性。 有符号整数与无符号整数 我们以int整型为例,每个int占4个字节32个bit位…...
flutter getx路由管理、状态管理、路由守卫中间件、永久储存get_storage
一个简单的路由跳转、状态管理 目录 lib/ ├── main.dart ├── routes/index.dart // 路由表 ├── middlewares/auth_middleware.dart // 登录守卫 ├── pages/ │ ├── home_page.dart │ ├── login_page.dart │ └── profile_page.dart └─…...

贪心算法之跳跃游戏问题
问题背景 本文背景是leetcode的一道经典题目:跳跃游戏,描述如下: 给定一个非负整数数组 nums,初始位于数组的第一个位置(下标0)。数组中的每个元素表示在该位置可以跳跃的最大长度。判断是否能够到达最后…...
Dockers Compose常用指令介绍
Dockers Compose常用指令 1、常用指令介绍 1.1、version 指令 顶级一级指令,指定 compose 指定文件格式版本 version: "3.8" services: 不同版本支持的功能不同。常用版本有 ‘2’, ‘3’, ‘3.8’ 等。 1.2、services 指令 顶级一级指令࿰…...
YOLOv11 性能评估与横向对比
在第二章中,我们深入剖析了 YOLOv11 的核心技术,从骨干网络、颈部网络到头部,再到损失函数、数据增强和训练策略的创新,揭示了其高性能背后的奥秘。然而,理论的强大最终需要通过严谨的实验数据来验证。本章将详细阐述 …...
kafka在线增加分区副本数
1、问题来源 线上有一个物联网项目依赖kafka集群中指定主题消费,前些天kafka集群中的某一台机器出现了故障,导致kafka这个主题的数据一直无法消费,经查发现为了保证消息的顺序性此主题仅设置了一个分区,但是副本也仅有一个&#…...

Unity 如何使用Timeline预览、播放特效
在使用unity制作和拟合动画时,我们常用到Timeline,前后拖动滑轨,预览动画正放倒放非常方便。如果我们想对特效也进行这个操作,可以使用下文的步骤。 至此,恭喜你又解锁了一个新的技巧。如果我的分享对你有帮助…...
GIM发布新版本了 (附rust CLI制作brew bottle流程)
GIM 发布新版本了!现在1.3.0版本可用了 可以通过brew upgrade git-intelligence-message升级。 初次安装需要先执行 brew tap davelet/gim GIM 是一个根据git仓库内文件变更自动生成git提交消息的命令行工具,参考前文《GIM: 根据代码变更自动生成git提交…...
GitHub 趋势日报 (2025年05月21日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1microsoft/WSLLinux的Windows子系统⭐ 1731⭐ 25184C2virattt/ai-hedge-fundA…...

MySQL篇-其他面试题
MySQL事务 问题:事务是什么?ACID问题 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 1、事务…...

iOS 蓝牙开发中的 BT 与 BLE
在 iOS 开发者的语境里,大家把 BT 和 BLE 当成两种不同的蓝牙技术在谈——它们来自同一个 Bluetooth 规范,但面向的场景、协议栈乃至 Apple 提供的 API 都截然不同。 缩写全称 / 技术名称规范层叫法iOS 支持现状典型用途BTBluetooth Classic(…...
Git的工作区,暂存区,本地仓库
Git 核心概念解析 1. 工作区(Working Directory) - 日常操作代码的目录,包含项目所有文件和子目录 - 开发者直接编辑和修改文件的位置 - 实际可见的项目文件结构 2. 暂存区(Staging Area) - 临时保存修改记录的缓冲区…...

鸿蒙Flutter实战:21-混合开发详解-1-概述
引言 在前面的系列文章中,我们从搭建开发环境开始,讲到如何使用、集成第三方插件,如何将现有项目进行鸿蒙化改造,以及上架审核等内容;还以高德地图的 HarmonyOS SDK 的使用为例, 讲解了如何将高德地图集成…...
MySQL错误1419(HY000)解决方案:SUPER权限缺失与二进制日志启用冲突的3种处理方式
一、错误背景与原因分析 错误描述 在执行存储过程、函数或触发器时,MySQL可能抛出以下错误: ERROR 1419 (HY000): You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)…...

[架构之美]从PDMan一键生成数据库设计文档:Word导出全流程详解(二十)
[架构之美]从PDMan一键生成数据库设计文档:Word导出全流程详解(二十) 一、痛点 你是否经历过这些场景? 数据库字段频繁变更,维护文档耗时费力用Excel维护表结构,版本混乱难以追溯手动编写Word文档&#…...

大量程粗糙度轮廓仪适用于哪些材质和表面?
大量程粗糙度轮廓仪是一种能够在广泛的测量范围内对工件表面进行粗糙度分析的精密仪器。它通常采用接触式或非接触式传感器,通过对工件表面的扫描,捕捉表面微观的起伏和波动,从而获取粗糙度数据。该仪器不仅能测量微小的表面细节,…...
linux 查看java的安装路径
一、验证Java安装状态 java -version正常安装会显示版本信息: openjdk version "1.8.0_65" OpenJDK Runtime Environment (build 1.8.0_65-b17) OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)二、检查环境变量配置 若已配置JAVA_HOME&#…...