1. 总线
1.1 总线概念
总线 = 芯片内部各个模块之间"传输数据的公共通道"
CPU 通过总线:
- 读外设寄存器
- 写外设寄存器
- 访问 Flash / SRAM
1.2 多种总线
为什么 STM32 要有"多种总线"?
如果 所有模块都挤在一条总线上:
- 速度慢
- 冲突多
- 功耗高
所以 STM32 把不同"速度 / 功能"的模块放在不同等级的总线上。
这就是你在数据手册里看到的:AHB / APB1 / APB2 ...
1.3 STM32 常见的几种总线
(1)AHB(Advanced High-performance Bus)
特点:高速、主干总线
一般连接:
- CPU(Cortex-M)
- Flash
- SRAM
- DMA
- 总线桥(APB Bridge)
(2)APB(Advanced Peripheral Bus)
特点:低速、简单、省功耗
分成两条(以 STM32F1/F4 为例):
| 总线 | 典型外设 |
|---|---|
| APB1 | USART2/3、I2C、SPI2、TIM2~7 |
| APB2 | GPIO、USART1、SPI1、TIM1 |
结构可以表示为:
javascript
CPU
|
AHB ← 高速主干
┌────┼────┐
Flash SRAM DMA
|
APB Bridge
┌──────┬──────┐
APB1 APB2
(低速外设) (高速外设)
1.4 写代码时"总线很重要"
例如:外设挂在哪条总线 → 决定时钟怎么开
你一定会写过:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
为什么是 APB2?
👉 因为 GPIOA 在 APB2 总线上
如果你写错成 APB1:
1、编译不报错
2、程序不工作
1.5 总线频率 ≠ CPU 频率
例如:
java
CPU:72 MHz
APB1:36 MHz(通常被限制为 ≤36MHz)
APB2:72 MHz
这会影响:
1、定时器计数频率
2、串口波特率
3、I2C 时序
1.6 总线矩阵
总线矩阵 = 芯片内部的"智能交通枢纽"
负责:谁可以同时访问谁、走哪条路、不互相堵车
结构上,总线矩阵 = 多个"主设备(Master)"可以 并行访问多个"从设备(Slave)"。
1.6.1 Master 与 Slave
Master(发起访问的一方)
- CPU(Cortex-M)
- DMA
- USB / Ethernet(高级芯片)
Slave(被访问的一方)
- Flash
- SRAM
- 外设寄存器
- APB Bridge
当两个 Master 访问同一个 Slave
javascript
CPU ─┐
├── SRAM
DMA ─┘
这时:
- 总线矩阵会 仲裁(Arbitration)
- 一方等,一方先走
现象:
- DMA 传输变慢
- CPU 延迟增大
1.6.2 总线矩阵 vs AHB / APB 的关系
| 概念 | 是什么 |
|---|---|
| AHB / APB | "道路等级" |
| 总线矩阵 | "交通调度系统" |
1.7 APB Bridge
APB Bridge是总线之间的"中转站"。
1.7.1 APB Bridge在系统中的位置
javascript
CPU / DMA
│
AHB ← 高速
│
┌───▼─────────┐
│ APB Bridge │ ← 关键角色
└───▲─────────┘
│
APB1 / APB2 ← 低速
│
GPIO / TIM / USART
1.7.2 APB Bridge的作用
①协议转换
APB Bridge 把 AHB 的访问"翻译"为 APB 能懂的访问;
②时钟域隔离
AHB:高频(如 72MHz)
APB1:低频(如 36MHz)
👉 Bridge 会:
等 APB 空闲
再慢慢完成一次访问
📌 此时就会感觉:"访问外设比访问 SRAM 慢"。
③地址解码 + 分发
CPU 只发地址:eg:0x4001 100C
APB Bridge 会判断:
- 属于 APB1?还是 APB2?
- 转给 GPIO 还是 TIM?
Bridge 永远存在、自动工作,不用"配置"它。
2、EEPROM、SPI FLASH、EMMC
EEPROM / SPI Flash / eMMC 本质上都属于**"非易失性存储器"。
2.1 EEPROM
2.1.1 概念
EEPROM用来存"小量、经常改、很重要"的数据;
典型用途:
- 设备参数(ID、地址、校准值)
- 用户配置
- 掉电要保存的状态
📌 特点:
- 断电不丢
- 写得慢
- 容量小
- 可单字节读写
2.1.2 分类
在 STM32 里,有芯片内部 EEPROM,外部 EEPROM(最常见)。
✔ 情况 1:芯片内部 EEPROM(部分 STM32 有,如 STM32L 系列)
- 像 RAM 一样访问
- 容量很小(几 KB)
✔ 情况 2:外部 EEPROM(最常见)
- 芯片:AT24C02 / 24C04
- 接口:I2C
- 容量:256B ~ 几十 KB
使用时:STM32 ──I2C── EEPROM。
✔ 情况 3:用 Flash 模拟 EEPROM(很多 STM32F1 都是这样)
- 用 Flash 的一小块
- 软件实现"擦写管理"
2.1.3 EEPROM的特性
| 特性 | 说明 |
|---|---|
| 写入方式 | 可以按字节 |
| 写入速度 | 很慢 |
| 擦写寿命 | 10 万~100 万次 |
3、SPI Flash
3.1 概念
用来存"较大量数据,不经常改"。
典型用途:
- 数据日志(CSV)
- 波形数据
- 图片 / 字库
- 固件升级包
常见芯片:W25Q16 / W25Q64 / W25Q128
容量:2MB / 8MB / 16MB / 128MB(常见)
3.2 SPI Flash特性
| 特性 | 说明 |
|---|---|
| 最小写单位 | Page(256B) |
| 最小擦除 | Sector(4KB) |
| 写前必须擦 | 是 |
| 擦写寿命 | ~10 万次 |
注意:
1、不能像 EEPROM 那样随便改一个字节
2、 必须"擦一整块再写"
4、eMMC
4.1 概念
用来存"超大量数据 + 文件系统 + 操作系统",是一个一个"自带管理芯片的 Flash 硬盘"。
典型用途:
- Linux 开发板
- 工控机
- 树莓派 / 飞思卡尔 / 瑞芯微
- 不常见于"裸机 STM32"
使用复杂度
- 项目 eMMC
- 接口 SDIO / MMC
- 是否要文件系统 是
- 是否适合裸机 ❌
📌 一般 STM32 + 裸机 / RTOS 很少直接用 eMMC。
4.2 EEPROM、SPI FLASH、EMMC对比
| 项目 | EEPROM | SPI Flash | eMMC |
|---|---|---|---|
| 容量 | 很小 | 中等 | 很大 |
| 接口 | I2C | SPI / QSPI | SDIO |
| 是否可字节写 | ✔ | ❌ | ❌ |
| 是否常改 | ✔ | ❌ | ❌ |
| 是否跑系统 | ❌ | ❌ | ✔ |
总结:
- EEPROM:小、慢、常改,存参数
- SPI Flash:大、块擦、少改,存数据
- eMMC:超大、复杂,跑系统