通用同步/异步收发器USART串口

发布于:2025-08-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

核心目标: 理解 USART 如何在 STM32 与外部设备(如 PC、传感器、模块)之间通过串行方式可靠地传输数据。

一、基本特征

维度 说明
信号线 TX(发送)、RX(接收)、可选 CTS/RTS(硬件流控)
电平 TTL(0/3.3 V) → 经 RS-232/RS-485/RS-422 转换器再接长线
全双工 同时收/发,互不干扰
波特率 典型 9600~115 200 bps,STM32 可达 4.5 Mbps
数据格式 起始位(1) + 数据位(5/6/7/8/9) + 校验位(0/1) + 停止位(1/1.5/2)

二、USART 核心能力:

全双工: 同时 进行发送 (Transmit) 和接收 (Receive)。需要独立的发送线 (TX) 和接收线 (RX)。
异步或同步操作: 支持两种模式(异步 UART 最常用)。
可编程波特率: 数据传输速率可灵活配置。‘

可编程数据格式:
数据位长度:5, 6, 7, 8 或 9 位。
停止位长度:1, 1.5, 2 位。

校验位:无校验、偶校验、奇校验。
**硬件流控制 (**可选): 使用 CTS (Clear To Send) 和 RTS (Request To Send) 信号线防止数据丢失(缓冲区溢出)。
多处理器通信: 支持在多个设备间寻址通信。
多种中断源: 提供丰富的状态标志和中断触发选项。
与 DMA 配合: 实现高效大数据量传输

三、USART 异步通信 (UART) 协议详解。

异步通信UART是USARST 最常用的模式,通常所说的“串口”就是指 UART。

物理连接:

TX (Transmit): STM32 的发送引脚,连接到对方设备的 RX。
RX (Receive): STM32 的接收引脚,连接到对方设备的 TX。
GND (Ground): 共地线。绝对必需! 提供共同的电压参考点。
(可选) CTS/RTS: 硬件流控制引脚。
信号电平: 通常是 TTL 电平 (0V = 逻辑0, 3.3V/5V = 逻辑1) 或 RS-232 电平 (负逻辑,±3V 到 ±15V)。STM32 引脚是 TTL 电平,连接 PC 串口 (RS-232) 需电平转换芯片 (如 MAX3232)。

数据帧格式:

每次传输一个 字符 (Character) 或 数据字节 (Data Byte) 是以一个 帧 (Frame) 的形式发送的。一个帧由以下部分组成:

  1. 空闲状态 (Idle): TX 线保持 高电平 (逻辑1)。

  2. 起始位 (Start Bit): 1 位 的 低电平 (逻辑0)。标志一个数据帧的开始。 接收方检测到这个下降沿就开始采样后续数据位。

  3. 数据位 (Data Bits): 要传输的实际数据。长度可配 (5-9 位),通常 8 位 (1 字节)。先发送最低有效位 (LSB)。

  4. 校验位 (Parity Bit): 可选 1 位。 用于简单的错误检测。
    偶校验 (Even): 数据位 + 校验位中 1 的总数为 偶数。
    奇校验 (Odd): 数据位 + 校验位中 1 的总数为 奇数。
    无校验 (None): 不发送校验位。

  5. 停止位 (Stop Bit): 1, 1.5 或 2 位 的 高电平 (逻辑1)。标志一个数据帧的结束,并确保线路回到空闲状态为下一个起始位做准备。通常用 1 位。

  6. 帧长度示例 (8N1): 最常用配置。1 起始位 + 8 数据位 + 无校验 + 1 停止位 =10位

波特率 (Baud Rate):

定义: 每秒钟传输的 符号数 (Symbols per second)。在 UART 中,一个符号就是一位 (bit)。所以波特率 等于 比特率 (bits per second, bps)。

意义: 决定了数据传输的 速度。通信双方 必须设置相同的波特率!

通信过程:

1.发送:

