STM32 USART 串口

深入浅出 STM32 USART 串口:从基础概念到帧格式与波特率

在学习 STM32 的过程中,串口(USART/UART)几乎是每个开发者最先接触、也是最常用的通信外设。无论是打印调试信息,还是与外部传感器、蓝牙模块通信,都离不开它。

本文基于 STM32 串口知识,对帧格式及其之前的核心概念(物理层、通信方式、波特率等)进行系统性总结。带你一次性打通串口底层逻辑!


一、 什么是 UART

UART (Universal Asynchronous Receiver/Transmitter),即通用异步收发器。它是一种硬件电路,用于设备间的串行通信(数据按位顺序,一次发1位)。

1. 物理接线

UART 的接线非常简单,主要由两根数据线和一根地线构成:

  • Tx(Transmit):发送数据线
  • Rx(Receive):接收数据线
  • GND(地线):提供公共地,确保电平基准一致

连线规则 :Tx 接对端 Rx,Rx 接对端 Tx(交叉互连),构建双向通信。

2. 通信双方的关系

通信双方地位对等,没有主从概念,共同遵守一套约定的规则即可完成通信。


二、 UART 的四大核心特点

要理解串口,我们需要先了解它所在的通信分类框架:

1. 串行通信 与 并行通信

  • 并行:多根线同时传(如8根线传8位),速度快但成本高、易受串扰、抗干扰差(仅限板级)。

  • 串行 :一根线按时间顺序一位一位传。UART 属于串行通信(注意:SPI、I2C、CAN 也是串行通信,串行 ≠ UART)。

2. 异步通信 与 同步通信

  • 同步:有时钟线(SCK),双方踩着同一个节拍(时钟沿)收发数据。

* 异步 :没有时钟线 UART 正是异步通信,依靠双方事先约定好的波特率 (每个 bit 持续的时间)来识别数据。

3. 1对1通信

一个串口模块只能与另一个串口模块通信,不支持像 I2C 那样挂载多个设备。

4. 全双工通信

  • 单工:只能单向传输(如广播)。
  • 半双工:可以双向,但同一时刻只能有一方说话(如对讲机)。
  • 全双工 :UART 拥有独立的 Tx 和 Rx 线,可以同时发送和接收 (像日常吵架,你说你的,我说我的)。注:基于 UART 的 RS-485 是半双工。

三、 MCU 与串口的关系

在 STM32 内部,串口是以片上外设的形式挂载在 APB 总线上的。

1. UART 与 USART 的区别

STM32 的参考手册中通常叫 USART (Universal Synchronous Asynchronous Receiver Transmitter),比 UART 多了一个 Synchronous(同步) 功能。

  • 如果给 USART 额外提供一根时钟线(CLK),即可实现同步通信。
  • 但实际应用中极少使用同步功能,因此忽略同步功能,USART == UART。

2. 四方关系:MCU、USART、GPIO 与 外部设备

USART 模块不直接对外,而是复用 GPIO 引脚(如 PA9 作 TX,PA10 作 RX)。MCU 内部的 USART 控制器将通过 GPIO 的高低电平向外输出信号。


四、 速度的灵魂:比特率 与 波特率

在宏观上,发送端输出高低电平表示 0 和 1,但接收端怎么知道发送端的速度有多快呢?这就引出了波特率。

1. 比特率(Bit Rate)

  • 定义 :每秒传输的比特(bit)数,单位 bps(bits per second)。
  • 侧重 :衡量传递有效信息的数据量。

2. 波特率(Baud Rate)

  • 定义 :每秒传输的码元(Symbol)数量,单位 Baud。
  • 侧重 :衡量信号跳变的速率。

3. 两者的关系

比特率 = 波特率 × 单个码元携带的比特数

对于单片机的 UART 来说,使用的是高低电平两种状态(二进制码元),每个码元只携带 1 比特信息。因此:在 UART 中,比特率 == 波特率。

4. 波特率的本质意义

波特率设置的越高,传输速度越快。但它底层的物理意义是:决定了单个信号电平持续的时间 。

