目录
- 前言
- 一、USART在MCU中的架构位置
-
- [1.1 STM32F103ZET6整体架构](#1.1 STM32F103ZET6整体架构)
- [1.2 总线结构与USART的连接关系](#1.2 总线结构与USART的连接关系)
- [1.3 USART与GPIO的引脚复用关系](#1.3 USART与GPIO的引脚复用关系)
- 二、USART模块内部结构详解
-
- [2.1 USART作为独立硬件单元](#2.1 USART作为独立硬件单元)
- [2.2 数据寄存器概览](#2.2 数据寄存器概览)
- [2.3 数据寄存器(USART_DR)详解](#2.3 数据寄存器(USART_DR)详解)
- 三、数据发送过程详解
-
- [3.1 发送数据流程](#3.1 发送数据流程)
- [3.2 LSB优先发送模式](#3.2 LSB优先发送模式)
- 四、数据接收过程详解
-
- [4.1 接收数据流程](#4.1 接收数据流程)
- [4.2 硬件自主完成](#4.2 硬件自主完成)
- 五、引脚物理层细节
-
- [5.1 高电平与低电平的本质](#5.1 高电平与低电平的本质)
- [5.2 引脚内部保护电路](#5.2 引脚内部保护电路)
- [5.3 收发双方的对称关系](#5.3 收发双方的对称关系)
- 结语


🎬 云泽Q :个人主页
🔥 专栏传送入口 : 《C语言》《数据结构》《C++》《Linux》《蓝桥杯系列》《笔试算法》《AI赋能》《STM32》《Python》
⛺️遇见安然遇见你,不负代码不负卿~
前言
大家好啊,我是云泽Q,欢迎阅读我的文章,一名热爱计算机技术的在校大学生,喜欢在课余时间做一些计算机技术的总结性文章,希望我的文章能为你解答困惑~
一、USART在MCU中的架构位置
1.1 STM32F103ZET6整体架构
要理解串口(USART)是怎么工作的,首先得搞清楚它在整个MCU芯片里到底处在一个什么位置。我们来看STM32F103ZET6的整体架构图。
芯片的核心是一颗Cortex-M3内核(CPU),它通过多条总线与芯片内部的各种资源进行通信。这些总线包括:
- ICode总线:专门用于取指令,连接到Flash接口,再从Flash接口读取存储在Flash中的程序指令。
- DCode总线:专门用于数据访问,也连接到Flash接口和SRAM。
- System总线 :这是CPU访问外设的主要通道,通过总线矩阵(交叉开关)可以路由到多个目标------包括SRAM、FSMC(灵活的静态存储控制器)、SDIO以及AHB系统总线。
- DMA总线:允许DMA控制器在不经过CPU的情况下,直接在内存和外设之间搬运数据。

所有这些总线最终通过总线矩阵进行交叉互联,确保CPU、DMA等多个主控方能够高效地访问不同的目标资源。
1.2 总线结构与USART的连接关系
在芯片内部,外设并不是直接挂在高速总线上的,而是通过桥接器(Bridge)分层连接的。
具体层级结构如下:
- AHB系统总线(Advanced High-performance Bus):这是高速总线,连接着DMA控制器、RCC(复位和时钟控制模块)、FSMC等高速设备。
- 桥接1(Bridge 1)→ APB1:APB1是低速外设总线,上面挂载了USART2、USART3、UART4、UART5、TIM2~TIM7、I2C1/I2C2、SPI2/SPI3、USB、CAN、RTC、IWDG、WWDG等外设。
- 桥接2(Bridge 2)→ APB2 :APB2是高速外设总线,上面挂载了USART1、ADC1/ADC2/ADC3、SPI1、TIM1/TIM8、GPIOA~GPIOG、EXTI、AFIO等外设。
这里有一个非常关键的知识点:USART1是挂在APB2上的,而USART2~USART5是挂在APB1上的。意味着USART1的工作时钟来自APB2总线时钟(最高72MHz),而USART2~5的工作时钟来自APB1总线时钟(最高36MHz)。所以在需要高波特率通信时,通常优先选择USART1。
1.3 USART与GPIO的引脚复用关系
USART作为一个片上外设,它本身只是一个芯片内部的硬件电路模块。那它是怎么把数据发到芯片外面去的呢?答案是通过GPIO引脚的复用功能。
每个USART模块对外通信至少需要两根线:
- TX(发送引脚):负责将芯片内部的并行数据转换为串行信号后输出到芯片外部。
- RX(接收引脚):负责将外部输入的串行信号送入芯片内部的接收电路。
具体到引脚层面,比如USART1的TX默认复用引脚是PA9 ,RX默认复用引脚是PA10。这些引脚本质上是GPIO引脚,但当它们被配置为复用功能(Alternate Function)时,就不再受普通GPIO输入输出寄存器控制,而是直接与USART模块内部的发送/接收控制器相连。

从GPIO内部结构图可以看到,引脚的信号通路经过了一个复用功能输出的通路,来自片上外设(USART)的信号通过这个通路驱动PMOS/NMOS管,最终在芯片引脚上产生高低电平的变化。
二、USART模块内部结构详解
2.1 USART作为独立硬件单元
理解USART的第一步,要建立一个核心认知:USART本质上是一套独立的硬件单元,属于片上外设。它就像芯片内部的一个"小助手",有自己独立的逻辑电路、寄存器和控制器。
CPU(Cortex-M3内核)并不直接参与每一个数据位的发送和接收过程。CPU要做的只是:
- 把要发送的数据写入USART的指定寄存器。
- 从USART的指定寄存器读取接收到的数据。
剩下的所有工作------把数据逐位移出、在引脚上产生高低电平、在引脚上检测高低电平并逐位收集、组装成完整字节------全部由USART硬件自主完成,无需人为干预。
那CPU是怎么控制这个独立硬件单元的呢?答案是通过寄存器。USART内部一定存在各种寄存器,CPU通过APBx总线(时钟线+数据线+控制线)对这些寄存器进行读写操作,从而实现配置和控制。
2.2 数据寄存器概览
USART内部包含大量寄存器,按照功能可以分为以下几大类:

这是用户编程时最常打交道的寄存器:
- 发送数据寄存器(TDR,Transmit Data Register):CPU将要发送的数据写入这里。
- 接收数据寄存器(RDR,Receive Data Register):CPU从这里读取接收到的数据。
- 发送移位寄存器(不可见):TDR中的数据会被硬件自动转移到发送移位寄存器中,然后逐位移出到TX引脚。
- 接收移位寄存器(不可见):从RX引脚逐位收到的数据先存放在这里,接收完整后自动转移到RDR。
注意:TDR和RDR在物理上共享同一个地址(即USART_DR寄存器的地址0x04)。对USART_DR执行写操作 时,数据进入TDR;执行读操作时,数据来自RDR。
2.3 数据寄存器(USART_DR)详解

从官方参考手册中可以看到USART_DR的具体定义:
- 地址偏移:0x04
- 复位值:不确定
- 位8:0:DR8:0,可读可写(r/w),存放9位数据(当配置为8位数据模式时,有效位为DR7:0)
- 位31:9:保留位,硬件强制为0
这个寄存器是CPU与USART之间交换数据的唯一"窗口"。写它就是发数据,读它就是收数据。
三、数据发送过程详解
3.1 发送数据流程
假设CPU要通过USART发送一个字节的数据0x55(二进制0101 0101),整个硬件流程如下:

第一步:CPU写入数据
CPU通过APBx总线,将数据0x55写入USART_DR寄存器(地址偏移0x04)。由于是写操作,数据实际上进入了发送数据寄存器(TDR)。
第二步:数据从TDR转移到发送移位寄存器
硬件自动将TDR中的数据一次性并行转移到发送移位寄存器中。这个移位寄存器对用户是不可见的(没有独立的地址,CPU无法直接访问它)。
第三步:发送控制器逐位输出
发送控制器在波特率发生器提供的时钟驱动下,将发送移位寄存器中的数据逐位从TX引脚输出:
- 每个时钟周期,移位寄存器向右移动一位。
- 当前最低位被送到TX引脚。
- 所谓的"输出1",本质就是通过GPIO复用功能驱动PMOS管导通、NMOS管截止,使引脚输出高电平。
- 所谓的"输出0",本质就是驱动NMOS管导通、PMOS管截止,使引脚输出低电平。

第四步:完整波形输出
在TX引脚上,你会看到一串方波信号,高电平代表1,低电平代表0,按照发送顺序依次排列。
关键细节:时钟一直都在起作用,包括数据从APB总线迁移到发送移位寄存器的过程,只不过这个过程(并行转移)非常快,之前我们忽略了它。
3.2 LSB优先发送模式
这里有一个非常重要的概念------LSB(Least Significant Bit,最低有效位)优先。
以0x55为例:
0x55 的二进制表示:0101 0101
↑ ↑
MSB(位7) LSB(位0)
在默认的LSB发送模式下,最低位(最右边那位)最先被发送出去。所以实际在TX引脚上的发送顺序是:
发送顺序:1 → 0 → 1 → 0 → 1 → 0 → 1 → 0
(位0) (位1) (位2) (位3) (位4) (位5) (位6) (位7)
也就是1010 1010。
从发送方的角度看:"我发的顺序是10101010,因为默认就是LSB发送模式。"
从传输线上的角度看:"最右侧那位最先发出,也最先被接收。"
从接收方的角度看:"我收到的顺序也是10101010。"

接收方收到这8位数据后,按照LSB优先的规则重新组装:第一位放入位0,第二位放入位1......最终还原为0101 0101,也就是0x55。
四、数据接收过程详解
4.1 接收数据流程
接收过程是发送过程的逆操作,同样完全由硬件自主完成:
第一步:RX引脚检测电平变化
外部发送端的TX引脚输出的高低电平信号,通过导线连接到本地USART的RX引脚。RX引脚通过GPIO的复用功能输入通路,将电平信号送入接收控制器。
第二步:逐位移入接收移位寄存器
接收控制器在波特率发生器提供的接收器时钟驱动下,按照与发送端相同的波特率,逐位采样RX引脚上的电平:
- 每个时钟周期采样一次。
- 采样到的0或1被逐位移入接收移位寄存器。
- 接收移位寄存器同样对用户不可见。



第三步:完整字节转移到RDR
当接收移位寄存器中已经收集了完整的8位(或9位,取决于配置)数据后,硬件自动将这整个字节并行转移 到**接收数据寄存器(RDR)**中。

第四步:CPU读取数据
CPU检测到接收完成(通过SR寄存器中的RXNE标志位变为1),然后通过APBx总线读取USART_DR寄存器。由于是读操作,数据实际来自RDR。
4.2 硬件自主完成
整个接收过程中:
- CPU不需要参与每一个bit的采样和移位过程。
- CPU不需要参与移位寄存器到RDR的转移过程。
- 上述所有操作,USART模块硬件自主完成,无需人为干预。
CPU只需要在合适的时候去读取USART_DR寄存器,就能拿到完整的接收数据。
五、引脚物理层细节
5.1 高电平与低电平的本质
所谓串口输出"0"和"1",本质上就是GPIO引脚输出低电平 和高电平:
- 输出1:高电平(通常接近VDD,如3.3V)
- 输出0:低电平(接近GND,0V)
在TX引脚上,一串数据就表现为一段连续的高低电平交替的方波信号。
5.2 引脚内部保护电路
从GPIO引脚结构图可以看到,芯片引脚上还集成了保护二极管:
- 当引脚电压高于VDD时,上保护二极管导通,将多余电压泄放到VDD。
- 当引脚电压低于GND时,下保护二极管导通,将负电压泄放到GND。
这种设计可以防止静电(ESD)和过压信号损坏芯片内部的敏感电路。
5.3 收发双方的对称关系
串口通信是全双工的,意味着两个设备的TX和RX交叉连接:
设备A TX ──────────────> 设备B RX
设备A RX <────────────── 设备B TX
每个设备既是发送方也是接收方,各自拥有独立的USART模块,各自独立地完成发送和接收的硬件流程。两个方向的通信互不干扰,可以同时进行。
结语
