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

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!!!!");
	}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

现在怎么做抖店才能赚钱?这四个重要建议,你千万不能忽略!

大家好&#xff0c;我是电商花花。 现在目前看抖音小店前景和红利依然有很大的市场空间&#xff0c;抖音小店平台流量大&#xff0c;商家入驻门槛低&#xff0c;抖店的运营技术也不像其它传统电商平台那么高。 所以&#xff0c;当下抖音小店仍然是流量大&#xff0c;机遇多。…

使用手机短信恢复软件,完成从新手到专家的进阶之路

由于各种原因&#xff0c;如误删、手机设备损坏等&#xff0c;我们可能会面临重要短信丢失的风险。现在市面上有许多手机短信恢复软件可以帮助我们解决这个问题&#xff0c;但从新手到专家的进阶之路并非一蹴而就的过程&#xff0c;它需要耐心、实践和不断地学习。以下是一篇关…

开源集运wms系统

集运WMS系统是一种专为集运业务设计的仓库管理系统&#xff0c;它能够高效地处理来自多个来源的货物&#xff0c;优化存储和发货流程。 经过长时间的开发和测试&#xff0c;推出了我的集运WMS系统。它不仅具备传统WMS系统的所有功能&#xff0c;还针对集运业务的特点进行了特别…

【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析

&#x1f525; 个人主页&#xff1a;空白诗 &#x1f525; 热门专栏&#xff1a;【JavaScript】 文章目录 &#x1f33f; 引言五、 Destructuring Assignment - 解构赋值&#xff0c;数据提取的艺术 &#x1f3a8;&#x1f4cc; 数组解构&#x1f4cc; 对象解构&#x1f4cc; 特…

matlab生成波形然后采样,FPGA写testbench读取数据

一、在matlab产生激励 fs1000; % 这个是路数 M16; % 这个是FFT的点数&#xff0c;64K L65536; % 将N写为两个整数乘积的形式&#xff0c;即N ML&#xff0c;(log2 M和log2 L都为正整数) NM*L; % 这段 MATLAB 代码是用来生成一个时间序列的&#xff0c; % 该时间序列从0开…

一次性把“AI 原生应用技术栈”说明白

AI 当前有多火爆不用介绍了&#xff0c;随着各个厂商的努力&#xff0c;也慢慢浮现了有价值的应用&#xff0c;以及为更好的服务 AI 原始应用准备的各种平台产品。今天这篇简单介绍下当前业界最新的 AI 原生应用技术栈。 特别声明&#xff1a;AI 技术还在快速发展过程中&#…

数据可视化分析工具DataEase

本文软件由网友 雨林 推荐&#xff0c;老苏稍微研究了一下 DataEase 的安装&#xff0c;具体的使用教程&#xff0c;请参考官方的在线文档和教学视频 什么是 DataEase &#xff1f; DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#x…

新品发布(仓库小助手)一机在手,轻松无忧

你是否曾为繁琐的货物管理而烦恼&#xff1f; 你是否为了记录货物信息忙前忙后&#xff1f; 近几年&#xff0c;陆续有收到客户在运营跨境代购中的一些反馈&#xff0c;特别是仓库管理这块&#xff0c;比如包裹的出入库、移库、修改包裹信息等&#xff0c;都需要在电脑上完成&…

HTML新春烟花盛宴

目录 写在前面 烟花盛宴 完整代码 修改文字

轻松掌握图片批量处理,赶紧学习这些小技巧!

在现今数字化的社会中&#xff0c;我们每天都会接触到大量的图片&#xff0c;无论是在工作中还是日常生活中。要想高效处理这些图片&#xff0c;掌握图片批量处理的技巧就显得尤为重要。幸运的是&#xff0c;有许多小技巧和工具可以让这一过程变得轻松愉快。 在本文中&#xf…

解决 Echarts 图 tooltip 层级太高穿透问题

