玩转STM32-通用同步/异步收发器USART(详细-慢工出细活)

news2024/12/23 7:18:51
CPU与外围设备之间的信息交换或计算机与计算机之间的信息交换称为通信。基
本的通信方式有两种,即并行通信和串行通信。

文章目录

  • 一、串行通信基础
    • 1.1 串行通信的方式
    • 1.2 串行通信的数据传输形式
    • 1.3 波特率
  • 二、STM32的USART的结构特征(了解)
  • 三、工作方式(掌握)
  • 四、应用案例

一、串行通信基础

串行通信是数据字节的各位一位一位地依次传送的通信方式。串行通信的速度慢,但占用的传输线条数少,适用于远距离的数据传输。
并行通信数据字节的各位同时传送的通信方式。并行通信的有点是数据传送速度快,缺点是占用的传输线条数多,适用于近距离通信。在通信距离比较远的情况下成本比较高。
简单来说,串行就是数据都是在一根线上传输的,需要一个一个的进行传输,就像过独木桥一样。而并行就是多条线,数据可以同时的在多条线上进行传输。比较好理解。

1.1 串行通信的方式

从硬件上看,串行通信方式有单工通信、半双工通信和全双工通信。
(1)单工通信。数据只允许向一个方向进行传送,即数据发送设备只能发送数据,而数据接收设备只能接收数据。此时在数据发送设备与数据接收设备之间只需要一条数据传输线。
(2)半双工通信。数据允许向两个方向进行传送,但是传送数据的过程与接收数据的过程不能同时进行。即进行通信的两个设备都具有传送与接收的能力,但是在同一时刻只能一个设备进行数据传送而另一个设备进行数据接收。
(3)全双工通信。数据允许向两个方向进行传送,并且传送数据的过程与接收数据的过程可以同时进行。即进行通信的两个设备都具备传送与接收数据的能力,而且在同一时刻两个设备均可以发送与接收数据。
在这里插入图片描述

1.2 串行通信的数据传输形式

在串行通信中,接收端接收到一连串的数据流后,应正确地识别各个数据起始和结束位置,即保证接收端与发送端数据的同步,否则就无法保证数据的正确接收。为此需要制定一些共同遵守的约定,其中最重要的是字长设置,USART字长设置如下:
来自STM32F103数据手册
字节可以通过编程USART_CR1寄存器中的M位,选择成8位或9位。在起始位期间,TX引脚处于低电平,在停止位期间处于高电平。空闲帧为全1的完整数据帧,后面跟着包含了数据的一下帧的开始位。断开帧为全0的完整数据帧。在断开帧结束时,发送器再插入1或2个停止位来应答起始位。发送和接收由一共用的波特率发生器驱动,发送器和接收器的使能位分别置1时,产生时钟。

1.3 波特率

波特率即数据的传送速率。在串行通信中,每秒钟传送的二进制数的位数称为波特率,单位时比特/秒,或波特。波特率的倒数就是每一位数的传送时间,称为位传送时间,单位为秒。USART根据波特率发生器提供宽范围的波特率进行选择。

二、STM32的USART的结构特征(了解)

STM32有3~5个的全双工异步串行通信USART接口,可实现设备之间的串行数据传输。
STM32的USART外部引脚包括接收数据输入(RX)、发送数据输出(TX)、清除发送(nCTS)、发送请求(xRTS)和发送器时钟输出(CK),通过这些引脚可以与其他外部设备通信。
内部包括发送数据寄存器(TDR)、接收数据寄存器(RDR)、移位寄存器、IrDA串行红外编解码模块、硬件数据流控制器、时钟控制、发送控制、唤醒单元、接收控制、中断控制和波特率控制等。下图为USART结构图,来自STM32F103数据手册,了解即刻。
在这里插入图片描述
任何USART双向通信至少需要2个脚:RX和TX。当发送器被激活,并且不发送数据时,TX引脚处于高电平。在IrDA模式下,TX作为IRDA_OUT,RX作为IRDA_IN。nCTS和nRTS作用于调制解调。CK为发送器时钟输出,此引脚用于同步传输的时钟,阴部模式不用。

三、工作方式(掌握)

  1. 数据发送
    发送器根据M位的状态发送8位或9位的数据。当发送使能位(TE)被置位时,发送移位寄存器中的数据在TX引脚上输出,相应的时钟脉冲在CK因脚伤输出。在USART发送期间,字符发送在TX引脚上首先移出数据的最低有效位。
  2. 数据接收
    在USART接收期间,数据的最低有效位首先从RX引脚进。当一个字符被接收时,RXNE位被置位。它表明移位寄存器的内容被转移到RDR,也就是说,数据已经被接收并且可以被读出。如果RXNEIE位被设置,则产生中断。在接收期间如果检测到帧错误、噪声或溢出错误,错误标志将被置起。
  3. 分数波特率的产生
    接收器和发送器的波特率在USARTDIV的整数和小数寄存器中的值应设置成相同的。其公式如下:
    波特率 = f c k / 16 × U S A R T D I V . 波特率 = fck/16×USARTDIV. 波特率=fck/16×USARTDIV.
    fck 为外设的时钟;USARTDIV是一个无符号的定位数,这12位的值在USART_BRR寄存器中设置。

