【STM32】USART UART 串口通信详解【原理】

前注:本文章主要讲解【原理】【固件库(标准库)】【HAL库】

内容为 '_Snake_'编写,日常学习总结,内容如有不足、不妥之处请私信告知,谢谢!

A.硬件原理

一、通信理论知识

串行/并行通信

按数据传送的方式,通讯可分为串行通讯并行通讯 

串行通讯就像单个车道的公路,同一时刻只能传输 一个数据位的数据。
并行通讯就像多个车道的公路,可以同时传输多个数据位的数据。

【STM32】USART UART 串口通信详解【原理】_第1张图片

特性对比

【STM32】USART UART 串口通信详解【原理】_第2张图片

传输方向

根据串行通信数据传输的方向,可将串行通信方式分为:单 工方式、半双工
方式和全双工方式
单工 方式指数据传输仅能沿着一个方向,不能反向传输。
半双工 指的是数据传输可以沿着两个方向, 但是不能同时发送,这就表示 发送/ 接收 是有先后顺序的。
全双工 指的是可以同时进行双向传输。全双工和半双工通信的本质区别是半双工通信双方只共用一条线路实现双向通信,但是全双工却利用两条线路,一条作发送数据用,另一条作接收数据用。

 【STM32】USART UART 串口通信详解【原理】_第3张图片

【STM32】USART UART 串口通信详解【原理】_第4张图片

 【STM32】USART UART 串口通信详解【原理】_第5张图片

同步通讯与异步通讯

根据传输方式的不同,可以分为同步通信和异步通信

在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据, 通讯中通常 双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样(时钟线)

在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,某些通讯中还 需要双方约定数据的传输速率(波特率) ,以便更好地同步。

【STM32】USART UART 串口通信详解【原理】_第6张图片

串口电平

【STM32】USART UART 串口通信详解【原理】_第7张图片

 串口连接和时序

  • 波特率:一般选波特率都会有9600,19200,115200等选项。其实意思就是每秒传输这么多个比特位数 (bit);
  • 起始位:先发出一个逻辑”0”的信号,表示传输数据的开始;
  • 数据位:可以是5~8位逻辑”0””1”,先传输bit 0,在传输bit 1,依次类推;
  • 校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验位是可选的,可以不传输;
  • 停止位:它是一个字符数据的结束标志,数据线变回逻辑”1”

【STM32】USART UART 串口通信详解【原理】_第8张图片

 【STM32】USART UART 串口通信详解【原理】_第9张图片

 【STM32】USART UART 串口通信详解【原理】_第10张图片

二、串口

STM32F103 系列最多有 3 个通用同步异步收发器(usart),2个通用异步收发器(uart)。USART和UART的主要区别在于,USART支持同步通信,该模 式有一根时钟线提供时钟。
串口在嵌入式中经常使用,一般使用 UART 就足够了,常见的用途如下:
1. 作为调试口,打印程序运行的状态信息;
2. 连接串口接口的模块(比如 GPS 模块),传输数据;
3. 通过电平转换芯片变为 RS232/RS485 电平,连接工控设备;

STM32功能支持图

【STM32】USART UART 串口通信详解【原理】_第11张图片

框图 

【STM32】USART UART 串口通信详解【原理】_第12张图片

1. ①功能引脚
  • TX:发送数据输出引脚。
  • RX:接收数据输入引脚。
  • SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
  • nRTS:请求以发送(Request To Send)n 表示低电平有效。如果使能 RTS 流控制,当USART接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时, nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
  • nCTS:清除以发送(Clear To Send)n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
  • SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

【STM32】USART UART 串口通信详解【原理】_第13张图片

USART1 最大频率为 72MHz ,其他四个最大频率为 36MHz UART 只是异步传输功能,所以没有 SCLK nCTS nRTS 功能引脚
2. ②数据寄存器
USART 数据寄存器 (USART_DR) 只有低 9 位有效,并且第 9 位数据是否有效要取决于USART 控制寄存器 1(USART_CR1) M 位设置,当 M 位为 0 时表示 8 位数据字长,当 M位为 1 表示 9 位数据字长,我们一般使用 8 位数据字长。
【STM32】USART UART 串口通信详解【原理】_第14张图片
USART_DR 包含了已发送的数据或者接收到的数据。 USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写 TDR ,一个专门用于接收的可读 RDR 。当进行发送操作时,往USART_DR 写入数据会自动存储在 TDR 内;当进行读取操作时,向 USART_DR 读取数据会自动提取 RDR 数据。
TDR RDR 都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把 TDR 内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到 RDR。
USART_DR 寄存器包含了一个内部总线和发送移位寄存器之间的缓冲器。
【STM32】USART UART 串口通信详解【原理】_第15张图片
【STM32】USART UART 串口通信详解【原理】_第16张图片

【STM32】USART UART 串口通信详解【原理】_第17张图片

3. ③控制器
        USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。
