---
title: 存储技术
url: https://doc.liz6.com/hardware/09-embedded-systems/04-storage-technologies
locale: zh
area: hardware
tags:
- hardware
- 嵌入式系统
date: 2026-06-30
modified: 2026-06-30
description: MCU 项目中的数据存哪里、怎么存
---

# 存储技术

> 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*
