一、简介
•USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器
•USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
•自带波特率发生器,最高达4.5Mbits/s
•可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
•可选校验位(无校验/奇校验/偶校验)
•支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN
•STM32F103C8T6 USART资源: USART1、 USART2、 USART3
硬件电路
•简单双向串口通信有两根通信线(发送端TX和接收端RX)
•TX与RX要交叉连接
•当只需单向的数据传输时,可以只接一根通信线
•当电平标准不一致时,需要加电平转换芯片

电平标准
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
- TTL电平:+3.3V或+5V表示1,0V表示0
- RS232电平:-3~-15V表示1,+3~+15V表示0
- RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号
串口参数
- 波特率:串口通信的速率
- 起始位:标志一个数据帧的开始,固定为低电平
- 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
- 校验位:用于数据验证,根据数据位计算得来
- 停止位:用于数据帧间隔,固定为高电平


二、USART结构
USART的基本结构

发送控制器
接收控制器
映射

USART框图

1.数据收发核心
-
发送通道:CPU/DMA 将并行数据写入发送数据寄存器(TDR),数据随后被送入发送移位寄存器(TSR)。该寄存器会按低位先行的顺序,逐位将数据移位输出到 TX 引脚。
-
接收通道:RX 引脚的串行信号会被送入接收移位寄存器(RSR),它将串行数据拼接为并行数据,然后存入接收数据寄存器(RDR),等待 CPU/DMA 读取。
-
关键设计:TDR 和 TSR、RDR 和 RSR 的分离设计,形成了一级缓冲,可减少 CPU 的响应压力,提升通信效率。
2. 波特率生成单元
USART 的波特率由USART_BRR寄存器配置,计算公式为:
USARTDIV =(PCLK1/2)/ (16 *波特率)
USARTDIV = DIV_Mantissa + (DIV_Fraction / 16)
其中:
-
DIV_Mantissa是直接取USARTDIV的整数部分(不管小数是多少,直接舍掉,比如 39.0625 取 39,19.53125 取 19);DIV_Fraction是把USARTDIV的纯小数部分 ×16,取整数结果(这是寄存器能识别的,范围 0~15,因为 16 是 2^4,对应寄存器 4 个位)
-
波特率发生器会根据外设时钟(PCLK1/2)和USARTDIV值,生成收发器所需的同步时钟
-
发送器和接收器可独立使能,通过TE(发送使能)和RE(接收使能)位控制
3. 控制与状态系统
-
控制寄存器(CR1/CR2/CR3):负责配置帧格式(数据位长度、停止位数量)、校验模式、中断使能、DMA 请求等。
-
状态寄存器(SR):实时反映通信状态,例如TXE(发送寄存器空)、TC(发送完成)、RXNE(接收寄存器非空)、ORE(溢出错误)等标志位。
-
中断控制:可根据状态标志触发中断,例如发送完成中断、接收数据可用中断,让 CPU 无需轮询即可响应通信事件。
4. 增强功能模块
-
硬件流控(nRTS/nCTS):通过 RTS(请求发送)和 CTS(清除发送)引脚实现硬件握手,避免高速传输时的数据丢失。
-
IrDA 红外通信:通过 IrDA 编解码模块,可将 UART 信号转换为红外信号,实现短距离无线通信。
-
同步通信模式:通过 SCLK 引脚提供同步时钟,支持 SPI-like 的同步通信,提升传输可靠性。
-
DMA 接口:支持 DMA 直接读写 TDR/RDR,减少 CPU 介入,适合大数据量、低延迟的通信场景。
三、数据格式
数据帧

无论是 8 位还是 9 位字长,一个完整的 USART 数据帧都包含以下几个部分:
- 起始位:固定为 1 位低电平,用于同步接收端的时序。
- 数据位:可以是 8 位或 9 位,数据传输遵循低位先行(bit0 最先发送)。
- 奇偶校验位(可选):1 位,用于简单的错误检测,可配置为奇校验或偶校验。
- 停止位:1 位、1.5 位或 2 位高电平,标志着一帧数据的结束。

起始位侦测

STM32 的 USART 会在1 位时间内采样 16 次,用前 8 次采样来验证是否为有效起始位,而非噪声干扰:
- 第一阶段(第 1~3 次采样):要求 3 次采样中至少 2 次为低电平,初步确认低电平不是瞬间干扰。
- 第二阶段(第 4~6 次采样):再次验证,同样要求 3 次采样中至少 2 次为低电平,进一步排除干扰。
- 第三阶段(第 7~8 次采样):最终验证,确保低电平持续稳定。
只有连续通过这三轮验证,硬件才会确认这是一个有效起始位,并开始后续的数据位采样。
采样时钟:每 1 位时间内产生 16 个采样脉冲,是硬件的 “眼睛”。
数据采样点:在确认起始位后,硬件会将采样时钟的第 7 个脉冲作为数据位的同步基准,后续每个数据位都在第 7、8、9 次采样中取多数值,进一步保证数据准确性。
时间偏移:图中标注的7/16和6/16,是硬件为了避开信号跳变的不稳定区域,特意选择在位中间位置进行采样的设计,这也是抗干扰的关键。
检测噪声

多数判决原则:硬件会对第 8、9、10 次的采样结果进行 “少数服从多数” 的判决。比如 3 次采样结果为0、0、1,则判定该数据位为0,这样可以有效过滤单次噪声脉冲的干扰。
数据模式
•HEX模式/十六进制模式/二进制模式:以原始数据的形式显示
•文本模式/字符模式:以原始数据编码后的形式显示

HEX数据包

选用在正常数据中极少出现的字节(如0xFF、0xFE)位包头包尾,将数据放在包头包尾的中间,通过辨别包头包尾来识别数据的开始与结束。
固定包长:数据包总长度不变。
可变包长:数据包总长度可变。
HEX数据包接收

- 收到 0xFF → 从 S=0 进入 S=1。
- 依次收到 0x01、0x02、0x03、0x04 → 缓存满 4 字节,从 S=1 进入 S=2。
- 收到 0xFE → 验证通过,触发数据就绪事件,缓存数据 0x01~0x04 被取出处理,然后回到 S=0,等待下一帧。
文本数据包

包头(@) + 固定/不固定长度的字符数据段 + 包尾(\\r\\n)
文本数据包接收

- 收到 @ → 从 S=0 进入 S=1,清空缓存。
- 依次收到 A、B、C → 字符被加入缓存。
- 收到 \\r → 从 S=1 进入 S=2。
- 收到 \\n → 验证通过,触发数据就绪事件,缓存内容 A B C 被取出处理,回到 S=0。
- 收到下一个 @ → 重复上述流程,处理数据包 @D E\\r\\n。


