1. 内存基础概念:RAM、ROM、Flash、SRAM、DRAM 的区别与选型
做嵌入式开发,第一关就是搞懂内存。我见过不少新手,上来就选了个大容量芯片,结果成本超标、功耗压不住。说白了,选内存不是选最大的,而是选最合适的。
咱们先理清几个核心概念。你想想看,嵌入式系统里跑代码、存数据、掉电保持,靠的是不同的存储介质。它们各有脾气,用错了地方,项目就得返工。
1.1 内存家族图谱
先看一张总览图,把这几类存储器的关系理清楚。我个人习惯用这张图给团队新人做培训,一目了然。
1.2 逐个拆解:它们到底是什么?
SRAM(静态随机存取存储器)
SRAM 用触发器存数据,只要不掉电,数据就稳稳待着。速度快,但占面积大、成本高。我在项目中常用它做 CPU 的缓存(Cache),或者对实时性要求极高的数据缓冲区。
核心特点:
- 速度快:访问时间通常在 10-20 ns
- 功耗低:静态功耗极小,适合电池供电设备
- 容量小:单片常见 1-16 Mbit,再大成本就失控了
- 不需要刷新:省了刷新控制器,接口简单
我的经验: 做低功耗传感器节点时,我习惯用 SRAM 做临时数据缓存。它不像 DRAM 需要定时刷新,MCU 休眠时 SRAM 几乎不耗电。但注意,SRAM 的待机电流虽然小,动态电流随频率上升很快,高频下别忽略这个。
DRAM(动态随机存取存储器)
DRAM 靠电容存电荷来代表 0 和 1。电容会漏电,所以得不停地刷新。速度比 SRAM 慢,但密度高、价格便宜。PC 和手机里的内存条,基本都是 DRAM。
嵌入式里用 DRAM 的场景也不少。比如跑 Linux 的 ARM 板,动不动就需要 256MB 甚至 1GB 内存,这时候只能用 DDR3/DDR4 这类 DRAM。
避坑指南: 我曾经在一个工业控制器项目里,直接用了 PC 级的 DDR3 内存条。结果发现工业温度范围(-40°C ~ 85°C)下频繁出错。后来换成工业级 DDR3,问题才解决。选 DRAM 一定要看温度等级,消费级和工业级差别很大。
Flash(闪存)
Flash 是非易失性的,掉电不丢数据。嵌入式里最常用的就是它。分两种:NOR 和 NAND。
| 特性 | NOR Flash | NAND Flash |
|---|---|---|
| 读取速度 | 快(支持 XIP,代码可直接运行) | 较慢(需要先读到 RAM 再执行) |
| 写入速度 | 慢 | 快(块写入效率高) |
| 擦除速度 | 慢 | 快 |
| 密度 | 低(常见 1-256 Mbit) | 高(常见 1-128 Gbit) |
| 可靠性 | 高(坏块少) | 需要坏块管理 |
| 典型用途 | 存放启动代码、小容量固件 | 大容量文件系统、日志存储 |
我个人习惯:MCU 项目用 NOR Flash 存固件,上电就能直接跑。跑 Linux 的系统用 NAND Flash 存根文件系统,容量大、成本低。
ROM(只读存储器)
ROM 在出厂时数据就写死了,用户改不了。现在嵌入式里很少直接用 Mask ROM 了,因为不灵活。但它的变种——OTP ROM(一次可编程)在一些安全芯片里还有用,用来存密钥或唯一 ID。
小知识点: 很多人把 Flash 也叫 ROM,其实不准确。Flash 是可擦写的,严格说属于 EEPROM 的进化版。真正的 ROM 是掩膜编程的,改不了。不过行业内说“ROM”时,有时泛指所有非易失性存储器,注意上下文就好。
1.3 选型实战:我该怎么选?
选内存,我一般按这个顺序问自己三个问题:
- 掉电后数据要不要保留? 要 → 选 Flash/ROM;不要 → 选 SRAM/DRAM
- 需要多大容量? < 2MB → SRAM 或 NOR Flash;> 64MB → DRAM 或 NAND Flash
- 速度要求多高? 实时控制 → SRAM;批量数据处理 → DRAM
举个例子。我之前做的一个便携式医疗设备,主控是 Cortex-M4,128KB SRAM 片内,外挂 1MB NOR Flash 存固件和参数。为什么不用 DRAM?因为设备待机功耗要求低于 10μA,DRAM 的刷新电流扛不住。为什么不用 NAND?因为代码需要 XIP 直接运行,NAND 不支持。
选型速查表:
| 应用场景 | 推荐存储器 | 理由 |
|---|---|---|
| MCU 内部缓存、实时控制 | SRAM | 速度快、无需刷新、接口简单 |
| 大容量主存(Linux 系统) | DDR3/DDR4 DRAM | 容量大、成本低、带宽高 |
| 固件存储、启动代码 | NOR Flash | 支持 XIP、可靠性高 |
| 文件系统、日志、大容量数据 | NAND Flash | 单位成本低、容量大 |
| 安全密钥、唯一 ID | OTP ROM / eFuse | 一次写入、不可篡改 |
1.4 一个容易踩的坑:内存大小与地址空间
嗯,这里要注意。很多 32 位 MCU 的地址空间是 4GB(32 位寻址),但实际能访问的物理内存远小于这个数。比如 STM32F4 系列,片内 SRAM 只有 192KB,片外扩展也受 FSMC 接口限制。
我曾经接手过一个项目,前任工程师在代码里直接定义了一个 1MB 的全局数组,结果编译通过,运行就死机。为什么?因为芯片的 SRAM 总共才 128KB,数组越界了。编译器不会报错,链接脚本也没限制,运行时直接踩了栈空间。
教训: 选型时不仅要看芯片标称的内存大小,还要确认实际可用的地址范围。特别是用外部内存扩展时,检查片选信号、地址线连接、以及 MCU 的内存映射表。别信编译器,信数据手册。
1.5 小结一下
这一章我们把 RAM、ROM、Flash、SRAM、DRAM 的区别和选型逻辑过了一遍。说白了,选内存就是平衡速度、容量、功耗、成本四个维度。没有最好的,只有最合适的。