四、应用案例

  1. 案例介绍
    使用usart1实现与PC端上位机之间的串口通信功能,在上位机中输出相关数据。
  2. Usart.c文件——串口初始化
void UsartDriver_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStureture;
	USART_InitTypeDef USART_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	// PA9  TX
	GPIO_InitStureture.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStureture.GPIO_Pin = USART_GPIO_TX_PIN;
	GPIO_InitStureture.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(USART_GPIO_PORT,&GPIO_InitStureture);
	
	// PA10 rx
	GPIO_InitStureture.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStureture.GPIO_Pin = USART_GPIO_RX_PIN;
	GPIO_Init(USART_GPIO_PORT,&GPIO_InitStureture);
	
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART_PORT,&USART_InitStructure);
	USART_Cmd(USART_PORT,ENABLE);
}

/*串口1连续发送函数*/
void BdUsart1Trans(float *p, int16_t len)
{
	uint16_t i;
  for(i = 0;i < len; i++)
  {
   USART_SendData(USART1 , p[i]);
   while(USART_GetFlagStatus(USART1 , USART_FLAG_TC) == RESET) {}; // FLAG=0,未发完,等待
  }
}

/*串口1连续接收函数*/
void BdUsart1Recv(char *p, int16_t len)
{
	uint16_t i;
  for(i = 0;i < len; i++)
  {
    if(USART_GetFlagStatus(USART1 , USART_FLAG_RXNE) == SET)
		{
			p[i] = USART_ReceiveData(USART1);
		}; // FLAG=1, 收到数据
	}
}
  1. 如果使用printf和scanf实现串口数据的收发,需要对其进行重映射。
//从串口打印printf函数 ,注意:需要在编译器中的编译选项中Micorlib上面打勾
int fputc(int ch, FILE *f)
{
	USART_SendData(USART1, (uint16_t) ch);

	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
	{}

	return ch;
}


//从串口1中使用scanff输入函数
int fgetc(FILE *f)
{
	while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){}

	return (int)USART_ReceiveData(USART1);
}
  1. main.c 文件——主程序文件
void main()
{
	UsartDriver_Init();
	LedDriver_Init();
	
	while(1)
	{
		printf("Welcome!!!!");
	}
}

在这里插入图片描述

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

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

相关文章

采集EthernetIP IO从站设备数据 转 profinet IO协议项目案例

1 文档说明 设置网关采集EthernetIP IO设备数据把采集的数据转成profinet IO协议转发给其他系统。 2 准备工作 仰科网关。支持采集EthernetIP IO数据&#xff0c;profinet IO协议转发。电脑。IP设置成192.168.1.198&#xff0c;和网关在同一个网段。网线、12V电源。 3 网关…

MySQL8报错Public Key Retrieval is not allowedz 怎么解决?

问题描述 当我们使用数据库管理工具连接mysql8的时候&#xff0c;可能遇到报错&#xff1a; Public Key Retrieval is not allowed 解决办法 1、在连接属性中配置allowPublicKeyRetrieval设置为true 2、在连接URL中加上配置allowPublicKeyRetrieval为true

《软件方法(下)》8.3.4.6 DDD话语“聚合”中的伪创新(1)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.4 识别关联关系 8.3.4.6 DDD话语“聚合”中的伪创新 DDD话语中也有“聚合”。Eric Evans的“Domain-Driven Design: Tackling Complexity in the…

「光储充放」一体充电站-一文读懂光储充放充电站

“光储充放”一体充电站作为一种储能充电的新形式渐渐走进人们的生活&#xff0c;全国很多地区都开始陆续投放运营“光储充放”一体充电站&#xff0c;今天的这篇文章&#xff0c;就带大家全面了解“光储充放”这一新型充电站。 头图来源 | 视觉中国 01 政策背景 早在2020年…

43-2 Linux入侵排查实验

环境准备: 老规则,我没有靶场就自己搭建了类似, 这里准备一台CentOS 7虚拟机作为受害者,然后使用CS制作木马并在受害者主机上线,具体过程可以看我之前写的一篇文章: 黑客必备利器:如何在系统上安装和使用 CobaltStrike(简称:CS)_cobalt strike-CSDN博客 最终的效果…

【ARFoundation自学03】AR Point Cloud 点云(参考点标记)功能详解

和平面识别框架一样 1为XR Origin添加AR Point Cloud Manager组件 然后你的ar应用就具备了点云识别功能&#xff0c;就这么简单 2.可视化这些云点 创建一个美术效果的预制体&#xff0c;人家提供了预设模板 然后拖到仓库&#xff08;ASSETS&#xff09;创建预制体&#xff…

红酒与不同烹饪方法的食物搭配原则

