2. 串口通信基础:UART/USART协议原理、数据帧格式、波特率、起始位/停止位/校验位
串口(UART/USART)是嵌入式系统中最基础、最常用的通信接口之一。在STM32开发中,理解串口通信的底层原理是掌握DMA+空闲中断接收不定长数据的前提。本章将系统讲解UART/USART协议的核心概念,包括数据帧结构、波特率计算、同步/异步差异以及校验机制。
2.1 UART与USART:概念辨析
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)和USART(Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步/异步收发器)是两种常见的串行通信模块。两者的核心区别在于是否支持同步模式。
| 特性 | UART | USART |
|---|---|---|
| 通信模式 | 仅异步 | 同步 + 异步 |
| 时钟信号 | 无独立时钟线,双方约定波特率 | 同步模式下提供SCLK时钟线 |
| 硬件引脚 | TX、RX(2线) | TX、RX、SCLK(3线,同步模式) |
| 典型应用 | GPS模块、蓝牙模块、调试串口 | SPI设备扩展、智能卡接口 |
| STM32支持 | 部分低功耗型号 | 主流STM32系列(如F1/F4/H7) |
开发提示:在STM32课程中,我们通常使用USART配置为异步模式(即当作UART使用)。USART的同步模式在需要额外时钟输出的场景(如驱动移位寄存器)才会启用,日常串口通信无需关注SCLK引脚。
2.2 数据帧格式:从起始位到停止位
串口通信以“帧”为单位传输数据。一个标准的数据帧由以下部分组成:
- 起始位(Start Bit):1位,逻辑低电平(0),标志数据帧开始。
- 数据位(Data Bits):通常为8位或9位,低位在前(LSB first)。
- 校验位(Parity Bit):可选,用于简单检错。
- 停止位(Stop Bit):1位、1.5位或2位,逻辑高电平(1),标志数据帧结束。
关键概念:空闲状态时TX/RX线保持高电平。起始位的下降沿(高→低)是接收器同步时钟的触发信号,这是异步通信能够工作的基础。
2.3 波特率:通信的“心跳”
波特率(Baud Rate)定义每秒传输的符号数,单位是bps(bits per second)。在UART通信中,一个符号对应一个比特位,因此波特率等于比特率。
常用波特率标准:
| 波特率(bps) | 每位时间(μs) | 典型应用场景 |
|---|---|---|
| 9600 | 104.17 | GPS模块、工业传感器、调试终端 |
| 19200 | 52.08 | 蓝牙模块、低速数据采集 |
| 38400 | 26.04 | 通用串口设备 |
| 115200 | 8.68 | STM32调试串口、WiFi模块 |
| 921600 | 1.09 | 高速数据传输、固件升级 |
常见误区:波特率越高,传输速度越快,但误码率也会上升。在长距离通信(如RS-232超过10米)或电磁干扰较强的环境中,建议使用9600或19200 bps以保证数据可靠性。STM32内部通过时钟分频产生波特率,需确保系统时钟频率能精确分频出目标波特率,否则会产生累积误差。
2.4 校验位:简单的错误检测
校验位用于检测传输过程中是否发生单比特翻转错误。UART支持三种校验模式:
- 无校验(None):不发送校验位,数据帧最短,效率最高。
- 奇校验(Odd):数据位 + 校验位中“1”的总数为奇数。
- 偶校验(Even):数据位 + 校验位中“1”的总数为偶数。
校验位计算示例(8位数据):
| 数据(二进制) | 数据中“1”的个数 | 偶校验位 | 奇校验位 |
|---|---|---|---|
| 0b01010101 | 4(偶数) | 0 | 1 |
| 0b01010111 | 5(奇数) | 1 | 0 |
| 0b00000000 | 0(偶数) | 0 | 1 |
| 0b11111111 | 8(偶数) | 0 | 1 |
开发建议:在STM32串口配置中,校验位会占用数据帧中的第9位(如果配置为8位数据+校验,则实际有效数据为7位)。对于不定长数据接收,推荐使用“8位数据 + 无校验 + 1位停止位”的经典配置,这样每帧传输1字节,数据处理最直观。
2.5 异步通信的时序与采样
异步通信没有独立的时钟线,接收端通过以下方式恢复数据:
- 检测起始位:检测到RX线从高电平跳变到低电平,启动内部采样时钟。
- 位采样:在每个位周期的中间时刻(如第8个采样点)读取电平值,避免信号跳变沿的干扰。
- 帧结束:检测到停止位(高电平)后,等待下一帧起始位。
2.6 STM32串口配置关键参数
在STM32 HAL库中,串口初始化通过 UART_HandleTypeDef 结构体配置。以下是核心参数及其对应关系:
// STM32串口初始化结构体示例
UART_HandleTypeDef huart1;
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200; // 波特率
huart1.Init.WordLength = UART_WORDLENGTH_8B; // 数据位:8位
huart1.Init.StopBits = UART_STOPBITS_1; // 停止位:1位
huart1.Init.Parity = UART_PARITY_NONE; // 校验位:无
huart1.Init.Mode = UART_MODE_TX_RX; // 收发模式
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 硬件流控:无
huart1.Init.OverSampling = UART_OVERSAMPLING_16; // 过采样:16倍
HAL_UART_Init(&huart1);
参数选择建议:对于本课程的不定长数据接收场景,推荐使用 115200-8-N-1 配置(波特率115200、8位数据、无校验、1位停止位)。该配置在速度和可靠性之间取得平衡,且与大多数串口调试工具兼容。
2.7 硬件流控:RTS/CTS
硬件流控通过额外的RTS(请求发送)和CTS(清除发送)信号线实现收发双方的流量控制,防止接收缓冲区溢出。
| 信号线 | 方向 | 功能说明 |
|---|---|---|
| RTS | 输出 | 接收端通知发送端“我可以接收数据” |
| CTS | 输入 | 发送端检测接收端是否准备好 |
课程关联:在DMA+空闲中断接收方案中,通常不使用硬件流控。DMA控制器自动将数据从USART DR寄存器搬运到内存缓冲区,CPU无需逐字节干预,因此接收缓冲区溢出的风险远低于中断方式。但如果数据量极大(如持续高速流),仍建议评估是否启用流控。
2.8 本章小结
串口通信的基础知识是后续实现DMA+空闲中断接收的基石。重点掌握:
- UART与USART的差异:USART支持同步模式,日常使用配置为异步模式。
- 数据帧结构:起始位(低电平)→ 数据位(LSB first)→ 校验位(可选)→ 停止位(高电平)。
- 波特率决定通信速度,需确保收发双方一致且误差在允许范围内(通常<2%)。
- 校验位提供单比特检错能力,但会减少有效数据位宽。
- STM32 HAL库通过结构体参数灵活配置串口,推荐115200-8-N-1作为通用配置。