【STM32】 深度详解总线架构 哈佛总线结构


STM32F1 总线架构 深度详解

STM32F1 基于 Cortex-M3 内核,采用多层分级总线架构:以 AHB 总线矩阵为核心枢纽,高速主干 AHB 总线向下通过桥接器分出 APB1、APB2 两条外设总线,外设按速度等级分级挂载,配合统一编址与时钟门控机制,兼顾性能、功耗与编程简洁性。

一、整体架构总览

复制代码
┌────────────────────── Cortex-M3 内核 ──────────────────────┐
│  ICode总线    │    DCode总线    │      系统总线(System)       │  内核侧3条独立总线
└───────┬───────┴────────┬───────┴─────────────┬──────────────┘
        │                │                     │
┌───────▼────────────────▼─────────────────────▼──────────────┐
│                     AHB 总线矩阵                          │  核心仲裁枢纽
│  (支持多主机并发访问、总线仲裁、访问保护)                │
└───┬──────────┬───────────┬─────────────┬───────────────┘
    │          │           │             │
  Flash      SRAM      DMA控制器    AHB-APB 桥接器
  指令       数据       数据搬运      高速桥 ↓ 低速桥
                                        │       │
                                    APB2总线  APB1总线
                                  最高72MHz  最高36MHz
                                        │       │
                                ┌───┴───┐ ┌─┴──────────┐
                                │高速外设│ │低速外设     │
                                │GPIOx  │ │USART2/3   │
                                │USART1 │ │SPI2       │
                                │SPI1   │ │I2C1/2     │
                                │ADC    │ │TIM2~7     │
                                │AFIO   │ │看门狗/BKP  │
                                └───────┘ └────────────┘

架构设计思想

  1. 分层分级:高速模块挂高速总线,低速模块挂低速总线,避免低速外设拉低整体总线性能,同时降低功耗。
  2. 多总线并行:内核侧拆分指令、数据、系统三条独立总线,取指、访存、访问外设可以并行进行,提升总线带宽。
  3. 矩阵仲裁:多个总线主机(内核、DMA)可以同时访问不同从机,不会互相阻塞。
  4. 统一编址:所有内存、外设共用同一个 32 位地址空间,CPU 用相同的指令访问内存和外设。

二、内核侧:三条独立总线

Cortex-M3 内核本身引出三条独立的总线,分别负责不同功能,都属于 AHB 协议,接入 AHB 总线矩阵。

总线名称 方向 核心功能 访问对象
ICode 总线 内核→从机 取指令 只访问 Flash 程序存储器,读取指令码
DCode 总线 内核↔从机 读写常量数据 访问 Flash 中的常量、查表数据;也可访问 SRAM
系统总线(System) 内核↔从机 通用数据访问 访问 SRAM、外设寄存器、片上控制模块

设计意义

  • 取指和数据访问走不同总线,取指不占数据带宽,典型的哈佛总线结构思想。
  • 比如 CPU 执行指令的同时,可以用 DCode 总线读 Flash 里的查表数据,系统总线访问外设,三条总线并行工作。

哈佛总线结构

核心思想

程序存储器与数据存储器物理分开,拥有独立的程序总线、数据总线,指令和数据可以并行访问,取指令和读写数据可同时进行,提高执行效率。

对比冯‑诺依曼结构:指令、数据共用同一套存储器与总线,取指和数据访问只能串行,会发生总线冲突(冯诺依曼瓶颈)。

关键特点

  1. 存储空间分离 程序 ROM、数据 RAM 是两套独立物理存储器,地址空间相互独立,地址可以重叠。
  2. 两套独立总线
  • 程序总线:传输指令、程序常数
  • 数据总线:传输运算数据 可以同时取指令 + 读写数据,流水线效率高。
  1. 适合嵌入式 MCU、DSP(STM32、51 单片机就是哈佛结构)

简单例子

CPU 一个时钟周期:

  • 程序总线:从程序存储器取出下一条指令
  • 数据总线:同时完成运算数的读 / 写

冯诺依曼同一时刻只能做其中一件。

改进:改良哈佛结构

现代 MCU 大多使用改良哈佛结构:

  • 指令、数据存储器物理分离;
  • 数据总线可访问程序空间,支持在程序 ROM 中读取常量(查表)。

对比速记

冯‑诺依曼 哈佛
存储器 指令数据共用 指令、数据物理分开
总线 单套总线 独立程序、数据总线
访问 串行,取指访存互抢总线 并行,可同时取指 + 读写数据
代表 x86 PC 51 单片机、DSP、STM32

考点简答版:

哈佛结构的核心思想是将程序存储器和数据存储器在物理上分开,设置独立的程序总线和数据总线,实现取指令和访问数据并行操作,克服冯诺依曼瓶颈,提升运行速度。


三、核心枢纽:AHB 总线矩阵

AHB 总线矩阵是整个系统的交通枢纽,负责连接所有总线主机和总线从机,完成地址译码、总线仲裁、访问保护。

1. 总线主机(Master)

