STM32F1 系统架构笔记版
一、整体理解
STM32F1 的系统架构可以理解为:
Cortex-M3 内核
↓
ICode / DCode / System 总线
↓
总线矩阵
↓
AHB 主总线
↓
APB1 / APB2 外设总线
↓
GPIO、TIM、USART、ADC、SPI、I2C 等外设
一句话总结:
STM32F1 以 Cortex-M3 为核心,通过总线系统连接 Flash、SRAM、DMA 和各种外设。
二、主动单元和被动单元
- 主动单元
主动单元就是可以主动发起访问请求的模块。
主要包括:
Cortex-M3 内核
DMA1
DMA2
例如:
CPU 访问 GPIO 寄存器,控制 LED 亮灭。
DMA 自动把 ADC 或 USART 的数据搬到 SRAM。
- 被动单元
被动单元就是被访问的对象。
主要包括:
Flash
SRAM
FSMC
AHB 外设
APB1 外设
APB2 外设
比如 GPIO、USART、TIM 这些外设,本质上都是被 CPU 访问的寄存器。
三、Cortex-M3 的三条总线
- ICode 总线
作用:
读取程序指令
特点:
ICode 总线直接连接 Flash 接口
不需要经过总线矩阵
因为程序代码一般存放在 Flash 里面,CPU 执行程序时需要不断从 Flash 取指令。
- DCode 总线
作用:
读取数据、常量、调试信息等
例如程序中的一些常量数据,也可能通过 DCode 总线访问。
- System 总线
作用:
访问 SRAM 和外设寄存器
例如:
GPIO_SetBits(GPIOB, GPIO_Pin_5);
本质就是 CPU 通过 System 总线访问 GPIOB 的寄存器。
四、总线矩阵
总线矩阵可以理解成一个交通枢纽。
它的作用是:
协调 CPU、DMA 对 Flash、SRAM、外设的访问
比如:
CPU 访问 SRAM
DMA 访问 SRAM
CPU 访问 GPIO
DMA 搬运 USART 数据
这些访问都需要通过总线矩阵进行协调。
五、AHB、APB1、APB2
- AHB 总线
AHB 是 STM32F1 的高速主总线。
最大频率:
AHB:72MHz
主要连接:
内核
SRAM
DMA
FSMC
SDIO
RCC
可以理解为 STM32 内部的"主干道"。
- APB1 总线
APB1 是低速外设总线。
最大频率:
APB1:36MHz
常见外设:
TIM2、TIM3、TIM4、TIM5
USART2、USART3
UART4、UART5
I2C1、I2C2
SPI2、SPI3
CAN
USB
DAC
PWR
BKP
例如 TIM3 挂在 APB1 上,所以使用 TIM3 时要开 APB1 时钟:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- APB2 总线
APB2 是高速外设总线。
最大频率:
APB2:72MHz
常见外设:
GPIOA、GPIOB、GPIOC、GPIOD、GPIOE
AFIO
USART1
SPI1
ADC1、ADC2
TIM1、TIM8
例如 GPIOB 挂在 APB2 上,所以使用 GPIOB 时要开 APB2 时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
USART1 也挂在 APB2 上:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
六、为什么要开外设时钟?
STM32 为了省电,很多外设默认时钟是关闭的。
所以使用外设前,必须先打开对应外设的时钟。
例如:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
如果不开时钟:
GPIO 配置无效
外设寄存器不能正常工作
程序看起来没报错,但硬件没有反应
所以写 STM32 程序时,一般第一步就是:
先开时钟,再初始化 GPIO 或外设
七、DMA 的作用
DMA 全称:
Direct Memory Access
直接存储器访问
作用:
不经过 CPU,自动搬运数据
常见用途:
ADC → DMA → SRAM
USART → DMA → SRAM
SRAM → USART
好处:
减轻 CPU 负担
提高数据传输效率
适合大量数据搬运
所以 DMA1、DMA2 也是主动单元。
八、和写代码的关系
- 外设在哪条总线上,就开什么时钟
常见对应关系:
GPIOA / GPIOB / GPIOC → APB2
USART1 → APB2
TIM1 / TIM8 → APB2
TIM2 / TIM3 / TIM4 / TIM5 → APB1
USART2 / USART3 → APB1
I2C1 / I2C2 → APB1
SPI2 / SPI3 → APB1
- STM32 的外设本质是寄存器
例如:
GPIO_SetBits(GPIOB, GPIO_Pin_5);
本质是:
CPU 通过总线访问 GPIOB 的寄存器
把某一位写成 1
所以 STM32 的编程本质就是:
配置寄存器
控制外设
- 定时器、串口、ADC 都和时钟有关
例如你用 TIM3 产生 PWM:
TIM3_PWM_Init(7199, 1);
TIM3 挂在 APB1 上,所以它的工作频率和 APB1 时钟有关。
因此学习系统架构,是为了理解:
为什么要开 RCC 时钟
为什么 TIM3 用 APB1
为什么 GPIOB 用 APB2
为什么 USART1 和 USART2 时钟不一样
为什么 DMA 可以自动搬数据
九、重点记忆
总线频率
AHB :72MHz 最大
APB1 :36MHz 最大
APB2 :72MHz 最大
主动单元
Cortex-M3
DMA1
DMA2
被动单元
Flash
SRAM
GPIO
USART
TIM
ADC
SPI
I2C
常用外设总线归属
GPIO → APB2
USART1 → APB2
TIM1 / TIM8 → APB2
TIM2 / TIM3 / TIM4 → APB1
USART2 / USART3 → APB1
I2C1 / I2C2 → APB1
SPI2 / SPI3 → APB1
十、最终精简版
STM32F1 采用 Cortex-M3 内核,CPU 通过 ICode、DCode、System 总线访问 Flash、SRAM 和外设。系统中 CPU、DMA 属于主动单元,Flash、SRAM 和各种外设属于被动单元。AHB 是高速主总线,最高 72MHz;APB1 是低速外设总线,最高 36MHz;APB2 是高速外设总线,最高 72MHz。GPIO、USART、TIM、ADC 等外设挂在不同总线上,因此使用外设前必须通过 RCC 打开对应的时钟。