玩转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  TXGPIO_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 rxGPIO_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.mzph.cn/pingmian/18300.shtml

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

相关文章

每天五分钟深度学习:如何使用计算图来反向计算参数的导数?

本文重点 在上一个课程中&#xff0c;我们使用一个例子来计算函数J&#xff0c;也就相当于前向传播的过程&#xff0c;本节课程我们将学习如何使用计算图计算函数J的导数。相当于反向传播的过程。 计算J对v的导数&#xff0c;dJ/dv3 计算J对a的导数&#xff0c;dJ/da&#xf…

【Mybatis】映射文件中获取参数的符号#{}和${}的区别

在xml映射文件中获取参数的符号都是用的#{}的方式&#xff0c;其实Mybatis还支持另一种符号来接收传递过来的参数值&#xff0c;就是${}&#xff0c;他们是区别就在与底层使用jdbc的statement不一样 #{}对应的是PreparedStatementd对象来执行sql语句 ${}对应的是Statement对象…

AGV行业怎么办?投标价格没有最低,只有更低~

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 随着移动机器人&#xff08;AGV/AMR&#xff09;行业的快速发展&#xff0c;市场逐渐从初期的高速增长转向成熟阶段。 2024年&#xff0c;AGV企业…

数据库自动化管理的六大等级

什么是数据库自动化管理&#xff1f; 数据库自动化管理是指通过使用工具和流程&#xff0c;在尽量减少人为干预的情况下&#xff0c;管理和执行与数据库相关的任务。主要目的当然是提高效率&#xff0c;减少人为错误&#xff0c;确保一致性&#xff0c;并解放 DBA 和开发者&am…

【Mybatis】映射文件中#{}里的其他属性

#{}里除了可以写接收参数的名称外&#xff0c;还可以设置javaType&#xff0c;jdbcType&#xff0c;mode&#xff0c;numericScale,resultMap,typeHandler,jdbcTypeName这些属性的。 其他的属性除mode&#xff08;存储过程相关讲到存储过程的时候在讲&#xff09;外使用方式都…

5-时间、日期与组合框

时间、日期与组合框 1 日期时间1.1 日期时间相关的类1.2 日期、时间和字符串的转换1.3 例子 2、组合框2.1 QComboBox2.2 QPlainTextEdit2.3 案例 3、自定义右键菜单 1 日期时间 1.1 日期时间相关的类 QTime 时间数据类型&#xff0c;仅表示时间&#xff0c;如&#xff1a;15:…

【数据结构与算法 经典例题】返回单链表的倒数第 k 个节点

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;数据结构与算法刷题系列&#xff08;C语言&#xff09; 期待您的关注 目录 一、问题描述 二、解题思路 方法一:计数器方式 方法…

Aleth-NeRF: Illumination Adaptive NeRF with Concealing Field Assumption

Abstract Aleth-NeRF: 带有隐蔽场假设的照明自适应 NeRF 照明照明标准的神经辐射场(NeRF)范例采用了一种以观察者为中心的方法,将光照和材料反射的各个方面仅仅从3D 点发射纠缠在一起。这种简化的渲染方法在准确建模在不利光照条件下捕获的图像方面提出了挑战,如弱光或过度曝…

npm install node-sass 安装失败的解决方案:利用国内镜像加速安装

在开发前端项目时&#xff0c;使用Sass作为CSS预处理器是很多开发者的选择。然而&#xff0c;在通过npm安装其Node.js绑定库node-sass时&#xff0c;一些开发者可能会遇到安装失败的问题&#xff0c;尤其是网络原因导致的下载缓慢或中断。本文将指导你如何通过更换为国内镜像源…

The 2022 ICPC Asia Nanjing Regional Contest - External G

题目链接:Problem - D - Codeforces 写在前面&#xff1a;今天的训练赛打的稀碎&#xff0c;一道稍微难一点的签到题就把我难住了&#xff0c;看完题解确实感觉不难&#xff0c;看来题目还是刷太少了。 回归正题 题意&#xff1a; 思路&#xff1a;尽量让分子大&#xff0c;分…

【NumPy】深入了解NumPy的multiply函数:高效矩阵和数组乘法指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

HNU-人工智能-作业3

人工智能-作业3 计科210X 甘晴void 202108010XXX 1.贝叶斯网络 根据图所给出的贝叶斯网络&#xff0c;其中&#xff1a;P(A)0.5&#xff0c;P(B|A)1&#xff0c; P(B|A)0.5&#xff0c; P(C|A)1&#xff0c; P(C|A)0.5&#xff0c;P(D|BC)1&#xff0c;P(D|B, C)0.5&#xff…

循环buffer“一写多读“

1.往期回顾 一个简单实用的循环buffer&#xff0c;用于缓冲数据&#xff01;测试500M数据&#xff0c;耗时1.3秒。 C语言版本的循环buffer比C版本的速度更快&#xff01;测试500M数据0.5秒&#xff0c;达9.25Gbps左右&#xff01; C 语言免拷贝版本循环 buffer 比拷贝版本快了…

Golang并发编程-协程goroutine的信道(channel)

文章目录 前言一、信道的定义与使用信道的声明信道的使用二、信道的容量与长度三、缓冲信道与无缓冲信道缓冲信道无缓冲信道四、信道的初体验信道关闭的广播机制总结前言 Goroutine的开发,当遇到生产者消费者场景的时候,离不开 channel(信道)的使用。 信道,就是一个管道,…

Redis介绍及安装配置

1 什么是Redis Redis 的定义&#xff1a;Redis&#xff08;Remote Dictionary Server 远程字典服务&#xff09;是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 可见Redis和我们最经常使用的MySQL都…

技术创新加速生态繁荣 | 软通动力子公司鸿湖万联亮相OpenHarmony开发者大会2024

5月25日&#xff0c;由开放原子开源基金会OpenHarmony项目群工作委员会主办的OpenHarmony开发者大会2024在深圳成功举行。本次大会紧扣OpenHarmony 4.1 Release版本发布契机&#xff0c;以“鸿心聚力&#xff0c;智引未来”为主题、通过“1场主论坛6场技术分论坛”承载&#xf…

mysql 8 [HY000][1114] The table ‘/tmp/#sql4c3_3e5a0_2‘ is full

分组有个比较大的表&#xff0c;出现了临时表空间满了的情况&#xff1b; 试用该sql 语句&#xff1a; SHOW GLOBAL VARIABLES LIKE internal_tmp_mem_storage_engine; 可以看到 默认临时结果是用临时表存的&#xff0c;在mysql的my.cnt可以改临时空间的大小 但是磁盘哪有内…

5.28学习总结

java复习总结 hashcode()和equals() hashcode():在Object里这个方法是通过返回地址的整数值来生成哈希值。 equals():在Object里这个方法是通过比较他们的内存地址来确定两个对象是否相同。 运行效率&#xff1a;hashcode的时间复杂度为O(1)&#xff08;因为只要计算一次哈…

Vue 菜单组件开发教程

在 Vue 项目中&#xff0c;我们常常需要构建各种菜单结构。下面就来详细介绍如何基于给定的代码来开发一个菜单组件。 组件部分 一、模板部分 <template> <template v-for"item in menuTree" :key"item._id"> <el-sub-menu v-if"i…

EtherCAT协议概述

EtherCAT 是由德国 BECKOFF 自动化公司于2003年提出的实时工业以太网技术。它具有高速和高数据有效率的特点&#xff0c;支持多种设备连接拓扑结构。其从站节点使用专用的控制芯片&#xff0c;主站使用标准的以太网控制器。 EtherCAT 的主要特点如下 : ①泛的适用性&#xff0c…