红酒与食物的搭配是一门艺术&#xff0c;而不同烹饪方法的食物与红酒的搭配也有其与众不同之处。红酒与食物的搭配不仅涉及到口感、风味和营养&#xff0c;还与烹饪方法和食物质地等因素息息相关。云仓酒庄雷盛红酒以其卓着的品质和丰富的口感&#xff0c;成为了实现完善搭配的…

常用压力、流量单位换算表

一、压力为单位面积所承受的力 压力&#xff1a;绝对压力 、表压力 、大气压力。相互关系&#xff1a;绝对压力表压力大气压力 绝对压力:当压力表示与完全真空的差。测量处的实际压力。 表压力:当表示其气体数值与该地域大气压力的差值。 大气压力&#xff1a;由大气重量所…

JAVA学习·String类的常用方法

String 类及其创建 String 类的创建 String 类是 Java 内置的一个类&#xff0c;其完全限定类名是java.lang.String。想要创建一个字符串有多重方式&#xff0c;比如创建字符串"Hello"&#xff1a; String s1 "Hello"; // 字面量创建 String s2 new St…

IDEA升级web项目为maven项目乱码

今天将一个java web项目改造为maven项目。 首先&#xff0c;创建一个新的maven项目&#xff0c;将文件拷贝到新项目中。 其次&#xff0c;将旧项目的jar包&#xff0c;在maven的pom.xml做成依赖 接着&#xff0c;把没有maven坐标的jar包在编译的时候也包含进来 <build>…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月29日,星期三

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年5月29日 星期三 农历四月廿二 1、 首个未成年人游戏退费标准发布&#xff1a;监护人与网游服务提供者将按错担责。 2、 六部门联合印发通知&#xff1a;鼓励加快高清超高清电视机等普及、更新。 3、 神舟十八号航天员乘…

Rocksdb原理简介

100编程书屋_孔夫子旧书网 Rocksdb作为当下nosql中性能的代表被各个存储组件&#xff08;mysql、tikv、pmdk、bluestore&#xff09;作为存储引擎底座&#xff0c;其基于LSM tree的核心存储结构&#xff08;将随机写通过数据结构转化为顺序写&#xff09;来提供高性能的写吞吐时…

上海亚商投顾:沪指冲高回落 电力、电网产业链持续爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指、创业板指均跌超1%。电力、电网股再度爆发&#xff0c;众智科技、郴电国…

Post Microsoft Build and AI Day 上海开发者日

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 这个六一怎么过&#xff1f;来微软 Reactor&#xff0c;一起过儿童节吧&#xff01; 6月1日&#xff0c;Microsoft Azure & Microsoft Reactor 面向大小朋友特别推出六一特辑&#xff0c;「Post Mic…

Django配置

后端开发&#xff1a; python 解释器、 pycharm 社区版、 navicate 、 mysql(phpstudy) 前段开发&#xff1a; vs code 、 google 浏览器 django 项目配置 配置项目启动方式 创建模型 创建一个应用 在应用中创建模型类 根据模型类生成数据表 创建应用 创建模型类 …

Ps:使用消失点滤镜进行透视贴图

可以在“消失点”滤镜中粘贴 Photoshoop 剪贴板中的图像。 拷贝的贴图可以来自于同一文档或不同文档&#xff0c;但不能是矢量图形。 比如&#xff0c;如果要将文字图层作为贴图&#xff0c;必须先将其栅格化。 一旦粘贴到“消失点”滤镜中&#xff0c;贴图将变为浮动选区&…

量子密钥分发系统基础器件(一):光纤干涉仪

干涉仪的基本原理是利用波的叠加来获得波的相位信息&#xff0c;从而获取实验中所关心的物理量。光纤干涉仪是由光学干涉仪发展而来的&#xff0c;利用光纤实现光的干涉&#xff0c;由于光纤取代透镜系统构成的光路具有柔软、形状可随意变化、传输距离远等特点&#xff0c;当前…

04--SpringBoot热部署与日志

1、热部署 1.1 引言 为了进一步提高开发效率&#xff0c;SpringBoot为我们提供了全部项目热部署&#xff0c;日后在开发过程中修改了部分代码或者相关配置文件之后&#xff0c;不需要再重启服务使其生效。在项目中开启了全局热部署之后&#xff0c;只需要在修改之后等待几秒钟…

数据库(9)——DQL基础查询

数据查询 数据查询是SQL中最复杂的&#xff0c;语法结构为 SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后字段列表 ORDER BY 排序字段列表 LIMIT 分页参数 查询多个字段 SELECT 字段1&#xff0c;字段2...FROM…

sysbench安装(在线离线)

简介 sysbench是一个多线程基准测试工具&#xff0c;它支持硬件&#xff08;CPU、内存、I/O&#xff09;、数据库基准压测等2种测试手段&#xff0c;用于评估系统的基本性能。本篇文章主要介绍sysbench在线和离线2种安装方法&#xff0c;并将离线编译时发生的异常记录到FAQ&…