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…...

Armeria gPRC 高级特性 - 装饰器、无框架请求、阻塞处理器、Nacos集成、负载均衡、rpc异常处理、文档服务......
文章目录 定义一个示例高级特性装饰器概述简单案例多种装饰方式 无框架请求概述使用方式 阻塞任务处理器背景概述多种使用方式 rpc 异常统一处理使用方式更详细的异常信息 Armeria 提供 gRPC 客户端多种调用方式同步调用异步调用使用装饰器 负载均衡简单案例Armeria 提供的所有…...

如何制作一个企业网站,建设网站的基本步骤有哪些?
企业网站是企业的门面和名片,决定网民对企业的第一印象,因此,现在很多公司想做一个属于自己网站,但是不知道怎么做,更不知道从何做起,更别说做成了。为了能够让大家清楚如何做一个企业网站,现在…...

01-python+selenium自动化测试-基础学习
前言 基于python3和selenium3做自动化测试,俗话说:工欲善其事必先利其器;没有金刚钻就不揽那瓷器活,磨刀不误砍柴工,因此你必须会搭建基本的开发环境,掌握python基本的语法和一个IDE来进行开发,…...

【redis-05】redis保证和mysql数据一致性
redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…...

写一个登录判断机制py
创建一个简单的登录机制涉及到用户输入的验证和与数据库中存储的凭证的比较。以下是一个使用Python语言和SQLite数据库的示例。这个例子仅用于教学目的,实际应用中应该使用更安全的方法来存储和验证密码,比如使用密码哈希。 首先,你需要安装…...

特征点检测与匹配是计算机视觉中的基础任务之一,广泛应用于图像配准、物体识别、运动估计、三维重建等领域。
特征点检测与匹配是计算机视觉中的基础任务之一,广泛应用于图像配准、物体识别、运动估计、三维重建等领域。下面是一些关键的知识点: 1. 特征点检测 特征点检测的目的是从图像中找到独特的、稳定的点,这些点在图像变化(如旋转、…...

python——Echarts现交互式动态可视化
数据展示 20192018201720162015201420132012北京5817.15785.91765430.78755081.264723.864027.16093661.10973314.934天津2410.252106.23972310.35522723.52667.112390.35182079.07161760.0201河北3742.673513.86433233.83322849.872649.182446.61662295.62032084.2825山西234…...

【含开题报告+文档+PPT+源码】基于SSM框架的民宿酒店预定系统的设计与实现
开题报告 随着人们旅游需求的增加,民宿行业呈现出快速发展的趋势。传统的住宿方式逐渐无法满足人们对个性化、舒适、便捷的需求,而民宿作为一种新型的住宿选择,逐渐受到人们的青睐。民宿的特点是具有独特的风格、便捷的地理位置、相对亲近的…...

正确理解协程
import asyncio# 定义一个异步函数(协程) async def say_after(delay, what):# 等待指定的时间await asyncio.sleep(delay)# 打印消息print(what)# 定义另一个异步函数 async def main():# 同时启动两个协程,并等待这2个协程结束await say_af…...

蒙特卡罗方法 - 采样和蒙特卡罗方法篇
序言 蒙特卡罗( Monte Carlo \text{Monte Carlo} Monte Carlo)方法,也被称为计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第二次世界大战期间研制原子弹的“曼哈顿计划”。其核心思想是使用随机数&am…...