使用 USART 之前需要向 USART_CR1 寄存器的 UE 位置 1 使能 USART UE 位用来开启
供给给串口的时钟。发送或者接收数据字长可选 8 位或 9 位,由 USART_CR1 M 位控制。
【STM32】USART UART 串口通信详解【原理】_第18张图片

 【STM32】USART UART 串口通信详解【原理】_第19张图片

发送器(搭配手册发送器篇一起看 效果更佳)
【STM32】USART UART 串口通信详解【原理】_第20张图片
        当 USART_CR1 寄存器的发送使能位 TE 1 时,启动数据发送,发送移位寄存器的
数据会在 TX 引脚输出, 低位在前,高位在后 。如果 是同步模式 SCLK 也输出时钟信号
【STM32】USART UART 串口通信详解【原理】_第21张图片
1 .在数据传输期间不能复位 TE 位,否则将破坏 TX 脚上的数据,因为波特率计数器停止计数。 正在传输的当前数据将丢失。
2 TE 位被激活后将发送一个空闲帧。
        一个字符帧发送需要三个部分:起始位+ 数据帧 + 停止位。起始位是 一个位周期的低电
,位周期就是每一位占用的时间;数据帧就是我们要发送的 8 位或 9 位数据,数据是从
最低位开始传输 的;停止位是一定时间周期的高电平。
        停止位时间长短是可以通过 USART 控制寄存器 2(USART_CR2) STOP[1:0] 位控制, 可选 0.5 个、 1 个、 1.5 个和 2 个停止位。
1 个停止位
停止位位数的默认值
2 个停止位
可用于常规 USART 模式、单线模式以及调制解调器模式。
0.5 个停止位 在智能卡模式下接收数据时使用。
1.5 个停止位
在智能卡模式下发送和接收数据时使用。

 【STM32】USART UART 串口通信详解【原理】_第22张图片

 【STM32】USART UART 串口通信详解【原理】_第23张图片

当发送使能位 TE 1 之后,发送器开始会先发送 一个空闲帧(一个数据帧长度的高电
平) ,接下来就可以往 USART_DR 寄存器写入要发送的数据。在写入最后一个数据后,需
要等待 USART 状态寄存器 (USART_SR) TC 位为 1 ,表示数据传输完成,如果
USART_CR1 寄存器的 TCIE 位置 1 ,将产生中断。
【STM32】USART UART 串口通信详解【原理】_第24张图片

 【STM32】USART UART 串口通信详解【原理】_第25张图片

接收器
【STM32】USART UART 串口通信详解【原理】_第26张图片
如果将 USART_CR1 寄存器的 RE 位置 1 使能 USART 接收 ,使得接收器在 RX 线开
始搜索起始位。在确定到起始位后就根据 RX 线电平状态把数据存放在接收移位寄存器内。

接收完成后就把接收移位寄存器数据移到 RDR 内,并把 USART_SR 寄存器的 RXNE 位置 1,同时如果 USART_CR1 寄存器的 RXNEIE 置 1 的话可以产生中断

【STM32】USART UART 串口通信详解【原理】_第27张图片

 

 4. ④小数波特率生成

接收器和发送器的波特率在 USARTDIV 的整数和小数寄存器中的值应设置成相同。

其中, f PLCK USART 时钟, USARTDIV 是一个存放在波特率寄存器 (USART_BRR)
的 一个 无符号定点数。 其中 DIV_Mantissa[11:0] 位 定义 USARTDIV 的 整数 部分 ,
DIV_Fraction[3:0]位定义 USARTDIV 的小数部分。
【STM32】USART UART 串口通信详解【原理】_第28张图片

假设所需波特率为 115200 ,当前 USART 时钟为 72MHz ,则 USARTDIV=72000000/(115200*16)=39.0625
USART_BRR 寄存器使用高 12 [15:4] 存放整数部分,低 4 [3:0] 存放小数部分,小数部分每一位对应 1/2的4次方  =0.0625(0.625*2的4次方=1) 。因此,整数 39 对应 16 进制为 0x27 ,左移 4 位为 0x270 ,小数 0.0625 ,对应 0x1 USART_BRR=0x271 即可。
只有USART1的波特率计算中的 能取最大系统时钟72MHz,其它的 USART/UART 只能取 36MHz

波特率的常用值有 2400960019200115200

【STM32】USART UART 串口通信详解【原理】_第29张图片

小数x16就是寄存器的值 

5. 校验控制
        STM32F103 系列控制器 USART 支持奇偶校验。当使用校验位时,串口传输的长度将
8 位的数据帧加上 1 位的校验位总共 9 位,此时 USART_CR1 寄存器的 M 位需要设置为
1 ,即 9 数据位。将 U SART_CR1 寄存器的 PCE 位置 1 就可以启动奇偶校验控制 ,奇偶校
验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收
数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见 USART_SR 寄存
器的 PE 位置 1,并可以产生奇偶校验中断
        使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+ 数据帧 + 校验位 + 停止位。
【STM32】USART UART 串口通信详解【原理】_第30张图片

 【STM32】USART UART 串口通信详解【原理】_第31张图片

 6. 中断控制

 【STM32】USART UART 串口通信详解【原理】_第32张图片

