1. 内存基础概念:RAM、ROM、Flash、SRAM、DRAM 的区别与选型

做嵌入式开发,第一关就是搞懂内存。我见过不少新手,上来就选了个大容量芯片,结果成本超标、功耗压不住。说白了,选内存不是选最大的,而是选最合适的。

咱们先理清几个核心概念。你想想看,嵌入式系统里跑代码、存数据、掉电保持,靠的是不同的存储介质。它们各有脾气,用错了地方,项目就得返工。

1.1 内存家族图谱

先看一张总览图,把这几类存储器的关系理清楚。我个人习惯用这张图给团队新人做培训,一目了然。

嵌入式存储器分类与关系图 嵌入式存储器分类与关系 嵌入式存储器 易失性存储器(Volatile) 非易失性存储器(Non-Volatile) SRAM DRAM Flash ROM NOR Flash NAND Flash 关键区分:掉电后数据是否保留 → 易失性(SRAM/DRAM) vs 非易失性(Flash/ROM)

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 选型实战:我该怎么选?

选内存,我一般按这个顺序问自己三个问题:

  1. 掉电后数据要不要保留? 要 → 选 Flash/ROM;不要 → 选 SRAM/DRAM
  2. 需要多大容量? < 2MB → SRAM 或 NOR Flash;> 64MB → DRAM 或 NAND Flash
  3. 速度要求多高? 实时控制 → 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 的区别和选型逻辑过了一遍。说白了,选内存就是平衡速度、容量、功耗、成本四个维度。没有最好的,只有最合适的。