本页目录
存储技术
MCU 项目中的数据存哪里、怎么存
存储金字塔
容量 速度 价格/GB
SRAM KB~MB 最快 (ns) 最贵 ← CPU Cache/寄存器
DRAM MB~GB 快 (10ns) 中 ← 内存
NOR MB~GB 中 (μs) 中高 ← 代码存储
NAND GB~TB 慢 (ms) 低 ← 数据存储
嵌入式系统关心的是非易失存储 (掉电不丢):
- 代码存哪里 → NOR Flash (XIP 就地执行)
- 数据存哪里 → EEPROM / NOR / NAND / SD
内置 vs 外挂
MCU 内置 Flash
STM32F407: 1MB 内置 NOR Flash
ESP32: 4~16MB 外挂 SPI NOR Flash
RP2040: 无内置, 全部外挂 QSPI NOR Flash
nRF52840: 1MB 内置
代码存在 Flash 中, 上电直接运行 (XIP)
擦写寿命: 典型 10k~100k 次
内置 EEPROM (仿真)
多数 MCU 没有真正 EEPROM, 用 Flash 模拟:
STM32: 在 Flash 末尾划一块, 磨损均衡算法
ESP32: NVS (Non-Volatile Storage), 基于 Flash
仿真 EEPROM 寿命受 Flash 页擦除次数限制
实际够用: 每天写 10 次, 100k 寿命 = 27 年
Flash 类型对比
| 特性 | NOR Flash | NAND Flash |
|---|---|---|
| 读取 | 随机访问 (可 XIP) | 页读取 |
| 写入 | 慢 (需先擦除) | 慢 (需先擦除) |
| 擦除 | 块擦除 (~100ms) | 块擦除 (~ms) |
| 容量 | MB~1GB | GB~TB |
| 接口 | SPI/QSPI/OSPI | 并行/ONFI |
| 寿命 | 10k~100k | 1k~10k (需要磨损均衡!) |
| 坏块 | 极少 | 出厂就有, 需管理 |
| 价格 | 贵 ($/MB) | 便宜 ($/GB) |
嵌入式 MCU 99% 用 NOR Flash (通过 SPI/QSPI)
NAND 用于 eMMC/SD 卡 / SSD 内部
EEPROM vs FRAM
| 特性 | EEPROM | FRAM |
|---|---|---|
| 写入速度 | 慢 (5ms/page) | 极快 (ns 级) |
| 写入前需擦除? | 不需要 (字节可写) | 不需要 |
| 寿命 | 100k~1M 次 | 10¹²~10¹⁴ 次! |
| 功耗 | 低 | 更低 |
| 容量 | 1Kb~1Mb | 4Kb~4Mb |
| 接口 | I2C/SPI | I2C/SPI |
| 价格 | 便宜 | 贵 2-3x |
EEPROM: 存配置/校准数据 (偶尔写)
FRAM: 频繁记录 (数据日志, 掉电保护)
寿命几乎无限 → 不用担心写坏了
典型芯片:
EEPROM: 24LC256 (256Kb, I2C), AT25SF041 (4Mb, SPI)
FRAM: MB85RC256V (256Kb, I2C), FM25V02A (2Mb, SPI)
SD 卡
两种模式
SPI 模式:
4 线 (CS/CLK/MOSI/MISO)
慢 (25~50 Mbps)
所有 MCU 都能用
库: FatFs + SPI 驱动
SDIO 模式:
4-bit 并行
快 (可达 100Mbps+)
需要硬件 SDIO 控制器 (STM32F4+ 或 ESP32 支持)
无论哪种, 都需要文件系统 → FatFs (最通用)
接线
SD 卡 MCU (SPI 模式)
──────────────────────────
CS ←→ GPIO (片选)
MOSI ←→ MOSI
MISO ←→ MISO
SCK ←→ SCK
VDD ←→ 3.3V
GND ←→ GND
必须加:
所有信号线 10k~100k 上拉到 3.3V
VDD 旁路电容 0.1μF + 10μF
注意: SD 卡是 3.3V! 5V 会烧
文件系统
裸 MCU 用 SD 卡:
FatFs: 最通用, FAT32/exFAT
代码小, 适合 MCU
http://elm-chan.org/fsw/ff/
LittleFS: 为 Flash 设计的文件系统
掉电安全, 磨损均衡
适合 MCU 内部/外挂 NOR Flash
SPIFFS: ESP32 的旧文件系统 (已被 LittleFS 取代)
当选:
SD 卡 → FatFs (PC 兼容)
内部 Flash → LittleFS (掉电安全)
常见存储方案速查
场景 推荐
────────────────────────────────────
存几个配置值 (WiFi密码等) MCU 内部 Flash / EEPROM 仿真
存几百字节配置 I2C EEPROM (24LCxx)
频繁记录数据 (每秒多次) FRAM 或 SPI NOR + LittleFS
代码超过内置 Flash 外挂 QSPI NOR Flash (如 W25Q64)
存日志/数据, 需导出到 PC SD 卡 + FatFs
产品级数据存储 eMMC (容量大, 可靠, 但 BGA)
不掉电的数据缓存 FRAM (寿命无限)
实际踩坑
1. Flash 写入前必须擦除
→ 写 1 字节要先擦整个 Page/Block
→ 更新一个配置值 = 读出整页 → 修改 → 擦除 → 写回
2. NAND 坏块管理
→ 出厂就有坏块!
→ 需要 ECC (纠错码)
→ MCU 裸跑 NAND 很痛苦, 用 eMMC (内置控制器)
3. Flash 寿命
→ 每 10 秒写一次 → 100k 寿命 → 只能用 11 天!
→ 解决方案: 磨损均衡 (Wear Leveling)
→ 用 LittleFS 或 SPIFFS, 不要裸写 Flash
4. SD 卡兼容性
→ 不是所有卡都支持 SPI 模式!
→ 某些卡上电后需要多发几个 dummy clock
→ 大容量卡 (SDHC/SDXC) 初始化有差异
5. 掉电时写 Flash
→ 写一半断电 → 数据损坏
→ 用双区备份: 写新数据到 B 区, 验证后再标记有效
→ 或加足够电容维持写完 (但不可靠)
关键词: NOR Flash, NAND Flash, EEPROM, FRAM, SD卡, FatFs, LittleFS, 磨损均衡, QSPI