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

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测试&#xff0c;否则会有一堆问题&#xff0c;pom.xml修改如下&#xff1a; <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>${surefire.version}</ve…...

vulnhub-THE PLANETS-EARTH靶机

下载并导入靶机至VMWare&#xff0c;设置网络模式为NAT&#xff0c;开机 开启攻击机&#xff08;kali&#xff09;&#xff0c;也设置为Nat模式&#xff0c;与靶机处于同一网段 扫描靶机ip Nmap 192.168.114.0/24 扫描网段内活跃的主机 可以推断靶机ip为192.168.114.129 扫描…...

【C语言】分支和循环(2)

&#x1f914;个人主页: 起名字真南 &#x1f619;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 关系操作符2 条件操作符3 逻辑操作符 &#xff1a;|| &#xff0c;&& &#xff0c;&#xff01;3.1 逻辑取反运算符3.2 与运算符3.3 或运算符3.4 练习闰年判断3.5 短…...

Python数据分析-远程办公与心理健康分析

一、研究背景 随着信息技术的飞速发展和全球化的推进&#xff0c;远程工作&#xff08;Remote Work&#xff09;成为越来越多企业和员工的选择。尤其是在2020年新冠疫情&#xff08;COVID-19&#xff09;爆发后&#xff0c;全球范围内的封锁措施使得远程工作模式迅速普及。根据…...

LabVIEW提高开发效率技巧----使用动态事件

在LabVIEW开发过程中&#xff0c;用户交互行为可能是多样且不可预知的。为应对这些变化&#xff0c;使用动态事件是一种有效的策略。本文将从多个角度详细介绍动态事件的概念及其在LabVIEW开发中的应用技巧&#xff0c;并结合实际案例&#xff0c;说明如何通过动态事件提高程序…...

【STM32开发之寄存器版】(五)-窗口看门狗WWDG

一、前言 窗口看门狗简介&#xff1a; 窗口看门狗通常被用来监测&#xff0c;由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新&#xff0c;看门狗电路在达到预置的时间周期时&#xff0c;会产生一个M…...

Leetcode203.移除链表元素-Python

题目链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&a…...

属性拷贝MapStruct

端请求通过VO对象接收&#xff0c;并通过DTO对象进行流转&#xff0c;最后转换成DO对象与数据库DAO层进行交互&#xff0c;反之亦然。 当业务简单的时候&#xff0c;可以通过手动编码getter/setter函数来复制对象属性。但是当业务变的复杂&#xff0c;对象属性变得很多&#x…...

Chromium 添加书签功能浅析c++

1、在点击添加书签时候此UI控制逻辑代码在 chrome\browser\ui\views\bookmarks\bookmark_bar_view.cc chrome\browser\ui\views\bookmarks\bookmark_bar_view.h 可以在此看到完成 移除 按钮逻辑&#xff0c;以及书签监听事件等。。。 // Implementation for BookmarkNodeAdd…...

Spring Cloud Netflix Ribbon 负载均衡详解和案例示范

1. 引言 在传统的集中式架构中&#xff0c;负载均衡器一般是放置在服务器端的&#xff0c;例如 Nginx等。随着微服务架构的兴起&#xff0c;服务实例的数量和部署地点变得更加动态和分布式&#xff0c;这使得在客户端进行负载均衡成为了一种可行且更灵活的方案。Netflix Ribbo…...

Ryujinx模拟器:3步搞定Switch游戏在PC上流畅运行

Ryujinx模拟器&#xff1a;3步搞定Switch游戏在PC上流畅运行 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想在电脑上体验Switch独占大作却不知从何入手&#xff1f;Ryujinx模拟器为…...

别再傻傻分不清!CANoe里CAPL节点到底该放Measurement Setup还是Simulation Setup?

CANoe实战指南&#xff1a;CAPL节点在Measurement与Simulation Setup中的精准选择策略 在汽车电子系统开发与测试领域&#xff0c;CANoe作为行业标准工具&#xff0c;其CAPL&#xff08;CAN Access Programming Language&#xff09;节点的正确配置直接影响测试结果的准确性和可…...

诺和诺德牵手OpenAI,能否夺回“药王”之位?

01 诺和诺德牵手OpenAI就在最近&#xff0c;诺和诺德&#xff08;Novo Nordisk&#xff09;宣布与OpenAI合作&#xff0c;消息发布后&#xff0c;诺和诺德股价短线上涨近4%。很多人或许不知道“诺和诺德”&#xff0c;但“司美格鲁肽”却广为人知&#xff0c;诺和诺德正是研发出…...

别再折腾了!我整理好的Elsevier LaTeX模板(通用版+复杂版)直接拿来用

Elsevier LaTeX模板终极避坑指南&#xff1a;从编译报错到一键投稿 第一次打开Elsevier官方LaTeX模板时&#xff0c;我盯着满屏的报错信息足足愣了五分钟——作为一个刚踏入科研领域的研究生&#xff0c;这简直像在解一道没有提示的数学证明题。经过三个月的反复试错和数十次期…...

【新手实用技能指南】OpenClaw 2.7.1 实用 Skill 技能全推荐(含安装包)

OpenClaw 实用 Skill 技能推荐&#xff5c;办公效率全面提升&#xff08;新手必开&#xff09; OpenClaw&#xff08;小龙虾&#xff09;的核心优势在于Skill 技能扩展&#xff0c;开启适配技能后&#xff0c;AI 可脱离单纯对话模式&#xff0c;自主完成各类电脑操作任务。本文…...

CST实战指南 | 场路协同仿真中的元器件模型导入与验证

1. 场路协同仿真中的元器件模型导入基础 我第一次接触CST场路协同仿真时&#xff0c;最头疼的就是如何把各种元器件模型正确导入到仿真环境中。经过多次项目实践&#xff0c;我发现这其实是个系统性工程&#xff0c;需要根据不同的仿真场景和元器件类型采取不同的处理策略。 在…...

忘记压缩包密码怎么办?5分钟学会用ArchivePasswordTestTool找回密码

忘记压缩包密码怎么办&#xff1f;5分钟学会用ArchivePasswordTestTool找回密码 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾经…...

Transformer架构与混合专家系统(MoE)的技术演进与应用

1. Transformer架构与混合专家系统(MoE)的演进之路2017年&#xff0c;Transformer架构的横空出世彻底改变了自然语言处理的游戏规则。这种基于自注意力机制的架构不仅在各种序列建模任务中展现出惊人性能&#xff0c;更为后续的大规模语言模型奠定了坚实基础。然而&#xff0c;…...

深入RISC-V链接脚本:从.lds文件看C程序的内存‘出生’与‘搬家’全过程

深入RISC-V链接脚本&#xff1a;从.lds文件看C程序的内存‘出生’与‘搬家’全过程 在嵌入式开发的世界里&#xff0c;一个C程序从源代码到最终在硬件上运行&#xff0c;经历了编译、链接和加载三个关键阶段。这个过程就像一个人的生命历程&#xff1a;编译是"出生"&…...

Python应用性能监控实战:New Relic APM代理原理与部署指南

1. 项目概述&#xff1a;一个现代应用性能的“听诊器”如果你正在用Python构建Web服务、后台任务或者任何需要7x24小时稳定运行的应用&#xff0c;那么“性能”和“可观测性”这两个词&#xff0c;一定是你日常工作中绕不开的焦点。当线上服务突然变慢&#xff0c;用户投诉接踵…...