STM32 HAL库UART查询方式实例
本文中介绍USART编程涵盖了三种主要方法,详细介绍STM32F407微控制器结合HAL库,通过UART的查询方式来实现一个实用的密码验证程序。提示用户键入一个字符作为密码。只有当用户精准地输入字符'6'时,系统才会反馈“密码正确”的确认信息。反之,若输入的字符非'6',则会立即显示“密码错误,请重新输入”的提示。
一、USART编程主要三种方法
1. 查询方式
查询方式是最基础、最简单的UART编程方法。其基本原理是:主程序通过不断查询UART的状态寄存器,以确定是否可以进行数据的发送或接收。
- 发送数据:在发送数据之前,程序可以首先检查TDR寄存器是否为空(即发送缓冲区是否空闲)。如果TDR为空,则可以将数据写入TDR寄存器,并等待发送完成(通常通过查询相关状态位来判断)。为了简化编程,也可以先写入数据,然后再检查发送状态。
- 接收数据:在接收数据时,程序需要不断查询RDR寄存器是否为非空(即接收缓冲区是否有数据)。如果RDR非空,则可以读取RDR寄存器中的数据,并进行相应的处理。
查询方式的优点是编程简单、直观,但缺点是CPU利用率较低,因为主程序需要不断轮询UART状态寄存器。
2. 中断方式
中断方式是一种更加高效的UART编程方法。它利用中断机制,在UART状态发生变化时自动触发中断处理函数,从而减轻CPU的负担。
- 发送数据:在发送数据时,程序可以配置UART以在发送缓冲区空(TXE)时产生中断。在TXE中断处理函数中,程序从发送缓冲区中取出一个数据,并写入TDR寄存器。当TDR中的数据发送完成后,UART会再次触发TXE中断,程序可以继续发送下一个数据。
- 接收数据:在接收数据时,程序可以配置UART以在接收缓冲区有数据(RXNE)时产生中断。在RXNE中断处理函数中,程序读取RDR寄存器中的数据,并将其存储到接收缓冲区中。如果接收缓冲区未满,则UART会继续接收数据并触发RXNE中断。
中断方式的优点是CPU利用率高、实时性好,但缺点是编程相对复杂,需要处理中断优先级和中断嵌套等问题。
3. DMA方式
DMA方式是一种更加高级的UART编程方法。它利用DMA控制器,在UART和内存之间直接传输数据,无需CPU的参与。
- 发送数据:在发送数据时,程序可以将发送缓冲区的地址和长度配置给DMA控制器,并启动DMA传输。DMA控制器会自动从发送缓冲区中读取数据,并写入UART的TDR寄存器。当TDR中的数据发送完成后,DMA控制器会自动从发送缓冲区中读取下一个数据,并继续发送。整个过程无需CPU的干预。
- 接收数据:在接收数据时,程序可以将接收缓冲区的地址和长度配置给DMA控制器,并启动DMA接收。DMA控制器会自动从UART的RDR寄存器中读取数据,并存储到接收缓冲区中。当接收缓冲区满或接收到特定数量的数据时,DMA控制器可以触发一个中断或事件,通知CPU进行后续处理。
DMA方式的优点是数据传输效率高、CPU负担轻,但缺点是编程相对复杂,需要了解DMA控制器的配置和使用方法。
二、USART 查询方式具体实现
下面介绍STM32F407 HAL库下的UART查询方式编程。 在STM32F407微控制器上,通过HAL库使用UART的查询方式来实现一个简单的密码验证程序,程序将提示用户输入一个字符作为密码,只有当用户输入字符'6'时,才会显示密码正确“The password is correct”,否则将提示密码错误重新输入“The password is incorrect, please re-enter it”,并允许用户重新输入。
0.开发环境
硬件:正点原子探索者 V3 STM32F407开发板
单片机:STM32F407ZGT6
Keil版本:5.32
STM32CubeMX版本:6.9.2
STM32Cube MCU Packges版本:STM32F4xx_DFP.2.14.0
串口:USART1(PA9,PA10)
1.STM32CubeMX配置
参考利用STM32 HAL库实现USART串口通信,并通过printf重定向输出“Hello World“
2.编写主程序
在生成的项目基础上,编写主程序main.c。
int main(void)
{/* USER CODE BEGIN 1 */char c;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Transmit(&huart1, "Please enter a char for password: \r\n", strlen("Please enter a char for password: \r\n"), 1000);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */while (HAL_OK != HAL_UART_Receive(&huart1, &c, 1, 100));if('6'==c){HAL_UART_Transmit(&huart1, "The password is correct\r\n", strlen("The password is correct\r\n"), 1000);}else{HAL_UART_Transmit(&huart1, "The password is incorrect, please re-enter it\r\n", strlen("The password is incorrect, please re-enter it\r\n"), 1000);};}/* USER CODE END 3 */
}
3.运行结果
串口打印Please enter a char for password: 只有当用户输入字符'6'时,才会显示“The password is correct”,否则将提示“The password is incorrect, please re-enter it”,并允许用户重新输入。

