STM32初学---总线:AHB、AHP / EEPROM、SPI FLASH、EMMC

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:超大、复杂,跑系统
相关推荐
小智RE0-走在路上2 小时前
Python学习笔记(5)--函数
笔记·python·学习
zore_c2 小时前
【数据结构】栈——超详解!!!(包含栈的实现)
c语言·开发语言·数据结构·经验分享·笔记·算法·链表
anghost1502 小时前
基于 STM32 的图书馆座位智能管理系统设计与实现
stm32·单片机·嵌入式硬件
KaDa_Duck2 小时前
DASCTF 2025下半年赛 PWN-mvmp复盘笔记
linux·笔记·安全
小痞同学2 小时前
stm32外部中断实验
stm32·单片机·嵌入式硬件
d111111111d2 小时前
C语言中union(共同体)的特电是什么?STM32中常用于处理什么数据?
c语言·arm开发·笔记·stm32·单片机·嵌入式硬件·学习
阿蒙Amon2 小时前
JavaScript学习笔记:18.继承与原型链
javascript·笔记·学习
崇山峻岭之间2 小时前
Matlab学习笔记04
笔记·matlab
q_19132846952 小时前
基于SpringBoot2+Vue2的企业合作与活动管理平台
java·vue.js·经验分享·spring boot·笔记·mysql·计算机毕业设计