STM32 USART入门指南

对于刚开始涉足STM32微控制器编程的初学者来说,掌握其通用同步/异步接收/发送器(USART)功能是一项基本且必要的技能。USART在嵌入式系统中广泛用于串行通信。本指南旨在简明扼要地介绍USART的基础概念和基本步骤,并提供一个简单的示例来帮助初学者快速入门。

USART简介

USART是一种串行通讯接口,它支持同步和异步通信。在STM32微控制器中,USART是一个非常灵活的功能模块,可以在多种通信标准下工作,如RS232、RS485、LIN和IrDA。

串口通信过程简介

想象一下,有两个设备要通过串口线进行通信。我们称它们为设备A(发送方)和设备B(接收方)。
设备准备:开始时,设备A和设备B都设置了相同的波特率。这就像是它们同意按相同的节奏跳舞,确保彼此步调一致。
开始传输:设备A想要发送一个字符,比如字母“A”。在ASCII码中,“A”对应的二进制是01000001。
打包数据:设备A将这个字符打包成一系列的信号。首先,它添加一个起始位(通常是一个0),然后是字母“A”的二进制表示,然后可能还有一个校验位,最后是停止位(通常是一个1)。
这个打包好的数据包看起来可能是这样的:
0   01000001 [校验位] 1
逐位发送:设备A通过串口线开始发信号,每次发送一位。按照先前设置的波特率,它准确地控制发送每个位的时间间隔。
信号传输:信号顺着串口线一路传到设备B。设备B按照相同的波特率接收这些信号。
接收数据:设备B首先检测到起始位,然后逐个接收数据位,并在最后读取停止位。如果启用了校验,它还会检查数据是否完好。
完成传输:一旦设备B读取了完整的信号,并且确认无误,它就知道它成功接收了一个字符。然后它就准备好接收下一个字符了。
在此过程中,如果波特率设置错误,或数据中有干扰导致错误,设备B可能会得到错误的字符。这就是波特率和准确的通信设置为何极其重要的原因。


配置USART

配置STM32上的USART(通用同步/异步接收/发送器)功能需遵循以下步骤:
时钟配置:
首先,需要为相关的USART和GPIO时钟使能。通过RCC(Reset and Clock Control)可以配置这些时钟。例如,如果使用的是USART1,通常需要使能它的时钟以及连接到它的GPIO端口时钟。


GPIO配置:
接下来配置GPIO,将涉及到的针脚设置为USART TX(发送)和RX(接收)功能。在STM32中,大多数GPIO针脚可被配置为多种模式,包含USART复用功能。


USART配置:
设置USART的基本通信参数,包括:
        波特率(Baud rate):例如9600、115200等。
        字长(Word length):数据位长度,如8位、9位。
        停止位(Stop bits):常见有1位停止位或2位停止位。
        校验位(Parity):可选无校验、奇校验或偶校验。
        流控(Flow control):可选无、硬件(RTS/CTS)或软件(XON/XOFF)流控。
这些参数可以通过USART_Init函数设置在STM32标准固件库或HAL库中。


中断配置(可选):
如果计划使用中断来管理USART通信,需要配置USART中断并在NVIC中使能它们。这涉及到编写ISR(Interrupt Service Routine中断服务程序)以及在NVIC中设置优先级和使能中断。


使能USART:
最后,初始化过程中,在配置完所有必要的参数后,使能USART模块。


数据发送和接收

发送数据:要发送数据,可以将数据写入USART的数据寄存器,然后等待发送缓冲区(USART_FLAG_TXE)为空,即可发送下一个数据。
接收数据:接收数据时,要检查接收数据寄存器(USART_FLAG_RXNE )非空标志位,当接收到数据时,从数据寄存器读取数据即可。

// 如果收到数据if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET){// 从USART1读取数据并回显char data = USART_ReceiveData(USART1);USART_SendData(USART1, data);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);}

USART_FLAG_RXNE(接收缓冲区非空标志)和USART_FLAG_TXE(发送缓冲区空标志)是USART通信中两个很重要的状态标志,它们存在于USART的状态寄存器中,用于指示USART某些事件的状态。


USART_FLAG_RXNE (Read data register not empty):

当接收到数据,接收数据寄存器非空时,该标志位被置1。
这意味着至少有一个数据可以被读取。
在轮询模式下可以检查这个标志位,如果置位,则可以通过USART_ReceiveData()函数读取数据。
如果启用了接收中断(通过USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)),当USART_FLAG_RXNE置位时将触发中断。