可以主动发起总线读写请求的单元:

  • Cortex-M3 内核(通过 ICode、DCode、系统总线)
  • DMA1 控制器、DMA2 控制器

2. 总线从机(Slave)

被动响应读写请求的单元:

  • Flash 存储器、SRAM 存储器
  • AHB 外设(RCC、FLASH 接口、CRC 等)
  • AHB-APB1 桥、AHB-APB2 桥(背后是 APB 外设)
  • FSMC 静态存储控制器

3. 矩阵核心能力

  1. 并发访问:不同主机同时访问不同从机时,矩阵可以同时接通,互不阻塞。 例:内核用 ICode 总线取 Flash 指令,同时 DMA 搬移 SRAM 里的数据,两者完全并行,不需要等待。
  2. 总线仲裁:多个主机同时访问同一个从机时,按优先级仲裁,高优先级先访问,低优先级等待。
  3. 地址译码:根据主机发出的地址,自动判断访问的是哪个从机,选通对应通路。
  4. 访问保护:支持存储器保护单元(MPU),限制非法地址访问。

四、高速主干:AHB 系统总线

AHB(Advanced High-performance Bus)是系统的高速主干总线,最高运行频率 72MHz(HCLK),挂载所有核心高速模块。

AHB 总线上的主要模块

模块 作用 基地址
内置 Flash 存储程序代码、常量数据 0x08000000
内置 SRAM 运行内存、堆栈、变量 0x20000000
RCC 时钟控制器 系统时钟、外设时钟控制 0x40021000
DMA1 / DMA2 直接存储器访问控制器 0x40020000 / 0x40020400
FLASH 接口 Flash 读写控制、预取缓冲 0x40022000
CRC 校验单元 硬件 CRC 计算 0x40023000
AHB-APB2 桥 AHB 转 APB2 高速外设总线 -
AHB-APB1 桥 AHB 转 APB1 低速外设总线 -

注意:

所有 GPIO 端口不在 AHB 总线上,而是挂载在 APB2 外设总线上,通过 AHB-APB2 桥和 AHB 总线通信。


五、外设分支:APB1 与 APB2 总线

APB(Advanced Peripheral Bus)是专门的外设总线,通过 AHB-APB 桥从 AHB 总线扩展而来,分为高速 APB2 和低速 APB1,外设按速度分级挂载。

两条 APB 总线核心对比

维度 APB2 高速外设总线 APB1 低速外设总线
最高时钟 72MHz(PCLK2,和 AHB 同频,不分频) 36MHz(PCLK1,AHB 2 分频)
设计定位 高速外设、需要快速响应的外设 低速外设、对速度不敏感的外设
地址区间 0x40010000 ~ 0x4001FFFF 0x40000000 ~ 0x4000FFFF
核心外设 所有 GPIO 端口、USART1、SPI1、ADC1/2、AFIO、EXTI USART2/3、SPI2、I2C1/2、TIM2~TIM7、看门狗、BKP、PWR

为什么 GPIO 挂在 APB2 上?

GPIO 常常需要高速翻转输出电平、快速读取引脚状态,对总线速度要求高;APB2 是高速外设总线,和 AHB 同频 72MHz,能满足 GPIO 高速翻转的性能需求。


关于 APB 桥

AHB-APB 桥不只是简单的连线,核心做三件事:

  1. 协议转换:AHB 协议转 APB 协议,匹配两种总线的时序、信号定义。
  2. 时钟分频:APB1 桥做 2 分频,输出 36MHz 的 PCLK1 给低速外设。
  3. 总线缓冲:隔离高速总线和低速总线,避免低速外设拖慢 AHB 总线。

六、关键机制:地址译码与时钟门控

1. 地址译码:统一编址的硬件实现

CPU 发出一个 32 位地址后,总线矩阵里的地址译码器会按地址范围判断目标设备:

  • 地址落在 0x080xxxxx → 选通 Flash
  • 地址落在 0x200xxxxx → 选通 SRAM
  • 地址落在 0x4001xxxx → 路由到 APB2 总线,APB2 再译码选中具体外设
  • 地址落在 0x4000xxxx → 路由到 APB1 总线

这就是统一编址的硬件本质:不需要专门的 IO 指令,CPU 只需要发地址,硬件自动根据地址选通对应的从机,读写内存和读写外设用完全相同的指令。


2. 时钟门控:低功耗的核心,也是「必须开时钟」的根源

什么是时钟门控

每个外设的时钟输入都有一个独立的开关(门控),默认全部关闭,软件通过 RCC 寄存器控制开关。时钟关闭时,外设内部电路完全不工作,寄存器无法读写,引脚也不工作。


为什么要这么设计

STM32 是单片机,主打低功耗。绝大多数外设不是每时每刻都在用,不用的时候关掉时钟,可以大幅降低芯片功耗。


