3-USART
目录
第2章 UART异步串行通信
2.1 课前准备
2.1.1 学习方向
- 通信描述方式
- 什么是UART
- 为什么使用串口
- 怎么使用串口
- UART相关寄存器
- UART配置
- 实验
什么是串口 怎么配置串口 在什么情况下用串口
实验现象:使用UART和电脑(串口助手)进行通信
2.1.2 参考资料
原理图
芯片手册
《STM32F4xx中文参考手册》--26章节(USART)
2.1.3 常见通信的描述方式
通信协议:标准型(通用)串口 非标准型
通信的目的:一个设备和另一个设备发送数据,
协议:制定的规则,通信双方都要遵循这个规则
- 同步/异步
同步: 在通信过程中,通信双方需要同一时钟频率下(都会连接同一根时钟线)
异步: 在通信过程中,通信双方可以不在同一时钟频率下(不代表设备没有时钟)
例:A和B两个设备
同步:A和B打电话,双方都要接电话才能通信,其中一方挂断或不接就,就无法通信。
异步:A和B发邮箱,A发完之后可以去做其他事情,B有空时来查看或回复A。
如何去判断两个设备进行通信时同步,还是异步(判断是否有时钟线)。
同步需要时钟线,异步可以不需要时钟线,双方设备都有自己的时钟电路,必须在相同传输速率下进行通信,不然可能会造成数据丢失(波特率)。


同步和异步的区别:
(1)同步通信要求时钟频率一致,异步通信不要求时钟频率一致
(2)同步通信效率高,异步通信效率低
(3)同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。
(4)同步通信可用于点对多;在同一时刻下,异步通信只适用于点对点。
- 串行/并行
串行:一帧数据的每个位都在一根数据线上传输,数据高位先发(MSB)还是低位先发(LSB)。
并行: 一帧的数据分为多条数据线发送。数据线的数量根据数据的位数。

串行与并行区别
串行优点:占用硬件资源少,结构简单
串行优点:传输速度慢
并行优点:传输速度快
并行缺点:占用硬件资源多,结构复杂。
- 单工/半双工/全双工
例:设备A和设备B
单工:数据传输方向只能一个方向,A->B
半双工:数据传输方向可以两个方向上传输,在某一个时间点,数据传输只能单向A->B或B->A
全双工:数据传输方向可以两个方向上传输。需要两根数据线,A->B并且B->A

2.1.4 通信速率
UART常用通信速率:9600bps、76800bps、115200bps
波特率:以码元为单位
比特率:以bit为单位
在二进制下,波特率和比特率是一样的,一个码元就是一个二进制位。
通信配置方式:
配置通信控制器(串口偏好控制器)
前提:该芯片有通信控制器
关注:通信控制器寄存器
IO口模拟时序(IO口模仿)
前提:有通信时序图
关注:把时序图转换成程序
通信控制器:芯片上用于通信的片上外设(UART)
协议:串口
UART这个器件可以将数据封装成串口这种协议给发送或接受。
2.2 UART通信介绍
2.2.1 UART概述
UART:通用异步收发器(Universal Asynchronous Receiver/Transmitter)。特点异步通信
USART:通用同步/异步收发器(Universal Synchronous/Asynchronous Receiver/Transmitter)。
USART比UART多了同步的功能,其他功能没有太大区别。
UART/USART他们都是片上外设(器件) ,串口是协议。
2.2.2 UART作用
单片机与单片机相互通信
单片机和模块进行通信(WiFi 指纹模块)
单片机和PC(上位机----串口助手)(转换芯片—CH340)
2.2.3 物理总线
UART有两根数据线:TX(发送数据线)、RX(接收数据线)


USART通信特征: 异步串行全双工(常用)
2.3 串口数据帧格式


起始位+数据位+奇偶校验位(可有可无)+停止位
1.起始位
标志一个数据帧的开始,当没有数据发送时,数据线空闲处于逻辑“1”状态;先发出一个逻辑“0”信号,表示开始传输字符。(低电平有效)
2.数据位
紧随起始位之后,数据位表示真正要发送或接收的信息,位数一般为8位或9位。(常用8位)(低位先发)
3.奇偶校验位
数据位末尾可以选择是否添加奇偶校验位,用于检测数据传输是否正确(可以选择开启或者不开启)。
数据位加上奇偶校验位中1的奇偶性
1101 0101 + 0 开启奇校验 数据位加上校验位中的1的个数为奇数
1101 0101 + 1 开启偶校验 数据位加上校验位中的1的个数为偶数
4.停止位
代表数据帧传输结束的标志位,可以是0.5位,1位,1.5位或2位。停止位的位数越多,数据传输的速率也越慢。(常用1位)
5.波特率
传送速率是指数据传输的速度。用b/s或bps(比特/秒)表示,称为比特率。在二进制的情况下,比特率与波特率数值相等,因而在单片机的串行通讯中,常称为波特率。
假设数据的传输速率为120个字符每秒,每个字符由1个起始位、8个数据位和1个结束位组成。
UART常用通信速率(波特率):9600bps、76800bps、115200bps

