3-USART

目录

第2章 UART异步串行通信... 2

2.1 课前准备... 2

2.1.1 学习方向... 2

2.1.2 参考资料... 2

2.1.3 常见通信的描述方式... 2

2.1.4 通信速率... 3

2.2 UART通信介绍... 3

2.2.1 UART概述... 3

2.2.2 UART作用... 3

2.2.3 物理总线... 3

2.3 串口数据帧格式... 4

2.4 UART框图分析... 5

2.5 CH340电平转换芯片... 5

2.5.1 电平不匹配... 5

2.6 USART的寄存器... 6

2.6.1 状态寄存器SR.. 6

2.6.1 数据寄存器DR.. 6

2.6.1 控制寄存器CR1. 7

2.6.2 波特率寄存器 (USART_BRR) 8

2.7 串口助手介绍... 8

2.8 UART实验... 8

2.8.1 配置UART去和串口助手进行通信... 8

2.9 Printf的使用... 8

 

第2章 UART异步串行通信

2.1 课前准备

2.1.1 学习方向

  1. 通信描述方式
  2. 什么是UART
  3. 为什么使用串口
  4. 怎么使用串口
  5. UART相关寄存器
  6. UART配置
  7. 实验

什么是串口     怎么配置串口          在什么情况下用串口

实验现象:使用UART和电脑(串口助手)进行通信

2.1.2 参考资料

原理图

芯片手册

《STM32F4xx中文参考手册》--26章节(USART)

2.1.3 常见通信的描述方式

通信协议:标准型(通用)串口      非标准型

通信的目的:一个设备和另一个设备发送数据,

协议:制定的规则,通信双方都要遵循这个规则

 

  • 同步/异步

同步: 在通信过程中,通信双方需要同一时钟频率下(都会连接同一根时钟线)

异步: 在通信过程中,通信双方可以不在同一时钟频率下(不代表设备没有时钟)

例:A和B两个设备

同步:A和B打电话,双方都要接电话才能通信,其中一方挂断或不接就,就无法通信。

异步:A和B发邮箱,A发完之后可以去做其他事情,B有空时来查看或回复A。

如何去判断两个设备进行通信时同步,还是异步(判断是否有时钟线)。

同步需要时钟线,异步可以不需要时钟线,双方设备都有自己的时钟电路,必须在相同传输速率下进行通信,不然可能会造成数据丢失(波特率)。

imageimage

 

同步和异步的区别:

(1)同步通信要求时钟频率一致,异步通信不要求时钟频率一致

(2)同步通信效率高,异步通信效率低
(3)同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。
(4)同步通信可用于点对多;在同一时刻下,异步通信只适用于点对点。

  • 串行/并行

串行:一帧数据的每个位都在一根数据线上传输,数据高位先发(MSB)还是低位先发(LSB)。

并行: 一帧的数据分为多条数据线发送。数据线的数量根据数据的位数。

image

串行与并行区别

串行优点:占用硬件资源少,结构简单

串行优点:传输速度慢

并行优点:传输速度快

并行缺点:占用硬件资源多,结构复杂。

  • 单工/半双工/全双工

例:设备A和设备B

单工:数据传输方向只能一个方向,A->B

半双工:数据传输方向可以两个方向上传输,在某一个时间点,数据传输只能单向A->B或B->A

全双工:数据传输方向可以两个方向上传输。需要两根数据线,A->B并且B->A

image

 

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(接收数据线)

image

image

 

USART通信特征:  异步串行全双工(常用)

2.3 串口数据帧格式

image

image

起始位+数据位+奇偶校验位(可有可无)+停止位

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

image

配置的时候关注:UART四要素:数据位    奇偶校验位   停止位    波特率

两设备使用串口通信要保证四要素配置相同才能正常通信。

2.4 UART框图分析

说明:   

发送数据要保证 上一次发送的数据已经发送完成

        如何知道发送完成

                寄存器发送完成位(上一次的发送完成,寄存器对应自动变为1

                读寄存器的这位是1,就可以再次发送数据

                       

接收数据就是把数据读取到变量中,要保证数据已完整的接收完成   

        如何知道接收完成

                寄存器接收完成位(接收完成了,寄存器对应位自动变为1

                读寄存器的这位是1,可以把串口控制器的数据读到变量里去

  • 程序员只能操作到DR,往DR里面写会自动填到TDR中,从DR里面读会自动从RDR中读

image

 

通过该部分框图分析出需要封装两个函数:
//发送一个字节函数

void USART1_SendByte(u8 Byte)

{

            //等待发送数据寄存器为空

            //把数据发给DR

}

//接受一个字节函数

u8 USART1_RecvByte(void)

{

            //等待接受数据寄存器不为空

            //从DR中读出数据

            //返回变量

}

image

image

2.5 CH340电平转换芯片

image

image

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 串口助手介绍

image

2.8 UART实验

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

image

说明:

        每个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的使用

 

posted @ 2025-07-31 19:38  微笑的''80  阅读(15)  评论(0)    收藏  举报