和总线的关系
  • 时钟是外设工作的动力,没有时钟,外设电路无法响应总线读写请求。
  • 你写 GPIOA->ODR = 1,总线把数据送到 GPIOA 门口,但 GPIOA 时钟没开,电路不工作,数据写不进去,引脚也没反应。
  • 这就是「操作任何外设之前,必须先开启对应总线的外设时钟」的硬件底层原因。

对应寄存器
  • APB2 外设时钟:RCC_APB2ENR 寄存器,每一位对应一个外设的时钟开关
    • 第 2 位:GPIOA 时钟使能
    • 第 3 位:GPIOB 时钟使能
  • APB1 外设时钟:RCC_APB1ENR 寄存器

七、一次 GPIO 写操作的完整总线流程

以执行 GPIOA->ODR = 0x0001 为例,从代码到硬件引脚,总线层面完整走一遍:

  1. 内核执行指令 CPU 执行 STR 存储指令,把数值 0x0001 写入地址 0x4001080C(GPIOA_ODR 的地址),请求通过系统总线发出。
  2. AHB 矩阵路由 地址和数据进入 AHB 总线矩阵,地址译码器识别出 0x4001080C 属于 APB2 外设区间,把请求路由到 AHB-APB2 桥。
  3. 总线桥转换 AHB-APB2 桥完成 AHB 协议到 APB 协议的转换,匹配时序和信号,把请求发到 APB2 总线上。
  4. APB2 外设译码 APB2 总线上的地址译码器进一步译码,识别出地址对应 GPIOA 端口,选通 GPIOA 外设。
  5. 寄存器写入 数据写入 GPIOA 的 ODR 输出数据寄存器,硬件电路根据 ODR 的值,更新输出驱动级的 MOS 管通断。
  6. 引脚电平变化 输出驱动电路驱动外部物理引脚,电平发生变化,LED 点亮/熄灭。

反过来,读 GPIO 输入电平就是逆过程:引脚电平→IDR 寄存器→APB2 总线→AHB 桥→系统总线→内核 CPU。


**🚩**高频面试考点

  1. STM32F1 有哪几条总线?有什么区别?

    内核侧有 ICode、DCode、系统三条总线;

    系统级分为 AHB 高速主干总线、APB2 高速外设总线、APB1 低速外设总线。

    AHB 最高 72MHz,挂载核心模块;

    APB2 最高 72MHz,挂载 GPIO、SPI1 等高速外设;

    APB1 最高 36MHz,挂载串口、定时器等低速外设。

  2. GPIO 挂载在哪条总线上?为什么?

    挂载在 APB2 高速外设总线上。

    GPIO 需要高速翻转电平,对总线速度要求高,APB2 和 AHB 同频 72MHz,能满足性能需求。

  3. 操作外设之前为什么必须开启时钟?不开启会怎么样?

    STM32 每个外设都有独立的时钟门控,默认关闭以降低功耗。

    时钟关闭时外设电路不工作,无法响应总线读写,寄存器配置不生效,引脚无任何反应。

  4. AHB 总线矩阵的作用是什么?

    作为总线核心枢纽,连接所有总线主机和从机;

    支持多主机并发访问不同从机,提升总线带宽;

    负责地址译码、总线仲裁、访问保护。

  5. 什么是统一编址?总线层面怎么实现?

    外设寄存器和内存共用同一个 32 位地址空间,CPU 用普通内存读写指令即可访问外设。

    总线地址译码器根据地址范围自动选通对应的从机(内存/外设),硬件自动完成地址到设备的映射。

  6. APB1 和 APB2 最高频率分别是多少?为什么不一样?

    APB2 最高 72MHz,和 AHB 同频;

    APB1 最高 36MHz,是 AHB 的 2 分频。

    低速外设不需要高时钟,降频可以降低功耗和电磁干扰,也降低硬件设计难度


相关推荐
恶魔泡泡糖41 分钟前
stm32F103C8T6标准库DWT应用DHT11温湿度传感器数据手册说明
stm32·单片机·嵌入式硬件
深圳市恒锐丰科技杨生44 分钟前
EG1192S 10‑100V 高压集成上管降压 DC‑DC|零功耗使能 Buck 电源芯片
嵌入式硬件·硬件工程
单片机仿真设计1 小时前
【Proteus 仿真】基于 STM32 单片机鸡舍环境监控系统设计(仿真 + 源码)
stm32·单片机·嵌入式硬件·proteus·毕设
风123456789~1 小时前
【架构专栏】第5章 软件工程基础知识 1/3
架构
姚不倒1 小时前
HAProxy 系列(四):多中间件统一 VIP 入口 — 架构模式与最佳实践
运维·中间件·架构·haproxy
阿拉斯攀登2 小时前
SpringBoot核心原理:自动配置、starter、SPI机制
架构
李永奉2 小时前
中科蓝讯SDK开发-提示音音频文件格式转换和压缩教程
网络·单片机·嵌入式硬件·mcu·物联网
阿拉斯攀登2 小时前
Web核心开发:拦截器、过滤器、跨域、统一返回
架构
春风解人意2 小时前
从零开始学习嵌入式P35----数据库
数据库·嵌入式硬件·学习