一、Cortex‑M3内核:CPU核心

下图是STM32F1系列架构框图,包含了内核、总线矩阵、存储器、DMA、总线桥接、外设、时钟复位全部模块,理解这张图就能看懂STM32数据是怎么流动的。

左上角 Cortex‑M3,是ARM的32位内核,是整个芯片运算核心。

1. Cortex‑M3 内核的 3 条总线(内核输出)

① ICode(Instruction Code,指令总线)
  • 连接:内核 → Flash接口 → Flash,绕过总线矩阵,不经过总线矩阵仲裁。
  • 用途专门从Flash读取程序指令,**用来取程序指令(机器码),CPU 流水线预取指令全部走这条 VIP 专线。
  • 设计目的:硬件上把取指通路独立出来,不和数据访问抢总线带宽,取指不会被 DMA / 外设访问阻塞,保证流水线连续运行。
  • 限制不能访问 SRAM、外设寄存器,只能访问 Flash 的指令端口;常量const数据不走 ICode,走 DCode。
② DCode(Data Code,数据总线)
  • 连接:Cortex‑M3 → 接入总线矩阵
  • 用途:用于访问常量、读取/写入数据;访问Flash常量、SRAM变量、调试访问。
    1. 读取 Flash 里面的const常量;
    2. SRAM 读写(局部变量、栈);
    3. 调试访问,调试硬件断点也走DCode。;
  • 特点:AHB 总线,可以读、可以写;会参与总线矩阵的多主设备仲裁,会和 DMA 发生访问冲突。

关键点:M3采用哈佛架构,ICode和DCode是分开的,CPU可以一边取指令(ICode读Flash),一边读写数据(DCode),并行执行,提升效率。

③ System 总线(S‑Bus,系统总线)
  • 连接:Cortex‑M3 → 接入总线矩阵
  • 用途:内核访问所有片上外设(GPIO、USART、SPI、TIM 等等)的外设寄存器,经过 AHB‑APB 桥访问 APB 外设,CPU读写GPIO、USART、TIM等外设寄存器,全部走System总线。

区分 DCode 与 System:

  • DCode:偏向存储器访问(SRAM、Flash 数据区)
  • System:偏向片上外设寄存器访问。

2. DMA 总线(非内核输出,独立主设备)

DMA1/DMA2 本身是独立的总线主设备,它自己输出一条 DMA 总线,接入总线矩阵,和内核的 DCode、System,三者一起竞争总线矩阵的访问权。

  • DMA 不需要 CPU 介入,自己作为主机,发起对 SRAM、外设寄存器的读写;
  • 总线矩阵会做轮询仲裁:当 CPU (DCode/System) 和 DMA 同时访问同一个从设备(比如 SRAM),轮流分配总线,防止总线死锁。

二、总线矩阵(Bus Matrix)

总线矩阵是整个芯片的交通枢纽,本质是一个多路仲裁器

  • 输入(主设备):Cortex‑M3的2条总线、DMA1、DMA2;这些是发起数据读写的主人
  • 输出(从设备):Flash接口、SRAM、FSMC、SDIO、AHB外设;这些是被访问的对象。

作用:当多个主设备同时要访问同一个从设备(比如CPU和DMA同时读SRAM),总线矩阵做总线仲裁,分配优先级,避免数据冲突。

三、存储器部分

1. Flash + Flash接口

  • Flash:片内闪存,存放程序代码、const常量,掉电数据不丢失。
  • Flash接口:Flash的控制器,ICode/DCode都经过它访问Flash。CPU跑固件,就是ICode总线通过Flash接口取指令。

2. SRAM

片内静态随机存储器,运行时内存:存放局部变量、全局变量、栈、堆;掉电全部丢失。
CPU通过DCode读写SRAM;DMA也可以读写SRAM,实现内存搬运。

3. FSMC(灵活静态存储控制器)

FSMC接到总线矩阵,是外部存储器控制器,用来外接SRAM、NOR‑Flash、LCD屏幕。STM32驱动8080接口LCD就是用FSMC。

4. SDIO

SD卡控制器,接SD卡、MMC卡,属于AHB高速外设。

四、DMA1、DMA2(直接存储器访问)

左边两个模块DMA1、DMA2。