问题场景&#xff1a;Echarts 图 tooltip 是自动轮播的&#xff0c;当点击某个区域出现弹窗时&#xff0c;tooltip和弹窗同时显示&#xff0c;没在遮罩层下面&#xff0c;查看tooltip的层级显示99999&#xff0c;所以这里改一下tooltip的层级。 设置 extraCssText: "z-ind…

白酒:产地的标识对消费者选择的影响与策略

云仓酒庄豪迈白酒作为一款知名品牌&#xff0c;其产地的标识对消费者选择产生着重要的影响。产地的标识是消费者了解和信任产品的重要途径&#xff0c;因此&#xff0c;如何巧妙地运用产地的标识来吸引和留住消费者&#xff0c;是品牌营销的重要策略。 首先&#xff0c;产地的标…

Suno进阶手册 | 创作歌曲玩法全攻略!

Suno进阶手册:创作歌曲玩法全攻略! 前言1. 基础模式2. 高级模式总结前言 前段时间,Suno V3 横空出世,与此前的V2相比,V3生成的作品质量明显提升! 该说不说,对比同类型工具,Suno的体验“遥遥领先”,没有AI生成常有的机械感,歌词押韵,甚至还附带有和声、分段。 虽然…

有免费通配符证书吗?哪里可以申请?

市面上的免费SSL证书大多数为单域名证书&#xff0c;如果您的主域名拥有众多子域名&#xff0c;逐一申请单域名SSL证书不太现实&#xff0c;下面为介绍一款永久免费使用的通配符SSL证书申请流程 1 选择免费通配符证书提供商 免费通配符证书申请点击这里直接获取https://www.…

两年半前端面字节,广度和深度让我不想做前端了

两年半经历&#xff0c;面的是前端工程师&#xff0c;字节面试官的问题挺有广度与深度的&#xff0c;这里整理一下面试过程中的题目&#xff08;有些忘记了&#xff09;&#xff0c;分享给大家: 面试过程中的问题 1、简单的自我介绍与项目经验。 2、一道算法题。 3、一道 …

ClickHouse安装教程:开启你的列式数据库之旅

ClickHouse是一个高性能的列式数据库管理系统&#xff0c;适用于在线分析处理&#xff08;OLAP&#xff09;。以下是ClickHouse的一些基本使用步骤&#xff1a; 下载二进制文件&#xff1a;您可以通过运行以下curl命令在Linux、FreeBSD或macOS上本地下载ClickHouse&#xff1a…

汽车IVI中控开发入门及进阶(二十一):DAB和FM 收音机

前言: 在过去的十年里,数字收音机对车载娱乐产生了重大影响。现在,几乎每辆新车都标配了这项技术,这也是我们60%以上的人收听收音机的方式。甚至有传言称,在不久的将来,将永久关闭调频发射机,使许多车载收音机过时。但一些相对年轻的汽车在工厂里仍然没有安装DAB,而且…

【数值计算方法】雅可比解线性方程

废话少说&#xff0c;直接上干货。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define MaxSize 100 double A[MaxSize][MaxSize]; //系数矩阵 double B[MaxSize]; //系数矩阵 double C[MaxSize][MaxSize]; //去对角线矩阵 double …

LeetCode 377.组合总和Ⅳ

这题是我蠢了&#xff0c;它说是组合数我就信了&#xff0c;言尽于此 class Solution { public:int combinationSum4(vector<int>& nums, int target) {vector<int> dp(2000,0);dp[0]1;for(int i0;i<target;i){for(int j0;j<nums.size();j){if(i>nums…

ABP框架+Mysql(三)

创建,更新和删除图书 创建新书籍 创建 modal form 在 Acme.BookStore.Web 项目的 Pages/Books 目录下新建一个 CreateModal.cshtml Razor页面: CreateModal.cshtml.cs 打开 CreateModal.cshtml.cs 代码文件(CreateModalModel 类),替换成以下代码: using System.Threading.…