USART_FLAG_TXE (Transmit data register empty):

发送数据寄存器为空时,该标志位被置1。
这表示可以将新数据写入发送数据寄存器。
在发送数据时,可以检查这个标志位,确保发送数据寄存器为空,然后通过USART_SendData()函数发送下一个数据。
如果启用了发送中断(通过USART_ITConfig(USART1, USART_IT_TXE, ENABLE)),当USART_FLAG_TXE置位时将触发中断。
在实际应用中,这两个标志位常常用于轮询方式或中断方式的数据发送和接收,以保证USART通信的正确性和效率。 

实际操作示例

#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
void USART1_Init(void);
int main(void)
{// 系统时钟初始化SystemInit();// 初始化USART1USART1_Init();// 主循环while(1){// 如果收到数据if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET){// 从USART1读取数据并回显char data = USART_ReceiveData(USART1);USART_SendData(USART1, data);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);}}
}
void USART1_Init(void)
{// 各种外设时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// GPIOA 9和10为TX和RX初始化GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; // PA9作为USART1的TXGPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; // PA10作为USART1的RXGPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入GPIO_Init(GPIOA, &GPIO_InitStruct);// USART1初始化设置USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate = 9600;USART_InitStruct.USART_WordLength = USART_WordLength_8b;USART_InitStruct.USART_StopBits = USART_StopBits_1;USART_InitStruct.USART_Parity = USART_Parity_No;USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStruct);// 使能USART1USART_Cmd(USART1, ENABLE);
}

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

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

相关文章

扯淡的DevOps,我们开发根本不想做运维!

引言 最初考虑引用“ DevOps 已死,平台工程才是未来”作为标题,但这样的表达可能太过于绝对。最终,决定用了“扯淡的”这个词来描述 DevOps,但这并不是一种文明的表达方式。 文章旨在重新审视 DevOps 和平台工程,将分别…

【c语言】人生重开模拟器

前言: 人生重开模拟器是前段时间非常火的一个小游戏,接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏: 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 (1) 游戏开始的时…

php捕获Fatal error错误与异常处理

在php5的版本中&#xff0c;如果出现致命错误是无法被 try {} catch 捕获的&#xff0c;如下所示&#xff1a; <?phperror_reporting(E_ALL); ini_set(display_errors, on);try {hello(); } catch (\Exception $e) {echo $e->getMessage(); } 运行脚本&#xff0c;最终…

GO语言的变量与常量

1.变量 go是一个静态语言 变量必须先定义后使用变量必须要有类型 定义变量的方式&#xff1a; var 名称 类型 var 名称 值 名称 :值 例如&#xff1a; var num int 这样就存了一个num类型为int的变量 var num 1 上面使用简化的定义通过num自动判断后面的类型为int并…

什么台灯最好学生晚上用的?五大高口碑学生护眼台灯推荐

对于学生来说&#xff0c;晚上学习早已是家常便饭&#xff0c;其中如果光线不合适&#xff0c;很容易就会造成近视的情况。面对这样的商机&#xff0c;很多厂家纷纷涉足护眼台灯行业&#xff0c;无论技术成熟与否&#xff0c;都大打护眼卖点&#xff0c;其中难免含有大量水分。…

SpringMVC的执行流程

过去的开发中,视图阶段&#xff08;老旧JSP等&#xff09; 1.首先用户发送请求到前端控制器DispatcherServlet(这是一个调度中心) 2.前端控制器DispatcherServlet收到请求后调用处理器映射器HandlerMapping 3.处理器映射器HandlerMapping找到具体的处理器,可查找xml配置或注…

milvus insert api的数据结构源码分析