DMA核心意义:不占用CPU,硬件自动搬运数据,CPU不用介入数据拷贝,解放内核做别的运算。

  1. DMA请求线:图里的DMA请求箭头,来自各个外设(ADC、USART、SPI等)。
    • 例如串口收到1字节,外设发出DMA请求,DMA直接把字节搬到SRAM,不用CPU进中断读取。
  2. DMA也是总线矩阵的主设备,可以主动发起读写:内存↔外设、内存↔内存搬运。
  3. DMA1:7个通道;DMA2:5个通道(大容量F1才有DMA2,中容量只有DMA1),不同外设硬件绑定固定DMA通道。

数据流例子:USART接收寄存器 → DMA请求 → DMA控制器 → 总线矩阵 → SRAM,全程CPU不用干预。

五、AHB系统总线 + 复位和时钟控制RCC

  1. AHB系统总线:先进高性能总线,总线矩阵向下输出到AHB总线。高速外设挂在AHB上:RCC、SDIO。
  2. RCC(复位和时钟控制),框图中间。整个芯片的心脏
    • 控制各个外设时钟开关,哪个外设要工作,就打开对应时钟;不打开时钟外设完全不工作。
    • 系统时钟配置:HSE、HSI、PLL,配置CPU主频。
    • 控制外设复位。
  3. STM32写代码注意不要忘记开启外设时钟,寄存器会读写无效。

六、桥接1、桥接2(AHB‑APB桥)

AHB是高速总线,为先进高性能总线,APB是低速外设总线,为先进外设总线。
AHB和APB协议不一样,需要桥接器做协议转换,相当于“高速主干道转低速辅路”。

  1. 桥接1 → APB1总线: APB1是低速外设总线,最大时钟36MHz。 APB1外设:TIM2‑TIM7、USART2‑5、SPI2/I2S2、I2C1 I2C2、CAN、RTC、WWDG、PWR。
  2. 桥接2 → APB2总线: APB2外设,最大72MHz,速度更高。 APB2外设:TIM1、TIM8、USART1、SPI1、ADC1‑3、GPIOA‑G、AFIO、EXTI。

为什么要分APB1/APB2?部分外设最高时钟受限,APB1时钟不能超过36M。

七、APB1 / APB2挂载外设(框图右下角)

APB2外设(高速,72MHz)

  • GPIOA/GPIOB/GPIOC…GPIO:通用IO口
  • AFIO:复用功能IO控制器,引脚重映射
  • EXTI:外部中断控制器
  • ADC1/2/3:模数转换器
  • TIM1、TIM8:高级定时器
  • USART1、SPI1

APB1外设(低速,36MHz)

  • TIM2‑TIM7通用定时器
  • USART2/3/4/5;SPI2;I2C1 I2C2;bxCAN;RTC;DAC;PWR电源控制;WWDG独立看门狗等。

八、数据流过程

例1:CPU执行代码

  1. CPU(Cortex‑M3) 通过 ICode总线 →总线矩阵→Flash接口→Flash读取指令。
  2. 指令如果操作变量:DCode读写SRAM。
  3. 指令操作GPIO:System总线 →总线矩阵→AHB→桥接2→APB2→GPIO寄存器。

例2:DMA搬运串口接收数据

  1. USART收到字节,发出DMA请求信号给到DMA控制器。
  2. DMA作为总线矩阵主设备,接管总线。
  3. DMA读USART数据寄存器(APB1→桥接1→AHB→总线矩阵)
  4. DMA把数据写入SRAM(总线矩阵→SRAM)。
  5. 写入过程CPU完全不参与。

九、相关问题总结

  1. Cortex‑M3有哪几条总线?ICode(取指令)、DCode(数据)、System(外设寄存器)、DMA总线。
  2. 总线矩阵作用:多主设备总线仲裁,管理CPU、DMA访问冲突。
  3. APB1、APB2区别:最高时钟不同,挂载外设不同。
  4. DMA怎么工作:外设发DMA请求,DMA作为总线主设备,绕过CPU搬运数据。
  5. ICode只能读Flash,指令从Flash取;SRAM放运行变量。
  6. RCC位置:AHB总线,所有外设时钟由RCC控制。
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