B.固件库

结构体

涉及文件stm32f10x_usart.h,stm32f10x_usart.c,stm32f10x.h

USART 寄存器结构体

typedef struct
{
  __IO uint16_t SR;       //状态寄存器
  uint16_t  RESERVED0;    //保留0
  __IO uint16_t DR;       //数据寄存器
  uint16_t  RESERVED1;    //保留1
  __IO uint16_t BRR;      //波特比率寄存器
  uint16_t  RESERVED2;    //保留2
  __IO uint16_t CR1;      //控制寄存器1
  uint16_t  RESERVED3;    //保留3
  __IO uint16_t CR2;      //控制寄存器2
  uint16_t  RESERVED4;    //保留4
  __IO uint16_t CR3;      //控制寄存器3
  uint16_t  RESERVED5;    //保留5
  __IO uint16_t GTPR;     //保护时间和预分频寄存器
  uint16_t  RESERVED6;    //保留6
} USART_TypeDef;

【STM32】USART UART 串口通信详解【原理】_第33张图片

 【STM32】USART UART 串口通信详解【原理】_第34张图片

USART 初始化结构体

1 typedef struct {
2 uint32_t USART_BaudRate;            // 波特率
3 uint16_t USART_WordLength;          // 字长
4 uint16_t USART_StopBits;            // 停止位
5 uint16_t USART_Parity;              // 校验位
6 uint16_t USART_Mode;                // USART 模式
7 uint16_t USART_HardwareFlowControl; // 硬件流控制
8 } USART_InitTypeDef;
1) USART_BaudRate :波特率设置。一般设置为 2400 9600 19200 115200 。标准
库函数会根据设定值计算得到 USARTDIV 值,从而设置 USART_BRR 寄存器值。
2) USART_WordLength :数据帧字长,可选 8 位或 9 位。它设定 USART_CR1 寄存
器的 M 位的值。如果没有使能奇偶校验控制,一般使用 8 数据位;如果使能了奇
偶校验则一般设置为 9 数据位。
3) USART_StopBits :停止位设置,可选 0.5 个、 1 个、 1.5 个和 2 个停止位,它设定
USART_CR2 寄存器的 STOP[1:0] 位的值,一般我们选择 1 个停止位。
4) USART_Parity : 奇 偶 校 验 控 制 选 择 , 可 选 USART_Parity_No( 无校验 )
USART_Parity_Even( 偶校验 ) 以 及 USART_Parity_Odd( 奇 校 验 ) , 它 设 定
USART_CR1 寄存器的 PCE 位和 PS 位的值。
5) USART_Mode USART 模式选择,有 USART_Mode_Rx USART_Mode_Tx
允许使用逻辑或运算选择两个,它设定 USART_CR1 寄存器的 RE 位和 TE 位。
6) USART_HardwareFlowControl :硬件流控制选择,只有在硬件流控制模式才有效,
可选有⑴使能 RTS 、⑵使能 CTS 、⑶同时使能 RTS CTS 、⑷不使能硬件流。

USART 时钟初始化结构体

 typedef struct {
2 uint16_t USART_Clock;     // 时钟使能控制
3 uint16_t USART_CPOL;      // 时钟极性
4 uint16_t USART_CPHA;      // 时钟相位
5 uint16_t USART_LastBit;   // 最尾位时钟脉冲
6 } USART_ClockInitTypeDef;
  1. USART_Clock:同步模式下 SCLK 引脚上时钟输出使能控制,可选禁止时钟输出(USART_Clock_Disable)或开启时钟输出(USART_Clock_Enable);如果使用同步模式发送,一般都需要开启时钟。它设定 USART_CR2 寄存器的 CLKEN 位的值。
  2. USART_CPOL:同步模式下 SCLK 引脚上输出时钟极性设置,可设置在空闲时SCLK 引脚为低电平(USART_CPOL_Low)或高电平(USART_CPOL_High)。它设定 USART_CR2 寄存器的 CPOL 位的值。
  3. USART_CPHA:同步模式下 SCLK 引脚上输出时钟相位设置,可设置在时钟第一个变化沿捕获数据(USART_CPHA_1Edge)或在时钟第二个变化沿捕获数据。它设定 USART_CR2 寄存器的 CPHA 位的值。USART_CPHA USART_CPOL 配合使用可以获得多种模式时钟关系。
  4. USART_LastBit:选择在发送最后一个数据位的时候时钟脉冲是否在 SCLK 引脚输 出 , 可以 是 不 输 出 脉 冲 (USART_LastBit_Disable) 、 输 出 脉 冲(USART_LastBit_Enable)。它设定 USART_CR2 寄存器的 LBCL 位的值。

函数

【STM32】USART UART 串口通信详解【原理】_第35张图片

【STM32】USART UART 串口通信详解【原理】_第36张图片

你可能感兴趣的:(STM32,#,STM32外设原理,stm32,单片机,arm)