CPU 或 DMA 将要发送的数据写入 发送数据寄存器 (USART_DR)。
硬件自动将数据从 USART_DR 移入 发送移位寄存器。
发送控制逻辑从 起始位 开始,按配置好的帧格式(数据位、校验位、停止位)逐位 将移位寄存器中的内容通过 TX 引脚 发送出去(低位在前)。
当整个帧发送完毕,设置 发送完成标志 (TC),并可产生中断

  1. 接收:

接收控制逻辑持续监测 RX 引脚。

检测到 起始位(下降沿)时,启动接收过程。

根据配置的波特率,在 每个数据位的中间位置 进行采样(通常采样多次取多数值以提高抗噪性)。

将采样到的位 逐位 移入 接收移位寄存器(低位在前)。

当接收到完整的一帧(包括停止位)后:

如果帧格式(停止位电平、校验位)检查通过将移位寄存器中的数据部分移入 接收数据寄存器 (USART_DR)。

设置 接收数据寄存器非空标志 (RXNE),并可产生中断。

如果校验错误,设置 校验错误标志 (PE)。

如果停止位检测为低电平(应该是高),设置 帧错误标志 (FE)

CPU 或 DMA 读取 USART_DR 获取接收到的数据。读取 USART_DR 会清除 RXNE 标志。

四、USART 关键特性与功能

  1. 硬件流控制 (CTS/RTS):
    目的:
    防止接收方缓冲区溢出导致数据丢失
    引脚:
    nCTS (Clear To Send - 输入):对方设备告诉 STM32:“我现在可以接收数据了”
    nRTS (Request To Send - 输出):STM32 告诉对方设备:“我现在准备好接收数据了”
    工作流程
    (STM32 作为发送方)
    STM32 在发送数据前,会检查 nCTS 引脚。
    如果 nCTS 为低(有效),表示对方准备好,STM32 才发送数据。
    如果 nCTS 为高(无效),STM32 会暂停发送,直到 nCTS 变低。
    (STM32 作为接收方):
    当 STM32 的接收缓冲区有空间时,它会将 nRTS 置为低(有效),告诉对方“可以发送”。
    当接收缓冲区快满时,它会将 nRTS 置为高(无效),告诉对方“暂停发送。

重要性: 在高速通信或接收方处理速度较慢时,强烈建议使用硬件流控。
2. 中断:

USART 提供丰富的状态标志和对应的中断使能位。常用中断源:

TXE (Transmit Data Register Empty): 发送数据寄存器 (USART_DR) 空。表示可以写入新的待发送数据。常用于 DMA 禁用时的发送中断驱动。
TC (Transmission Complete): 整个帧(包括停止位)已从移位寄存器发送完毕。表示一次发送任务完成。
RXNE (Read Data Register Not Empty): 接收数据寄存器 (USART_DR) 非空。表示收到了新数据,可以读取。最常用的接收中断!
IDLE (Idle Line Detected): 检测到空闲状态(RX 线持续保持高电平超过一帧时间)。常用于不定长数据帧的接收判断。
ORE (Overrun Error): 数据溢出错误。 新数据到来时,前一个数据还未被读取(RXNE 未清除),导致数据丢失。
…………
3. 与 DMA 配合
接收: 当 RXNE 发生时(收到一个字节),触发 DMA 请求,DMA 自动将 USART_DR 中的数据搬运到指定的内存缓冲区。完美解决高速接收时 CPU 来不及处理或 ORE 问题。
发送: 当 TXE 发生时(发送寄存器空),触发 DMA 请求,DMA 自动将内存缓冲区中的下一个数据搬运到 USART_DR。高效发送大块数据。
优势: 解放 CPU,避免轮询或频繁中断,实现高速、稳定、大数据量传输。
4. 允许一个主机通过 USART 总线与多个从机通信
数据帧使用 9 位数据模式。
第 9 位 (MSB) = 1:表示该帧是 地址帧 (Address),包含目标从机地址。
第 9 位 (MSB) = 0:表示该帧是 数据帧 (Data)。

