1. 存储基础概念:ROM、RAM、EEPROM、Flash的区别与选型

做嵌入式开发这么多年,我见过不少工程师在存储选型上栽跟头。说白了,选错存储芯片,轻则产品功能受限,重则量产时发现数据丢了、程序跑飞了。今天咱们就把这几种存储器的底细摸清楚。

1.1 ROM:只读存储器,老前辈了

ROM的全称是Read-Only Memory,顾名思义,出厂时数据就写死了。我刚开始做单片机那会儿,用的还是掩膜ROM,程序烧进去就改不了。现在大家基本不直接用了,但它的变种——OTP ROM(一次可编程),在一些低成本遥控器、玩具里还能见到。

核心特点:

  • 数据掉电不丢失
  • 出厂前写入,用户无法修改(或只能改一次)
  • 成本极低,适合大批量定型产品

嗯,这里要注意:ROM现在更多是一个历史概念。你听到有人说「ROM」,八成指的是Flash或者EEPROM,别被绕晕了。

1.2 RAM:掉电就丢,但跑得快

RAM是程序运行时的主战场。它分两种:SRAM和DRAM。

SRAM(静态RAM):速度快,不用刷新,但贵。我在做工业控制器时,MCU内部自带的SRAM通常只有几十KB到几MB,写代码时得精打细算。

DRAM(动态RAM):需要定期刷新,容量大,便宜。咱们电脑里的内存条就是DDR DRAM。嵌入式里跑Linux的板子,一般外挂DDR颗粒。

我的经验:选RAM时别只看容量。有一次我为了省成本,选了颗低速SRAM,结果程序跑起来卡顿严重。后来换成高速的,问题就解决了。速度、功耗、接口时序,都得看仔细。

1.3 EEPROM:按字节擦写,灵活但慢

EEPROM(电可擦除可编程只读存储器)最大的好处是——可以按字节擦写。你想想看,如果只想改一个配置参数,不用把整个扇区擦掉重写,多方便。

我做过一个智能电表项目,里面存了用户电价、校准系数、累计电量。这些数据经常变,但每次只改几个字节。用EEPROM就特别合适。

EEPROM的典型参数:

参数典型值
擦写次数10万~100万次
写入速度几毫秒/字节
容量范围几Kb~几Mb
接口I2C、SPI、并行

避坑指南:我曾经在一个项目中,用EEPROM存日志数据,每秒写一次。结果不到一个月,芯片就挂了。后来一查,EEPROM的擦写寿命虽然标称10万次,但频繁写入会加速老化。所以,高频写入的场景,还是用FRAM或者大容量Flash吧。

1.4 Flash:大容量、块擦除,嵌入式主力

Flash是目前嵌入式系统里最常用的非易失性存储器。它分两种:NOR Flash和NAND Flash。

NOR Flash:可以随机读取,像RAM一样直接寻址。代码可以直接在NOR Flash里执行(XIP,eXecute In Place)。我早期做Bootloader时,就是直接把启动代码放在NOR Flash里跑的。

NAND Flash:容量大、成本低,但必须按页读写、按块擦除。而且坏块多,需要软件做ECC校验和坏块管理。做U盘、SD卡、SSD的,基本都是NAND Flash。

Flash vs EEPROM 对比:

特性EEPROMNOR FlashNAND Flash
最小擦除单位字节扇区(通常4KB~64KB)块(通常128KB~1MB)
写入速度慢(ms级)中等快(μs级)
读取速度快(可XIP)快(但需缓存)
擦写寿命10万~100万次1万~10万次1千~10万次
典型容量几Kb~几Mb几Mb~几百Mb几百Mb~几Tb
成本

1.5 选型实战:我一般这么选

每次做新项目,我都会问自己三个问题:

  1. 数据量多大? 几十字节用EEPROM,几MB用NOR Flash,几百MB以上用NAND Flash。
  2. 写入频率多高? 频繁写入(每秒几次以上)优先考虑FRAM或SRAM+电池备份。偶尔写入用EEPROM或Flash都行。
  3. 需不需要代码就地执行? 需要XIP就用NOR Flash,否则NAND Flash更划算。

一个小技巧:如果你不确定选哪种,可以先看看市面上成熟的开发板用的是什么。比如STM32的官方开发板,内部Flash存代码,外部挂一颗EEPROM存配置参数。这个组合在工业产品里非常常见。

1.6 总结一下

ROM已经基本退出历史舞台了。RAM是运行时的临时存储。EEPROM适合小容量、按字节修改的场景。Flash是当前嵌入式存储的主力,NOR适合存代码,NAND适合存大量数据。

选型没有绝对的对错,关键看你的应用场景。我见过有人用大容量Flash存几个配置字节,也见过有人用EEPROM存几十MB的日志。不是不能用,但成本和可靠性上总会打折扣。

下一章,咱们聊聊EEPROM的驱动怎么写。从I2C接口开始,手把手带你调通一颗AT24C02。到时候我会把踩过的坑都告诉你。