4. 嵌入式存储系统:Flash、SRAM、DRAM、eMMC、NAND Flash 选型与设计
存储系统选型,说白了就是给嵌入式系统挑「记忆体」。选错了,轻则性能拉胯,重则产品死机、数据丢失。我这些年踩过的坑,有一半都跟存储有关。
咱们先看一张总图,把嵌入式存储的家族谱理清楚。
4.1 SRAM 与 DRAM:速度与容量的博弈
SRAM 和 DRAM 都是易失性存储器,掉电数据就没了。但它们的内部结构完全不同。
SRAM(静态随机存取存储器):用触发器存储数据,速度快得离谱,纳秒级访问。但一个 bit 要 6 个晶体管,面积大、成本高。我习惯把它用在 CPU 内部缓存、或者对实时性要求极高的数据暂存区。
DRAM(动态随机存取存储器):用电容存储数据,一个 bit 只要 1 个晶体管加 1 个电容,密度高、成本低。但电容会漏电,需要定期刷新。嵌入式里最常见的是 SDRAM 和 DDR SDRAM。
选型口诀:要速度选 SRAM,要容量选 DRAM。两者不可兼得,除非你预算无上限。
| 特性 | SRAM | DRAM (SDRAM/DDR) |
|---|---|---|
| 存储单元 | 触发器 (6T) | 电容 (1T1C) |
| 访问速度 | 1-10 ns | 10-70 ns |
| 容量 | KB ~ 几十 MB | MB ~ GB |
| 是否需要刷新 | 否 | 是 (64ms 刷新周期) |
| 功耗 | 静态功耗较高 | 动态功耗较高 |
| 典型应用 | CPU Cache、FPGA BRAM | 系统主内存、显存 |
注意:DRAM 的刷新时序必须在硬件设计时考虑。我曾经遇到一个项目,MCU 的 SDRAM 控制器刷新间隔配置错了,导致系统运行几分钟后随机死机。排查了三天,最后发现是刷新周期寄存器写成了 64us 而不是 64ms。
4.2 NOR Flash 与 NAND Flash:代码执行与数据存储
Flash 是非易失性的,掉电不丢数据。但 NOR 和 NAND 的差异非常大。
NOR Flash:支持随机寻址,CPU 可以直接在上面执行代码(XIP,eXecute In Place)。读速度快,但写和擦除慢。容量通常不大,16MB 到 256MB 比较常见。我一般用它来放 Bootloader 和关键配置参数。
NAND Flash:按页(Page)读写,按块(Block)擦除。容量大,成本低,但读写需要经过 FTL(Flash Translation Layer)做地址映射和坏块管理。不能直接执行代码,需要先把代码拷贝到 RAM 里再执行。
我的习惯:小容量系统(< 64MB)用 NOR Flash 存代码,大容量系统(> 256MB)用 NAND Flash + eMMC 组合。中间容量可以考虑 SPI NAND,引脚少、布线简单。
| 特性 | NOR Flash | NAND Flash |
|---|---|---|
| 接口 | 并行 / SPI | 并行 / SPI |
| 寻址方式 | 随机寻址 (字节) | 页寻址 (512B ~ 16KB) |
| 读速度 | 快 (随机读) | 快 (连续读) |
| 写/擦除速度 | 慢 | 快 (批量操作) |
| 坏块 | 极少 | 出厂就有坏块,需管理 |
| 寿命 (擦写次数) | 10万 ~ 100万次 | 1千 ~ 10万次 (SLC/MLC/TLC) |
| 典型用途 | Bootloader、参数存储 | 文件系统、固件、多媒体 |
4.3 eMMC 与 UFS:封装好的存储方案
eMMC 和 UFS 本质上都是 NAND Flash 加上控制器和接口协议,封装成一个 BGA 芯片。你不需要关心内部坏块管理、ECC 校验、磨损均衡,直接当硬盘用就行。
eMMC(嵌入式多媒体卡):基于并行接口(8-bit),半双工。速度上限约 400 MB/s(HS400 模式)。我做过一个工业平板项目,用的 eMMC 5.1,连续读写 250 MB/s 左右,完全够用。
UFS(通用闪存存储):基于串行接口(M-PHY),全双工。速度轻松上 1 GB/s。UFS 2.1 开始普及,UFS 3.1 已经到 2.9 GB/s。旗舰手机和高端嵌入式设备首选。
选型建议:
- 成本敏感、速度要求不高:eMMC 5.1
- 需要快速启动、高随机读写:UFS 2.1 或 3.1
- 极端环境(高温、振动):工业级 eMMC(带温控和增强型坏块管理)
4.4 实战选型流程与避坑指南
我总结了一套选型流程,每次做新项目都按这个来,基本没出过问题。
- 确定容量需求:代码大小 + 文件系统 + 日志空间 + 30% 余量。
- 确定速度需求:系统启动时间、数据吞吐率、随机读写 vs 顺序读写。
- 确定接口资源:MCU/SoC 支持哪些存储接口?FMC、SDIO、SPI、USB?
- 确定环境要求:工作温度、湿度、振动、寿命(擦写次数)。
- 确定成本预算:BOM 成本不能超过目标。
- 确定软件栈:是否需要文件系统?是否需要 FTL?是否需要 XIP?
我曾经踩过的坑:
- 选了一款便宜的 SPI NAND,结果发现 MCU 的 SPI 控制器不支持 NAND 的 ECC 校验,软件模拟 ECC 导致性能暴跌。
- eMMC 的 boot partition 大小没配置好,导致 Bootloader 放不下,最后只能改硬件重新贴片。
- DRAM 的 PCB 走线没做等长,DDR 跑不到标称频率,降频使用才稳定。
4.5 存储系统设计检查清单
| 检查项 | 说明 | 优先级 |
|---|---|---|
| 电源去耦 | 每个存储芯片的电源引脚附近放置 0.1uF + 10uF 电容 | 高 |
| 信号完整性 | 高速信号(DDR、SDIO)做阻抗匹配和等长布线 | 高 |
| 时序收敛 | 确保 MCU 的存储控制器时序参数配置正确 | 高 |
| 坏块管理 | NAND Flash 必须实现坏块管理,eMMC/UFS 内置 | 中 |
| 磨损均衡 | 频繁写入的场景需要磨损均衡,延长寿命 | 中 |
| 掉电保护 | 文件系统写入时掉电可能导致数据损坏,考虑掉电检测和缓存刷新 | 中 |
| 温度范围 | 消费级 (0~70°C)、工业级 (-40~85°C)、车规级 (-40~125°C) | 高 |
嗯,存储系统这块内容比较多,但核心就是一句话:根据速度、容量、成本、环境四个维度做权衡。没有完美的存储方案,只有最适合你项目的方案。