insert api的数据结构 一个完整的insert例子: import numpy as np from pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )num_entities, dim 10, 3print("start connecting to Milvus") connections.connect("default&q…

网络原理 - HTTP/HTTPS(2)

HTTP请求 认识URL URL基本格式 平时我们俗称的"网址"其实就是说的URL(Uniform Resource Locator统一资源定位符). (还有一个唯一资源标识符,称为uri,严格来说,uri范围比url广). 互联网上的每一个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该…

HTB-Analytics

靶机的IP地址为10.10.11.233&#xff0c;攻击机的IP地址为10.10.16.30 信息收集 # nmap -sT --min-rate 10000 -p- 10.10.11.233 -oN port.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-19 14:50 CST Warning: 10.10.11.233 giving up on port because retransm…

十字星K线(Doji)含义,fpmarkets澳福一分钟讲解

许多新手交易者遇到过这种奇怪的烛台&#xff0c;看起来就像一个十字架&#xff0c;没有主体上下有长长的影子&#xff0c;fpmarkets澳福肯定的告诉各位投资者&#xff0c;这种就是十字星K线(用Doji表示)&#xff0c;开盘价与收盘价一致&#xff0c;价格运动已经停止时出现在烛…

突发!某地区网络故障,格行随身WiFi成“救星”?现场直击!

近日&#xff0c;某地区突发网络故障&#xff0c;导致大量用户无法上网。然而&#xff0c;在这场网络危机中&#xff0c;一款名为“格行随身WiFi”的设备却意外走红&#xff0c;成为了当地的“网络救星”。究竟发生了什么&#xff1f;让我们一起来现场直击&#xff01; 据了解&…

Leetcode刷题笔记题解(C++):120. 三角形最小路径和

思路&#xff1a;动态规划&#xff0c;去生成一个对应的当前节点的最小路径值&#xff0c;对应的关系如下所示 dp[0][0] triangle[0][0] dp[i][0] triangle[i][0]dp[i-1][0] dp[i][i] triangle[i][i]dp[i-1][i] dp[i][j] triangle[i][j]min(dp[i-1][j-1],dp[i-1][j]) …

语义相关性评估指标:召回率、准确率、Roc曲线、AUC;Spearman相关系数、NDCG、mAP。代码及计算示例。

常规的语义相关性评价可以从检索、排序两个方面进行。这里只贴代码。详细可见知乎https://zhuanlan.zhihu.com/p/682853171 检索 精确率 def pre(true_labels[],pre_labels[]):""":param true_labels: 正样本索引:param pre_labels: 召回样本索引:return: 精…

首都博物京韵展,监测系统实现文物科技保护

​ 一、首都博物馆讲述京韵古都故事 2024年2月18日&#xff0c;首都博物馆重新亮相的“华夏文明的有力见证——北京通史展”震撼登场。展览面积4900平方米&#xff0c;汇聚1100多件&#xff08;套&#xff09;历史文物&#xff0c;不仅包含了传统历史瑰宝&#xff0c;还增加了…

npm 安装依赖总是超时的解决办法

首先&#xff0c;尝试切换依赖镜像地址 比如切换到淘宝镜像 npm config set registry https://registry.npm.taobao.org // 或者 yarn config set registry https://registry.npm.taobao.org建议使用镜像管理工具 nrm (node registry manager) 其次是否是网络问题 如果无…

Obsidian Win+Android Onedrive/Git 同步

OneDrive Android 手机安装OneDrive&#xff1a; https://www.androidout-cn.com/item/android-apps/147211/com-microsoft-skydrive/ 我是现在手机上创建的仓库&#xff0c;命名为BaseA 此仓库安装Remotely Save插件&#xff0c;远程服务选择为OneDrive&#xff0c;然后授…

【Java万花筒】事件溯源:探索完整状态历史记录的奇妙之旅

构建可追溯、可恢复的应用程序&#xff1a;走进事件溯源的世界 前言 在软件开发过程中&#xff0c;我们常常需要跟踪应用程序的状态变化、审计追踪和快速回滚功能。传统的数据库存储方式无法满足这些需求&#xff0c;因此事件溯源成为了一种强大的设计模式。通过将应用程序的…

【算法】基础算法002之滑动窗口(二)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 5.水果成篮&#xff…

【Java EE初阶十八】网络原理(三)

3. 网络层 网络层要做的事情主要是两方面&#xff1a; 1)、地址管理&#xff1a;制定一系列的规则,通过地址,描述出网络上一个设备的位置&#xff1b; 2)、路由选择&#xff1a;网络环境是比较复杂的&#xff0c;从一个节点到另一个节点之间&#xff0c;存在很…

达梦数据库——数据迁移sqlserver-dm报错问题_未完待续

记录SQL server到达梦数据迁移过程中遇到的问题&#xff0c;持续更新中... 报错情况一&#xff1a;Sql server迁移达梦连接报错’驱动程序无法通过使用安全套接字Q层(SSL)加密与SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted b…