下一篇再来介绍中断和DMA方式。
相关文章:
STM32 HAL库UART查询方式实例
本文中介绍USART编程涵盖了三种主要方法,详细介绍STM32F407微控制器结合HAL库,通过UART的查询方式来实现一个实用的密码验证程序。提示用户键入一个字符作为密码。只有当用户精准地输入字符6时,系统才会反馈“密码正确”的确认信息。反之&…...
数据结构--线性表双向链表的实现
目录 思路设计 总体思维导图 插入部分 头插法尾插法 任意位置插入 删除部分 头结点 尾节点 中间节点 只有头结点且删除的就是头结点 编辑 清空链表部分 遍历清空链表的所有节点 不遍历清空 各部分代码 Main部分 MyListedList部分 IndexOutOfException部分 …...
第一个Flutter应用(一)
1、创建项目 1.1 新建 1.2 选择Flutter SDK的位置 1.3 项目名称 英文单词加下划线起名规范,其他默认即可。 1.4 点击运行 发生报错显示我们的JAVA版本不符合 1.5 更改版本设置 1.6 再次启动项目 2、分析页面代码 以下是lib/main.dart的源代码(为了阅…...
批量查询快递单号物流信息:高效掌握最后更新动态
在电商和物流行业蓬勃发展的今天,快递单号的物流信息追踪显得尤为重要。对于商家和客户来说,了解包裹的最后更新物流状态是确保货物安全、及时送达的关键。本文将介绍如何批量查询快递单号的物流信息,帮助您高效掌握每个包裹的最新动态。 1运…...
随着硬件水平的提升,LabVIEW有哪些过去的编程方法被淘汰掉了
随着硬件水平的不断提升,尤其是处理器性能、存储能力、通信速度等方面的飞跃,LabVIEW的一些早期编程方法逐渐被更高效、现代的编程技术所取代。以下是一些随着硬件升级而逐步淘汰的LabVIEW编程方法和技术: 1. 低效的数据流传输方式 过去由于…...
Leetcode 206.反转链表
题目链接:206. 反转链表 - 力扣(LeetCode) 题目描述: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 解题思路…...
基于springboot和vue.js 养老院管理系统设计与实现
博主介绍:专注于Java(springboot ssm springcloud等开发框架) vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆…...
高效数据处理:MapReduce与Hive的实战应用
文章目录 hive分析汇总互联网日志分析1.项目需求2.数据说明3.算法思路 用户电影推荐1.项目需求2.数据说明3.算法思路4.解题步骤 简单数据统计WordCount数据说明 疫情数据分析1.项目需求2.数据说明step1:创建ods层数据表step2:创建dwd层数据表step3:创建d…...
【含开题报告+文档+PPT+源码】基于springboot的迎新系统
开题报告 大学迎新系统是为了满足大学在新生入学时的信息化处理需求而开发的系统。在传统方式下,我们新生接待工作是需要新生报名表,就使得我们需要耗费大量的纸张,这将造成资源浪费。在接待新生的时候需要让新生勾选、填写大量的表格&#…...
C#-委托delegate
C#-委托delegate 通常情况下,函数内部需要调用其他函数来实现代码的重用,但这样有一个问题: 如果需要更换所调用的函数则需要对该函数的定义再次修改, 事实上,在程序运行过程中,函数也是作为一个存储在堆中…...
编译Thingsboard3.7.0的过程记录
1、首先去掉test测试,否则会有一堆问题,pom.xml修改如下: <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>${surefire.version}</ve…...
vulnhub-THE PLANETS-EARTH靶机
下载并导入靶机至VMWare,设置网络模式为NAT,开机 开启攻击机(kali),也设置为Nat模式,与靶机处于同一网段 扫描靶机ip Nmap 192.168.114.0/24 扫描网段内活跃的主机 可以推断靶机ip为192.168.114.129 扫描…...
【C语言】分支和循环(2)
🤔个人主页: 起名字真南 😙个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 关系操作符2 条件操作符3 逻辑操作符 :|| ,&& ,!3.1 逻辑取反运算符3.2 与运算符3.3 或运算符3.4 练习闰年判断3.5 短…...
Python数据分析-远程办公与心理健康分析
一、研究背景 随着信息技术的飞速发展和全球化的推进,远程工作(Remote Work)成为越来越多企业和员工的选择。尤其是在2020年新冠疫情(COVID-19)爆发后,全球范围内的封锁措施使得远程工作模式迅速普及。根据…...
LabVIEW提高开发效率技巧----使用动态事件
在LabVIEW开发过程中,用户交互行为可能是多样且不可预知的。为应对这些变化,使用动态事件是一种有效的策略。本文将从多个角度详细介绍动态事件的概念及其在LabVIEW开发中的应用技巧,并结合实际案例,说明如何通过动态事件提高程序…...
【STM32开发之寄存器版】(五)-窗口看门狗WWDG
一、前言 窗口看门狗简介: 窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个M…...
Leetcode203.移除链表元素-Python
题目链接:203. 移除链表元素 - 力扣(LeetCode) 题目描述: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入&a…...
属性拷贝MapStruct
端请求通过VO对象接收,并通过DTO对象进行流转,最后转换成DO对象与数据库DAO层进行交互,反之亦然。 当业务简单的时候,可以通过手动编码getter/setter函数来复制对象属性。但是当业务变的复杂,对象属性变得很多&#x…...
Chromium 添加书签功能浅析c++
1、在点击添加书签时候此UI控制逻辑代码在 chrome\browser\ui\views\bookmarks\bookmark_bar_view.cc chrome\browser\ui\views\bookmarks\bookmark_bar_view.h 可以在此看到完成 移除 按钮逻辑,以及书签监听事件等。。。 // Implementation for BookmarkNodeAdd…...
Spring Cloud Netflix Ribbon 负载均衡详解和案例示范
1. 引言 在传统的集中式架构中,负载均衡器一般是放置在服务器端的,例如 Nginx等。随着微服务架构的兴起,服务实例的数量和部署地点变得更加动态和分布式,这使得在客户端进行负载均衡成为了一种可行且更灵活的方案。Netflix Ribbo…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...
2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
