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

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析

  • 前言
  • STM32CubeIDE配置串口
    • USART和UART的选择
    • 使用模式
    • 参数设置
    • GPIO配置
    • DMA配置
    • 中断配置
    • 硬件流控制使能
  • 生成代码解析和使用方法
    • 串口初始化
    • __UART_HandleTypeDef结构体浅析
    • HAL库代码实际使用方法
      • 使用轮询方式发送
      • 使用轮询方式接收
      • 使用中断方式发送
      • 使用中断方式接收

前言

  本文从STM32CubeIDE的配置出发,详细介绍了配置流程,另外深入解析USART生成的HAL库初始化相关代码,并给出通过中断和轮询的接收、发送函数的使用方法。尤其对于中断发送函数、中断接收函数的使用和内部原理给出独到而又准确的见解,相信对你有很大的帮助!如果你有这方面的需要,相信你阅读完成会满载而归。

STM32CubeIDE配置串口

  对于串口的配置,比较简单,下面截几张图来描述一下。
在这里插入图片描述

USART和UART的选择

  先说①,选择芯片上的某一个USART或者UART。二者的区别是,前者是“通用同步异步收发器”,后者是“通用异步收发器”。前者比后者多了一个“同步模式”,也就是说,它会输出时钟信号,以此来配合这TX和RX引脚发送和接收信息。如果你之前了解过SPI,就知道我在说什么了。没有了解过也没有关系,跟着我的节奏看就行了,不要给自己加压力哈!如上图,我选择了USART1。

使用模式

  ②,选择当前使用的模式,图上显示了很多种,有“异步模式”、“同步模式”、“单线半双工模式”、“多处理器通信模式”、“IrDA模式”、“LIN模式”、“智能卡模式”、“智能卡带卡时钟的模式”。我们当前选择了“异步模式”。对于这么多种模式分别是什么,应用与哪些场景,这些我之后写一篇文章详细讲解。
在这里插入图片描述

参数设置

  ③,参数设置,包括传输的波特率,这里是默认的115200Bits/s,传输的字长是8位,如果我下面使能了校验位,那么这8位的最后一位就是校验位;也就是说,如果我的数据位只能是7位了!这个可以选择是8位还是9位。由于我在校验位上选择了None,那么就是说,我的8位字长全部用于传输数据。下面是停止位,可以i选择1或者2,在传输中表示一帧数据的结束的。之后就是数据传输方向,我选择既发送又接收,当然可以选择只接收或者只发送。最后是过采样倍数选择,可以是8倍,也可以是16倍。

GPIO配置

在这里插入图片描述
  可以选择具体的引脚来复用,在右边有芯片引脚分布,可以进行自由选择。(补充一下:要先确定了哪两个引脚复用,再进行参数设置、模式设置等)
在这里插入图片描述

DMA配置

  关于DMA的配置比较简单,如下图,保持默认配置就可以。
在这里插入图片描述
接收的话,自然是外设到内存,内存地址需要自增,外设每次都读DR寄存器,自然不用自增地址。
发送的话,自然是内存到外设,内存地址需要自增,外设不用自增地址。

中断配置

在这里插入图片描述
  在使能框打勾,表示使能了串口中断。但我们注意到优先级都是0,这就有点高,可以修改下。
在这里插入图片描述
  在NVIC里面,选择中断优先级分组,之后就是下面的中断进行使能和设定优先级。数字越小,优先级越高。滴答定时器优先级设置为最高,串口设置的低一些。你肯定不愿意在串口的中断函数里如果使用了HAL_Delay函数之后,就卡死出不来了,是不是?那么就把滴答定时器优先级设置的高一些!当然在中断函数里一般不会去延时,这样不明智。但凡事考虑周到嘛。

硬件流控制使能

  补充说明一下,所谓的硬件流,就是通信双方在接收或者发送过程中“通个气”,告诉对方,我现在是否方便接收或者发送,如果不方便,你先别发送数据过来,或者我先不发送数据给你。如果我告诉你,我现在不方便发送,那么总线上的电平信号,你不用采集,也不用管。
在这里插入图片描述

生成代码解析和使用方法

上面已经完成了配置介绍,下面就讲一下生成的代码吧。

串口初始化

在main.c文件中会在主函数初始化阶段调用下面的函数:

MX_USART1_UART_Init();

我们也就先从这个函数入手,看看它做了什么。跟我们上面的配置是怎么一一对应的。

在usart.c文件中,定义了此函数的函数体,如下:

void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}
}

  还记得我们上面的配置吧,看看是不是我们使用的USART1、波特率,字长、停止位、奇偶校验、数据传输方向是接收和发送,过采样使用16倍。这些跟我们的配置是一一对应的。
  但我们看到还有一些信息没有对应进来,比如我们使用的GPIO,在HAL_UART_Init()函数内部也有操作。进去看看?

HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
{/* Check the UART handle allocation */if (huart == NULL){return HAL_ERROR;}/* Check the parameters */if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE){/* The hardware flow control is available only for USART1, USART2, USART3 and USART6.Except for STM32F446xx devices, that is available for USART1, USART2, USART3, USART6, UART4 and UART5.*/assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));}else{assert_param(IS_UART_INSTANCE(huart->Instance));}assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));if 

相关文章:

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

CSS | transition 和 transform的用处和区别

省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Go语言多线程问题

打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

GitHub 趋势日报 (2025年06月06日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四&#xff…...

快刀集(1): 一刀斩断视频片头广告

一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​:Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

免费数学几何作图web平台

光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

基于Springboot+Vue的办公管理系统

角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

【网络安全】开源系统getshell漏洞挖掘

审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

C++ 设计模式 《小明的奶茶加料风波》

👨‍🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...