从机配置为多处理器模式。
默认处于静默状态(不接收数据帧)。
当接收到一个地址帧,且地址与自身匹配时,该从机退出静默状态,开始接收后续的数据帧。
其他地址不匹配的从机保持静默,忽略数据帧。
接收完数据帧后(或超时),从机自动回到静默状态。
主机发送时,先发送地址帧(第9位=1),再发送数据帧(第9位=0)

五、通信流程与注意事项

  1. 发送数据:
    查询方式: 等待 TXE 标志置位 (USART_GetFlagStatus(USARTx, USART_FLAG_TXE)),然后写入 USART_DR。等待 TC 标志置位表示完全发送完毕。
    中断方式: 使能 TXE 中断。在中断服务函数中检查 TXE,写入下一个数据到 USART_DR。最后一个数据发送后,可等待 TC 中断或标志。
    DMA 方式: 配置好 DMA 源地址(内存)、目标地址 (&USARTx->DR)、数据量。启动 DMA 和 USART 发送。DMA 完成后产生中断(或查询标志)
  2. 接收数据:
    查询方式: 轮询 RXNE 标志 (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE)),置位后读取 USART_DR。
    中断方式 (最常用): 使能 RXNE 中断。在中断服务函数中读取 USART_DR,清除 RXNE 标志(读 DR 自动清除)。
    DMA 方式 (高效): 配置 DMA 源地址 (&USARTx->DR)、目标地址(内存)、数据量、模式(循环/单次)。启动 DMA 和 USART 接收。DMA 传输完成或半传输产生中断
  3. 错误处理:

在中断或轮询中检查错误标志 (ORE, PE, FE, NE)。

读取 USART_DR 可以获取出错时的数据(但可能无效),更重要的是清除 RXNE 和相关错误标志(通常读 SR 再读 DR 或写 0 清除错误标志)。

分析错误原因(波特率不匹配、线路干扰、缓冲区溢出等)并做相应处理(如重发、复位接收状态)。
4. 电平转换:

连接 RS-232 设备(如 PC 串口)时,必须使用电平转换芯片(如 MAX3232CSE)将 STM32 的 TTL 电平 (0/3.3V) 转换为 RS-232 电平 (±3V to ±15V),反之亦然。直接连接会损坏 STM32 引脚!

六、典型应用场景

调试输出 (Debug Console): 使用 printf 重定向到 USART,通过串口助手查看程序运行信息、变量值。
与 PC 通信: 通过 USB 转 TTL 串口模块,实现 STM32 与 PC 上位机软件的数据交换。
连接模块: GPS 模块、蓝牙模块 (如 HC-05/06)、WiFi 模块 (如 ESP8266/ESP32)、GSM/GPRS 模块、串口屏、RFID 读卡器等常用串口通信。
设备间通信: 两个或多个 MCU 之间通过 USART 交换数据(注意共地)。
工业控制: 连接 PLC、传感器、变频器等支持 Modbus RTU (基于 RS-485, 物理层不同但协议基于串行帧) 的设备(需加 RS-485 收发器)。
固件升级 (ISP/IAP): 通过串口引导程序 (Bootloader) 烧录或更新用户程序

总结: USART 是 STM32 与外界进行灵活、可靠、中低速串行通信的基石。深入理解其异步通信协议(帧格式、波特率)、关键特性(全双工、硬件流控、中断/DMA) 和配置要素是成功应用的基础。掌握 RXNE 中断接收、IDLE + DMA 接收不定长数据 以及错误处理是实际开发中的核心技能。牢记 电平转换 要求(连接 RS-232)和 共地 原则,避免硬件损坏和通信失败。对调试、连接模块,设备互联,USART 都是不可或缺的工具。


网站公告

今日签到

点亮在社区的每一天
去签到