内核和芯片 F1系统架构

STM32F1 系统架构笔记版

一、整体理解

STM32F1 的系统架构可以理解为:

Cortex-M3 内核

ICode / DCode / System 总线

总线矩阵

AHB 主总线

APB1 / APB2 外设总线

GPIO、TIM、USART、ADC、SPI、I2C 等外设

一句话总结:

STM32F1 以 Cortex-M3 为核心,通过总线系统连接 Flash、SRAM、DMA 和各种外设。

二、主动单元和被动单元

  1. 主动单元

主动单元就是可以主动发起访问请求的模块。

主要包括:

Cortex-M3 内核

DMA1

DMA2

例如:

CPU 访问 GPIO 寄存器,控制 LED 亮灭。

DMA 自动把 ADC 或 USART 的数据搬到 SRAM。

  1. 被动单元

被动单元就是被访问的对象。

主要包括:

Flash

SRAM

FSMC

AHB 外设

APB1 外设

APB2 外设

比如 GPIO、USART、TIM 这些外设,本质上都是被 CPU 访问的寄存器。

三、Cortex-M3 的三条总线

  1. ICode 总线

作用:

读取程序指令

特点:

ICode 总线直接连接 Flash 接口

不需要经过总线矩阵

因为程序代码一般存放在 Flash 里面,CPU 执行程序时需要不断从 Flash 取指令。

  1. DCode 总线

作用:

读取数据、常量、调试信息等

例如程序中的一些常量数据,也可能通过 DCode 总线访问。

  1. 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

  1. AHB 总线

AHB 是 STM32F1 的高速主总线。

最大频率:

AHB:72MHz

主要连接:

内核

SRAM

DMA

FSMC

SDIO

RCC

可以理解为 STM32 内部的"主干道"。

  1. 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);

  1. 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 也是主动单元。

八、和写代码的关系

  1. 外设在哪条总线上,就开什么时钟

常见对应关系:

GPIOA / GPIOB / GPIOC → APB2

USART1 → APB2

TIM1 / TIM8 → APB2

TIM2 / TIM3 / TIM4 / TIM5 → APB1

USART2 / USART3 → APB1

I2C1 / I2C2 → APB1

SPI2 / SPI3 → APB1

  1. STM32 的外设本质是寄存器

例如:

GPIO_SetBits(GPIOB, GPIO_Pin_5);

本质是:

CPU 通过总线访问 GPIOB 的寄存器

把某一位写成 1

所以 STM32 的编程本质就是:

配置寄存器

控制外设

  1. 定时器、串口、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 打开对应的时钟。