本页目录

存储技术

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 FlashNAND Flash
读取随机访问 (可 XIP)页读取
写入慢 (需先擦除)慢 (需先擦除)
擦除块擦除 (~100ms)块擦除 (~ms)
容量MB~1GBGB~TB
接口SPI/QSPI/OSPI并行/ONFI
寿命10k~100k1k~10k (需要磨损均衡!)
坏块极少出厂就有, 需管理
价格贵 ($/MB)便宜 ($/GB)
嵌入式 MCU 99% 用 NOR Flash (通过 SPI/QSPI)
NAND 用于 eMMC/SD 卡 / SSD 内部

EEPROM vs FRAM

特性EEPROMFRAM
写入速度慢 (5ms/page)极快 (ns 级)
写入前需擦除?不需要 (字节可写)不需要
寿命100k~1M 次10¹²~10¹⁴ 次!
功耗更低
容量1Kb~1Mb4Kb~4Mb
接口I2C/SPII2C/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