STM32 USART 详解(三):硬件架构、内部寄存器与物理层收发原理

目录

  • 前言
  • 一、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)分层连接的。

具体层级结构如下:

  1. AHB系统总线(Advanced High-performance Bus):这是高速总线,连接着DMA控制器、RCC(复位和时钟控制模块)、FSMC等高速设备。
  2. 桥接1(Bridge 1)→ APB1:APB1是低速外设总线,上面挂载了USART2、USART3、UART4、UART5、TIM2~TIM7、I2C1/I2C2、SPI2/SPI3、USB、CAN、RTC、IWDG、WWDG等外设。
  3. 桥接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要做的只是:

  1. 把要发送的数据写入USART的指定寄存器。
  2. 从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模块,各自独立地完成发送和接收的硬件流程。两个方向的通信互不干扰,可以同时进行。


结语

相关推荐
天空'之城2 小时前
单片机基础核心知识点汇总(三十三)
数据库·单片机·嵌入式硬件
数字新视界4 小时前
机房动环监控的智能化管理与安全提升探索
嵌入式硬件·物联网·数据中心·数据中心基础设施管理·dcim管理系统
@嵌入式扫地僧5 小时前
TFLite Micro STM32/ESP32 开箱即用推理骨架 + INT8 量化脚本实战:零调试跑通端侧 AI 推理完整步骤
人工智能·嵌入式硬件·tinyml·端侧ai·tflite micro
自小吃多5 小时前
高云FPGA ModelSim中的仿真
笔记·嵌入式硬件·fpga开发
单片机仿真设计6 小时前
基于 STM32 的家庭环境监测与火灾报警灭火系统(Proteus 仿真)
stm32·单片机·嵌入式硬件·proteus·毕设
深圳市恒锐丰科技杨生6 小时前
EG4321 锂电池 CC‑CV 充电管理控制器|屹晶 EGmicro
嵌入式硬件·硬件工程
辰域电子6 小时前
STM32项目开源:智能万年历/智能闹钟设计(代码+原理图+仿真)
stm32·单片机·嵌入式硬件·开源·proteus
一条破秋裤7 小时前
STM32F103 RCC 第一层复习:时钟树、外设时钟与重复测试
stm32·单片机·嵌入式硬件
Kuakewei8888 小时前
PD/QC快充协议诱骗芯片设计手册:Type-C受电端完整应用方案
嵌入式硬件