配置的时候关注:UART四要素:数据位 奇偶校验位 停止位 波特率
两设备使用串口通信要保证四要素配置相同才能正常通信。
2.4 UART框图分析
说明:
发送数据要保证 上一次发送的数据已经发送完成
如何知道发送完成
寄存器发送完成位(上一次的发送完成,寄存器对应自动变为1)
读寄存器的这位是1,就可以再次发送数据
接收数据就是把数据读取到变量中,要保证数据已完整的接收完成
如何知道接收完成
寄存器接收完成位(接收完成了,寄存器对应位自动变为1)
读寄存器的这位是1,可以把串口控制器的数据读到变量里去
- 程序员只能操作到DR,往DR里面写会自动填到TDR中,从DR里面读会自动从RDR中读

通过该部分框图分析出需要封装两个函数:
//发送一个字节函数
void USART1_SendByte(u8 Byte)
{
//等待发送数据寄存器为空
//把数据发给DR
}
//接受一个字节函数
u8 USART1_RecvByte(void)
{
//等待接受数据寄存器不为空
//从DR中读出数据
//返回变量
}


2.5 CH340电平转换芯片


2.5.1 电平不匹配
为什么单片机和电脑通信需要CH340?——用“语言翻译官”来理解
问题背景:电平不匹配
电脑的USB口:用的是USB电平。
单片机的串口(UART):用的是TTL电平。
直接连接?就像两个人一个说中文,一个说英文,互相听不懂,还可能烧坏电路!
CH340芯片其实干了两件事:
电平转换
把电脑USB的差分信号(D+和D-) ↔ 转换成单片机懂的TTL电平(TX/RX)。
类似把“高压电”变成“安全电压”,防止烧芯片。
协议转换
电脑的USB是复杂协议(需要驱动),而单片机串口是简单的UART(直接发01信号)。
CH340在中间当“翻译官”,把USB协议翻译成串口协议,反过来也一样。
现实类比:手机充电器
电脑USB口 → 家里的220V交流电(不能直接给手机充)。
CH340芯片 → 充电头(把220V转换成5V USB)。
单片机 → 手机(需要5V才能安全充电)。
如果没有CH340:就像直接用220V插手机,结果可能就是爆炸 💥!
2.6 USART的寄存器
2.6.1 状态寄存器SR
位 7 TXE:发送数据寄存器为空:判断什么时候可以发数据
当 TDR 寄存器的内容已传输到移位寄存器时,该位由硬件置 1。如果 USART_CR1 寄存器
中 TXEIE 位 = 1,则会生成中断。通过对 USART_DR 寄存器执行写入操作将该位清零。
0:数据未传输到移位寄存器
1:数据传输到移位寄存器
注意: 单缓冲区发送期间使用该位。
位 6 TC:发送完成 (Transmission complete)
如果已完成对包含数据的帧的发送并且 TXE 置 1,则该位由硬件置 1。如果 USART_CR1 寄存
器中 TCIE = 1,则会生成中断。该位由软件序列清零(读取 USART_SR 寄存器,然后写入
USART_DR 寄存器)。 TC 位也可以通过向该位写入‘0’来清零。建议仅在多缓冲区通信
时使用此清零序列。
0:传送未完成
1:传送已完成
位 5 RXNE:读取数据寄存器不为空 :判断什么时候去读取数据
当 RDR 移 位 寄 存 器 的 内 容 已 传 输 到 USART_DR 寄 存 器 时,该 位 由 硬 件 置 1。如 果
USART_CR1 寄存器中 RXNEIE = 1,则会生成中断。通过对 USART_DR 寄存器执行读入
操作将该位清零。 RXNE 标志也可以通过向该位写入零来清零。建议仅在多缓冲区通信时使
用此清零序列。
0:未接收到数据
1:已准备好读取接收到的数据
2.6.1 数据寄存器DR
位 8:0 DR[8:0]:数据值
包含接收到数据字符或已发送的数据字符,具体取决于所执行的操作是“读取”操作还是
“写入”操作。
因为数据寄存器包含两个寄存器,一个用于发送 (TDR),一个用于接收 (RDR),因此它具有
双重功能(读和写)。
TDR 寄存器在内部总线和输出移位寄存器之间提供了并行接口(参见图 1)。
RDR 寄存器在输入移位寄存器和内部总线之间提供了并行接口。
在使能奇偶校验位的情况下(USART_CR1 寄存器中的 PCE 位被置 1)进行发送时,由于
MSB 的写入值(位 7 或位 8,具体取决于数据长度)会被奇偶校验位所取代,因此该值不
起任何作用。
在使能奇偶校验位的情况下进行接收时,从 MSB 位中读取的值为接收到的奇偶校验位。
2.6.1 控制寄存器CR1
位 10 PCE:奇偶校验控制使能 :控制是否启用奇偶校验
该位选择硬件奇偶校验控制(生成和检测)。使能奇偶校验控制时,计算出的奇偶校验位被
插入到 MSB 位置(如果 M=1,则为第 9 位;如果 M=0,则为第 8 位),并对接收到的数据
检查奇偶校验位。此位由软件置 1 和清零。一旦该位置 1, PCE 在当前字节的后面处于活动
状态(在接收和发送时)。
0:禁止奇偶校验控制
1:使能奇偶校验控制
位 9 PS:奇偶校验选择:选择奇校验还是偶校验
该位用于在使能奇偶校验生成/检测(PCE 位置 1)时选择奇校验或偶校验。该位由软件置 1 和
清零。将在当前字节的后面选择奇偶校验。
0:偶校验
1:奇校验
位 13 UE: USART 使能 :开启USART
该位清零后, USART 预分频器和输出将停止,并会结束当前字节传输以降低功耗。此位由软
件置 1 和清零。
0:禁止 USART 预分频器和输出
1:使能 USART
位 3 TE:发送器使能 :开启发送器
该位使能发送器。该位由软件置 1 和清零。
0:禁止发送器
1:使能发送器
位 2 RE:接收器使能:开启接收器
该位使能接收器。该位由软件置 1 和清零。
0:禁止接收器
1:使能接收器并开始搜索起始位
位 15 OVER8:过采样模式
0: 16 倍过采样
1: 8 倍过采样
位 12 M:字长
该位决定了字长。该位由软件置 1 或清零。
0: 1 起始位, 8 数据位, n 停止位
1: 1 起始位, 9 数据位, n 停止位
位 13:12 STOP:停止位 (STOP bit)
这些位用于编程停止位。
00: 1 个停止位
01: 0.5 个停止位
10: 2 个停止位
11: 1.5 个停止位
2.6.2 波特率寄存器 (USART_BRR)
位 15:4 DIV_Mantissa[11:0]: USARTDIV 的尾数
这 12 个位用于定义 USART 除数 (USARTDIV) 的尾数位 3:0 DIV_Fraction[3:0]: USARTDIV 的小数
这 4 个位用于定义 USART 除数 (USARTDIV) 的小数。当 OVER8 = 1 时,不考虑 DIV_Fraction3位,且必须将该位保持清零。
波特率采用:115200bit/s 16倍过采样
波特率 = Fck/(8*(2-OVER8)*DIV)
DIV=Fck/(8*(2- OVER8)*波特率 Fck=84Mhz OVER8 = 0
DIV= 45.572
DIV整数部分= 0x2D
DIV小数部分=0x9
USART1->BRR = 0x2D9
以上出现各种使能:
UART时钟使能 提供时钟保证能够工作
UART使能 相当于器件总开关
发送器使能 内部小开关(控制发送)
接收器使能 内部小开关(控制接受)
2.7 串口助手介绍

2.8 UART实验
2.8.1 配置UART去和串口助手进行通信

说明:
每个IO口都有自己固定的复用功能,并不是每个IO口都可以复用任何功能
如何知道IO口具体的复用功能------------查表
如何配置复用功能
①确定IO(根据具体的复用功能确定IO)
根据自己需要的复用功能去查看哪个管脚支持这个复用功能(STM32F407ZGT6) ------ 通常通过原理图就可以确定
②确定寄存器和寄存器的位
配置复用功能寄存器AFR[0](4~7)(参考手册) AFR[0](0~7) ------
③确定标识
查表(数据手册3.9) ------
④确定数值
去查看具体寄存器下面的说明(中文参考手册)
编程思路:
//初始化
void USART1_Init(void)
{
/*配置IO口*/
//IO口时钟使能
//配置复用模式
//不开上下拉
//复用推挽
//输出速度
//复用USART
//配置USART1
//USART1的时钟使能
//配置波特率(BRR)
//CR1
//CR2
//USART使能
}
//发送一个字节函数
void USART1_SendByte(u8 Byte)
{
//等待发送数据寄存器为空
//把数据发给DR
}
//接受一个字节函数
u8 USART1_RecvByte(void)
{
//等待接受数据寄存器不为空
//从DR中读出数据
//返回变量
}
2.9 Printf的使用

浙公网安备 33010602011771号