例如波特率为 9600,意味着每个 bit 持续约 (1 / 9600) 秒。双方必须设置相同的波特率,才能正确采样。


五、 USART 帧格式

解决了"速度"问题,接下来要解决的是"边界"问题:接收方怎么知道数据什么时候开始?什么时候结束?数据有几位?

这就需要双方约定好数据帧格式 。

1. 一帧数据的组成

UART 的一帧(Frame)数据通常由以下部分构成(按发送顺序):

  1. 空闲状态(Idle):总线保持逻辑高电平(1)。
  2. 起始位(Start Bit) :拉低电平(0),持续 1 个位时间。这是关键!下降沿告诉接收方:"我要开始发数据了,请同步节拍!"
  3. 数据位(Data Bits) :通常是 8 位或 9 位。低位(LSB)在前,高位(MSB)在后。
  4. 校验位(Parity Bit) (可选):用于简单的错误检测(奇校验/偶校验)。
    • 奇校验:数据位+校验位中,1 的个数为奇数。
    • 偶校验:数据位+校验位中,1 的个数为偶数。
    • 注意:校验只能检测奇数个错误,无法纠错。
  5. 停止位(Stop Bit) :拉高电平(1),持续 1、1.5 或 2 个位时间。告诉接收方本帧结束。
  6. 回到空闲状态。

2. 为什么必须要结束位?

如果当前帧发完不强制拉高(停止位),那么下一个起始位的拉低动作可能就不存在(因为前面正好是低电平),会导致下一帧无法正确开始。停止位保证了每一帧起始位到来前,总线一定有确定的高电平。

3. 常见疑问解答

  • Q:会不会把起始位当成数据位?
    • A:不可能。双方提前约定了帧格式(比如1起始+8数据+1停止),接收方识别到第一个下降沿就固定判定为起始位,不会错乱。
  • Q:发 5 个字节,会有几个停止位?
    • A :5 个。每次发送一个字节,都会形成一帧完整的数据(独立拥有起始位、数据位、停止位),就像每说一句话都要画一个句号一样。

六、 换算:波特率与传输速率

有了波特率和帧格式,我们就可以算理论上的传输速度了。

【示例 1】常规配置

  • 波特率:9600 Bd(bps)
  • 帧格式:1起始位 + 8数据位 + 无校验 + 1停止位 = 10 位
  • 每秒传输字节数 = 9600 / 10 = 960 字节/秒

【示例 2】高速配置

  • 波特率:115200 Bd(bps)
  • 帧格式:1起始位 + 8数据位 + 无校验 + 1停止位 = 10 位
  • 每秒传输字节数 = 115200 / 10 = 11520 字节/秒

总结

  1. 交叉接线:Tx 连 Rx,共地。
  2. 异步全双工:没有时钟线,靠波特率同步;收发独立。
  3. 波特率:本质是电平持续时间,通信双方必须一致。
  4. 帧格式 :是双方约定好的语言规则,起始位(低) + 数据位(LSB先发) + 校验位(可选) + 停止位(高),保证了数据的确定性。
相关推荐
smartpi_ai3 小时前
高端智能沙发如何接入大模型语音:JL-17T 离在线语音模块方案实录
人工智能·单片机·语音识别
路上有只喵4 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇5
单片机·嵌入式硬件·fpga开发
恒锐丰科技林技术员4 小时前
CL5012A 升压型双节锂电池充电芯片方案解析
经验分享·嵌入式硬件·硬件工程
小向是个Der13 小时前
嵌入式进阶——MCU上电后的动作
c语言·单片机·mcu·学习·链接脚本
Kuakewei88814 小时前
PW6606快充协议诱骗芯片:纯硬件电阻配置五档电压方案
嵌入式硬件
车软学堂14 小时前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化
LCG米14 小时前
STM32 ADC多通道DMA定时器触发实测:TRGO触发链、采样率精确控制与乒乓缓冲落地
stm32·单片机·嵌入式·adc
iCxhust14 小时前
SEGGER 的 J-Scope
单片机·嵌入式硬件
路上有只喵17 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇2
单片机·嵌入式硬件