STM32学习笔记-----UART的概念
在 STM32 中,UART(Universal Asynchronous Receiver/Transmitter)是一种常用的串行通信接口,广泛应用于嵌入式系统中。STM32 提供了丰富的硬件资源来支持 UART 通信,可以通过标准库(STM32 HAL 或者标准外设库)来进行配置和操作。
1. UART 基本概念
UART 是一种异步通信协议,通常用于两台设备之间的串行数据传输。它通过两根线:TX(Transmit)和RX(Receive),分别用于发送和接收数据。
UART 的工作原理:
- 异步通信:没有时钟信号的同步,数据传输速度由波特率决定。发送方和接收方的波特率必须相同。
- 数据格式:数据通常以帧的形式传输,每帧由起始位、数据位、停止位和可能的校验位组成。
- 起始位:标志数据帧的开始。
- 数据位:通常为 8 位或 9 位数据。
- 停止位:标志数据帧的结束,通常为 1 位或 2 位。
- 校验位(可选):用于检测数据传输的错误。
2. STM32 UART 外设概述
在 STM32 系列中,UART 是通过硬件外设模块实现的。不同型号的 STM32 可能有 1 到多个 UART 外设,比如 USART1、USART2 等。每个 UART 外设通常具有如下功能:
- 波特率(Baud rate)设置
- 数据位(Data bits)设置
- 校验位(Parity)设置
- 停止位(Stop bits)设置
- 流控(Flow control)
3. STM32 标准库下的 UART 配置
3.1 初始化 UART 外设
使用 STM32 标准外设库进行 UART 配置时,通常需要配置 USARTx_InitTypeDef 结构体和相关外设寄存器。以下是基本的 UART 初始化步骤:
-
使能 UART 外设的时钟: 每个 UART 外设都连接到一个时钟源,必须使能时钟以便能够使用 UART 功能。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); -
配置 UART 引脚: UART 通常需要连接到相应的 I/O 引脚上,例如 STM32 的 TX 和 RX 引脚,配置这些引脚的模式为复用功能。
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; // TX, RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); -
配置 UART 外设参数: 配置如波特率、数据位、停止位、校验位等参数。
USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; // 波特率设置 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 数据位长度 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位 USART_InitStructure.USART_Parity = USART_Parity_No; // 无校验 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无流控 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 启用发送和接收功能 USART_Init(USART2, &USART_InitStructure); -
使能 UART 外设: 配置完毕后,启用 UART 外设。
USART_Cmd(USART2, ENABLE);
3.2 UART 发送数据
使用 USART_SendData() 函数发送数据:
USART_SendData(USART2, data); // 发送一个字节数据
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); // 等待发送完成
3.3 UART 接收数据
使用 USART_ReceiveData() 函数接收数据:
if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET) {data = USART_ReceiveData(USART2); // 接收数据
}
4. 中断和 DMA 支持
- 中断方式:可以通过配置中断来实现更高效的通信处理,STM32 提供了丰富的中断支持,如接收中断、发送中断等。
- DMA 支持:UART 也可以通过 DMA 来进行数据传输,避免 CPU 的干预,提高数据传输效率。
配置中断的例:
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // 接收中断使能
5. 标准库与 HAL 库的区别
- 标准外设库:这是 STM32 最初的库,提供了较低级别的操作接口,适合需要直接控制硬件的开发者。它是基于寄存器操作的,灵活但可能比较繁琐。
- HAL 库:硬件抽象层(HAL)库封装了更多的硬件操作,简化了开发工作。HAL 提供了更高级别的 API,可以在不深入硬件细节的情况下进行开发。
如果使用 STM32 标准外设库,基本上会手动操作寄存器,而使用 HAL 库时,很多操作都已经封装好了。对于大多数应用,使用 HAL 库可以更快速地实现 UART 通信。
6. 常见的配置选项
在使用 STM32 标准库时,通常会涉及到以下几个配置项:
- 波特率(Baud Rate):通信双方必须使用相同的波特率。
- 数据位(Word Length):通常为 8 位或 9 位。
- 停止位(Stop Bits):一般为 1 或 2 位。
- 校验位(Parity):可以选择奇校验、偶校验或无校验。
- 流控(Flow Control):可以配置硬件流控(如 RTS/CTS)或软件流控(如 XON/XOFF)。
总结
在 STM32 中,通过标准外设库配置 UART 可以实现简单的串行通信,完成数据的发送和接收。配置过程包括引脚配置、外设时钟使能、外设初始化、数据传输控制等。通过中断或 DMA 可以提高效率,适应更复杂的应用场景。选择标准库还是 HAL 库则取决于具体的应用需求和开发者的偏好。
相关文章:
STM32学习笔记-----UART的概念
在 STM32 中,UART(Universal Asynchronous Receiver/Transmitter)是一种常用的串行通信接口,广泛应用于嵌入式系统中。STM32 提供了丰富的硬件资源来支持 UART 通信,可以通过标准库(STM32 HAL 或者标准外设…...
Pytest-Bdd-Playwright 系列教程(9):datatable 参数的使用
Pytest-Bdd-Playwright 系列教程(9):datatable 参数的使用 前言一、什么是 datatable 参数?Gherkin 表格示例 二、datatable 参数的基本使用feature文件:获取用户信息并执行相关操作的使用 datatable 处理表格数据Give…...
【408】SDN重点笔记
总特征:数据平面(负责转发)与控制平面(负责控制)分离 控制平面: 由服务器和软件组成。控制平面完成转发表,并分发。 路由器不再需要路由选择协议,不再交换信息,只负责收到…...
云运维基础
笔记内容侵权联系删除 云审计(CTS) 云审计云上资源变更均可被管控,实时系统性记录所有人的操作,无需手工统计。云审计服务支持将操作记录合并,周期性地生成事件文件实时同步转存到OBS存储桶,帮助用户实现…...
基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)
摘 要 互联网发展至今,广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力…...
Rust开发一个命令行工具(一,简单版持续更新)
依赖的包 cargo add clap --features derive clap命令行参数解析 项目目录 代码 main.rs mod utils;use clap::Parser; use utils::{editor::open_in_vscode,fs_tools::{file_exists, get_file, is_dir, list_dir, read_file}, }; /// 在文件中搜索模式并显示包含它的行。…...
实战:深入探讨 MySQL 和 SQL Server 全文索引的使用及其弊端
在数据库中处理大量文本数据时,包含搜索(例如查找包含特定单词的文本)往往是必需的。然而,直接使用 LIKE %text% 的方式在大数据量中进行模糊查询会造成性能瓶颈。为了解决这一问题,MySQL 和 SQL Server 提供了全文索引(Full-Text Indexing)功能,可以显著加速文本数据的…...
情景2 虚拟化世界 自己答案的理解
1、什么是虚拟化? 答:版本很多,选了两个作为参考。 定义1:虚拟化是创造设备或者资源的虚拟版本,如服务器、存储设备、网络或者操作系统。 定义2:虚拟化是资源的逻辑表示,它不受物理限制的约束。 2、寄生…...
【国产操作系统对Qt支持有哪些?】
国产操作系统 鸿蒙操作系统:由华为开发,主要用于智能设备和物联网领域。 深度操作系统:基于Linux的操作系统,适用于个人电脑和服务器。 中标麒麟:由中国电子科技集团公司研发,适用于服务器和桌面环境。 悠然操作系统:面向教育和个人用户的Linux发行版。 红旗Linux:早期…...
深度学习--正则化
笔记内容侵权联系删 过拟合问题 过拟合问题描述:模型在训练集表现优异,但在测试集上表现较差。 根本原因:特征维度过多,模型假设过于复杂,参数过多,训练数据过少,噪声过多导致拟合出的函数几乎完美的对训练集做出预…...
PHP反序列化_1
目录 一、基本概念 1. 序列化 2. 反序列化 二、反序列化漏洞 1. 漏洞产生原因 2. 魔术方法 3.利用魔术方法进行攻击的示例: 一、基本概念 什么是 PHP 反序列化 PHP 反序列化是将序列化后的字符串恢复为原始 PHP 数据类型(如对象、数组等&#x…...
深度学习在图像识别中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 深度学习在图像识别中的应用 深度学习在图像识别中的应用 深度学习在图像识别中的应用 引言 深度学习概述 定义与原理 发展历程 …...
SQL面试题——奔驰SQL面试题 车辆在不同驾驶模式下的时间
SQL面试题——奔驰SQL面试题 我们的表大致如下 CREATE TABLE signal_log( vin STRING COMMENTvehicle frame id, signal_name STRING COMMENTfunction name, signal_value STRING COMMENT signal value , ts BIGINT COMMENTevent timestamp, dt STRING COMMENTformat yyyy-mm…...
Leecode刷题C语言之统计好节点的数目
执行结果:通过 执行用时和内存消耗如下: 题目:统计好节点的数目 现有一棵 无向 树,树中包含 n 个节点,按从 0 到 n - 1 标记。树的根节点是节点 0 。给你一个长度为 n - 1 的二维整数数组 edges,其中 edges[i] [ai,…...
webpack5 + vue3 从零配置项目
前言 虽然在实际项目当中很少会从 0 到 1 配置一个项目,毕竟很多重复工作是没有必要的,脚手架将这些重复性的工作进行了整合,方便开发者使用。也正因如此,导致部分开发者过于依赖脚手架,却不清楚其内部的实现流程&…...
Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践
案例问题描述 该案例来自一个金融行业客户的问题:他们发现某个应用对一个数据量相对较小的表(仅包含数千条记录)访问时,频繁遇到性能下降的情况。为解决此问题,客户向我们求助进行分析。我们发现这张表有频繁的批量插…...
./mysqld: error while loading shared libraries: libaio.so.1: cannot open sha
mysql:5.6 使用离线方式安装:rpm -ivh --nodeps mysql* ,执行 systemctl start mysqld.service发现启动不了,通过vi /var/log/mysql.log看到如下关键字:libraries: libaio.so.1,之前也是按照网上帖子各种修改都没有解决…...
Qt主线程把数据发给子线程,主线程会阻塞吗
演示: #include <QCoreApplication> #include <QThread> #include <QObject> #include <QDebug>// 子线程类 class Worker : public QObject {Q_OBJECT public slots:void processData(int data) {qDebug() << "Processing dat…...
前后端、网关、协议方面补充
这里写目录标题 前后端接口文档简介前后端视角对于前端对于后端代码注册路由路由处理函数 关于httpGET/POST底层网络关于前端的获取 路由器网关路由器的IP简介公网IP(WAN IP)私网IP(LAN IP)无线网络IP(WIFI IP)查询路由器私网IP路由器公网IP LAN口与WIFI简介基本原理 手动配置电…...
如何在Mac上切换到JDK 17开发环境
在本文中,我将为您介绍如何在Mac上切换到JDK 17,包括下载和安装JDK 17、设置环境变量、在IntelliJ IDEA中配置项目、修改Maven编译配置,并最终使用mvn clean install重新编译项目。通过这个流程,您可以顺利地将开发环境升级到JDK …...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
