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 外设,比如 USART1USART2 等。每个 UART 外设通常具有如下功能:

  • 波特率(Baud rate)设置
  • 数据位(Data bits)设置
  • 校验位(Parity)设置
  • 停止位(Stop bits)设置
  • 流控(Flow control)

3. STM32 标准库下的 UART 配置

3.1 初始化 UART 外设

使用 STM32 标准外设库进行 UART 配置时,通常需要配置 USARTx_InitTypeDef 结构体和相关外设寄存器。以下是基本的 UART 初始化步骤:

  1. 使能 UART 外设的时钟: 每个 UART 外设都连接到一个时钟源,必须使能时钟以便能够使用 UART 功能。

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  2. 配置 UART 引脚: UART 通常需要连接到相应的 I/O 引脚上,例如 STM32 的 TXRX 引脚,配置这些引脚的模式为复用功能。

    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);
  3. 配置 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);
  4. 使能 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 库则取决于具体的应用需求和开发者的偏好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471827.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MFC工控项目实例三十实现一个简单的流程

启动按钮夹紧 密闭,时间0到平衡 进气,时间1到进气关,时间2到平衡关 检测,时间3到平衡 排气,时间4到夹紧开、密闭开、排气关。 相关代码 void CSEAL_PRESSUREDlg::OnTimer_2(UINT nIDEvent_2) {// if (nIDEvent_21 &am…

Java I/O(输入/输出)——针对实习面试

目录 Java I/O(输入/输出)什么是Java I/O流?字节流和字符流有什么区别?什么是缓冲流?为什么要使用缓冲流?Java I/O中的设计模式有哪些?什么是BIO?什么是NIO?什么是AIO&am…

Exploring Defeasible Reasoning in Large Language Models: A Chain-of-Thought A

文章目录 题目摘要简介准备工作数据集生成方法实验结论 题目 探索大型语言模型中的可废止推理:思路链 论文地址:http://collegepublications.co.uk/downloads/LNGAI00004.pdf#page136 摘要 许多大型语言模型 (LLM) 经过大量高质量数据语料库的训练&…

数据结构--数组

一.线性和非线性 线性:除首尾外只有一个唯一的前驱和后继。eg:数组,链表等。 非线性:不是线性的就是非线性。 二.数组是什么? 数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一…

MySQL技巧之跨服务器数据查询:基础篇-更新语句如何写

MySQL技巧之跨服务器数据查询:基础篇-更新语句如何写 上一篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的连接名: MY_ODBC_MYSQL 以及用同样的…

Unity教程(十八)战斗系统 攻击逻辑

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

前端学习八股资料CSS(二)

更多详情:爱米的前端小笔记,更多前端内容,等你来看!这些都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们的支持才是我不断更新的动力!找…

云计算研究实训室建设方案

一、引言 随着云计算技术的迅速发展和广泛应用,职业院校面临着培养云计算领域专业人才的迫切需求。本方案旨在构建一个先进的云计算研究实训室,为学生提供一个集理论学习、实践操作、技术研发与创新于一体的综合性学习平台,以促进云计算技术…

通过Python 调整Excel行高、列宽

在Excel中,默认的行高和列宽可能不足以完全显示某些单元格中的内容,特别是当内容较长时。通过调整行高和列宽,可以确保所有数据都能完整显示,避免内容被截断。合理的行高和列宽可以使表格看起来更加整洁和专业,尤其是在…

【代码审计】常见漏洞专项审计-业务逻辑漏洞审计

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 0x01 漏洞介绍 1、 原理 业务逻辑漏洞是一类特殊的安全漏洞,业务逻辑漏洞属于设计漏洞而非实…

Wordpress常用配置,包括看板娘跨域等

一个Wordpress的博客已经搭建完成了,那么为了让它看起来更有人间烟火气一点,有一些常用的初始配置,这里整理一下。 修改页脚 页脚这里默认会显示Powered by Wordpress,还有一个原因是这里要加上备案信息。在主题里找到页脚&…

数据库范式、MySQL 架构、算法与树的深入解析

一、数据库范式 在数据库设计中,范式是一系列规则,用于确保数据的组织和存储具有良好的结构、完整性以及最小化的数据冗余。如果不遵循范式设计,数据可能会以平铺式罗列,仅使用冒号、分号等简单分隔。这种方式存在诸多弊端&#…

Taro React-Native IOS 打包发布

http网络请求不到 配置 fix react-native facebook::flipper::SocketCertificateProvider‘ (aka ‘int‘) is not a function or func_rn运行debug提示flipper-CSDN博客 Xcode 15(iOS17)编译适配报错_no template named function in namespace std-CS…

基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要:车型识别在交通管理、智能监控和车辆管理中起着至关重要的作用,不仅能帮助相关部门快速识别车辆类型,还为自动化交通监控提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的车型识别模型,该模型使用了…

从python源码到可自动更新软件

相关阅读 标题链接如何打包python程序为exebczl【auto-py-to-exe 可视化打包python到exe】51CTO ZATA 1. python源码 打包时需要特别注意的源码编写规范 除了基本的 Python 编码规范之外,在准备程序进行打包时,还需要特别注意以下几点: 1.1 依赖管理 确保 requirements.t…

javaWeb小白项目--学生宿舍管理系统

目录 一、检查并关闭占用端口的进程 二、修改 Tomcat 的端口配置 三、重新启动 Tomcat 一、javaw.exe的作用 二、结束javaw.exe任务的影响 三、如何判断是否可以结束 结尾: 这个错误提示表明在本地启动 Tomcat v9.0 服务器时遇到了问题,原因是所需…

k8s笔记——核心概念

什么是K8s Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。 Kubernetes 最初是由 Google 工程师作为 Borg 项目开发和设计的,后于 2015 年捐赠给 云原生计算基金会(CNCF)。 什么是 Kubernetes 集群…

SkyWalking-安装

SkyWalking-简单介绍 是一个开源的分布式追踪系统,用于检测、诊断和优化分布式系统的功能。 支持 ElasticSearch、H2、MySQL、PostgreSql 等数据库 基于 ElasticSearch 的情况 ElasticSearch(ES) 安装 1、下载并解压 https://www.elastic…

怎么样绑定域名到AWS(亚马逊云)服务器

1,拿着你买的域名去亚马逊申请一个证书。申请证书分两种,一种是去亚马逊后台填域名手动申请 ,另一种是通过API来申请,类似如下代码: 2、证验证书。有两种方式:一种是通过邮件,另一种去到域名提供…

C++常用的新特性-->day06

时间间隔duration duration表示一段时间间隔&#xff0c;用来记录时间长度&#xff0c;可以表示几秒、几分钟、几个小时的时间间隔。duration的原型如下 // 定义于头文件 <chrono> template<class Rep,class Period std::ratio<1> > class duration;Rep&…