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 │ └───────┘ └────────────┘架构设计思想
- 分层分级:高速模块挂高速总线,低速模块挂低速总线,避免低速外设拉低整体总线性能,同时降低功耗。
- 多总线并行:内核侧拆分指令、数据、系统三条独立总线,取指、访存、访问外设可以并行进行,提升总线带宽。
- 矩阵仲裁:多个总线主机(内核、DMA)可以同时访问不同从机,不会互相阻塞。
- 统一编址:所有内存、外设共用同一个 32 位地址空间,CPU 用相同的指令访问内存和外设。
二、内核侧:三条独立总线
Cortex-M3 内核本身引出三条独立的总线,分别负责不同功能,都属于 AHB 协议,接入 AHB 总线矩阵。
总线名称 方向 核心功能 访问对象 ICode 总线 内核→从机 取指令 只访问 Flash 程序存储器,读取指令码 DCode 总线 内核↔从机 读写常量数据 访问 Flash 中的常量、查表数据;也可访问 SRAM 系统总线(System) 内核↔从机 通用数据访问 访问 SRAM、外设寄存器、片上控制模块 设计意义
- 取指和数据访问走不同总线,取指不占数据带宽,典型的哈佛总线结构思想。
- 比如 CPU 执行指令的同时,可以用 DCode 总线读 Flash 里的查表数据,系统总线访问外设,三条总线并行工作。
哈佛总线结构
核心思想
程序存储器与数据存储器物理分开,拥有独立的程序总线、数据总线,指令和数据可以并行访问,取指令和读写数据可同时进行,提高执行效率。
对比冯‑诺依曼结构:指令、数据共用同一套存储器与总线,取指和数据访问只能串行,会发生总线冲突(冯诺依曼瓶颈)。
关键特点
- 存储空间分离 程序 ROM、数据 RAM 是两套独立物理存储器,地址空间相互独立,地址可以重叠。
- 两套独立总线
- 程序总线:传输指令、程序常数
- 数据总线:传输运算数据 可以同时取指令 + 读写数据,流水线效率高。
- 适合嵌入式 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. 矩阵核心能力
- 并发访问:不同主机同时访问不同从机时,矩阵可以同时接通,互不阻塞。 例:内核用 ICode 总线取 Flash 指令,同时 DMA 搬移 SRAM 里的数据,两者完全并行,不需要等待。
- 总线仲裁:多个主机同时访问同一个从机时,按优先级仲裁,高优先级先访问,低优先级等待。
- 地址译码:根据主机发出的地址,自动判断访问的是哪个从机,选通对应通路。
- 访问保护:支持存储器保护单元(MPU),限制非法地址访问。
四、高速主干:AHB 系统总线
AHB(Advanced High-performance Bus)是系统的高速主干总线,最高运行频率 72MHz(HCLK),挂载所有核心高速模块。
AHB 总线上的主要模块
模块 作用 基地址 内置 Flash 存储程序代码、常量数据 0x08000000内置 SRAM 运行内存、堆栈、变量 0x20000000RCC 时钟控制器 系统时钟、外设时钟控制 0x40021000DMA1 / DMA2 直接存储器访问控制器 0x40020000/0x40020400FLASH 接口 Flash 读写控制、预取缓冲 0x40022000CRC 校验单元 硬件 CRC 计算 0x40023000AHB-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 ~ 0x4001FFFF0x40000000 ~ 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 桥不只是简单的连线,核心做三件事:
- 协议转换:AHB 协议转 APB 协议,匹配两种总线的时序、信号定义。
- 时钟分频:APB1 桥做 2 分频,输出 36MHz 的 PCLK1 给低速外设。
- 总线缓冲:隔离高速总线和低速总线,避免低速外设拖慢 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为例,从代码到硬件引脚,总线层面完整走一遍:
- 内核执行指令 CPU 执行 STR 存储指令,把数值
0x0001写入地址0x4001080C(GPIOA_ODR 的地址),请求通过系统总线发出。- AHB 矩阵路由 地址和数据进入 AHB 总线矩阵,地址译码器识别出
0x4001080C属于 APB2 外设区间,把请求路由到 AHB-APB2 桥。- 总线桥转换 AHB-APB2 桥完成 AHB 协议到 APB 协议的转换,匹配时序和信号,把请求发到 APB2 总线上。
- APB2 外设译码 APB2 总线上的地址译码器进一步译码,识别出地址对应 GPIOA 端口,选通 GPIOA 外设。
- 寄存器写入 数据写入 GPIOA 的 ODR 输出数据寄存器,硬件电路根据 ODR 的值,更新输出驱动级的 MOS 管通断。
- 引脚电平变化 输出驱动电路驱动外部物理引脚,电平发生变化,LED 点亮/熄灭。
反过来,读 GPIO 输入电平就是逆过程:引脚电平→IDR 寄存器→APB2 总线→AHB 桥→系统总线→内核 CPU。
**🚩**高频面试考点
STM32F1 有哪几条总线?有什么区别?
内核侧有 ICode、DCode、系统三条总线;
系统级分为 AHB 高速主干总线、APB2 高速外设总线、APB1 低速外设总线。
AHB 最高 72MHz,挂载核心模块;
APB2 最高 72MHz,挂载 GPIO、SPI1 等高速外设;
APB1 最高 36MHz,挂载串口、定时器等低速外设。
GPIO 挂载在哪条总线上?为什么?
挂载在 APB2 高速外设总线上。
GPIO 需要高速翻转电平,对总线速度要求高,APB2 和 AHB 同频 72MHz,能满足性能需求。
操作外设之前为什么必须开启时钟?不开启会怎么样?
STM32 每个外设都有独立的时钟门控,默认关闭以降低功耗。
时钟关闭时外设电路不工作,无法响应总线读写,寄存器配置不生效,引脚无任何反应。
AHB 总线矩阵的作用是什么?
作为总线核心枢纽,连接所有总线主机和从机;
支持多主机并发访问不同从机,提升总线带宽;
负责地址译码、总线仲裁、访问保护。
什么是统一编址?总线层面怎么实现?
外设寄存器和内存共用同一个 32 位地址空间,CPU 用普通内存读写指令即可访问外设。
总线地址译码器根据地址范围自动选通对应的从机(内存/外设),硬件自动完成地址到设备的映射。
APB1 和 APB2 最高频率分别是多少?为什么不一样?
APB2 最高 72MHz,和 AHB 同频;
APB1 最高 36MHz,是 AHB 的 2 分频。
低速外设不需要高时钟,降频可以降低功耗和电磁干扰,也降低硬件设计难度


