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 对比:
| 特性 | EEPROM | NOR Flash | NAND Flash |
|---|---|---|---|
| 最小擦除单位 | 字节 | 扇区(通常4KB~64KB) | 块(通常128KB~1MB) |
| 写入速度 | 慢(ms级) | 中等 | 快(μs级) |
| 读取速度 | 慢 | 快(可XIP) | 快(但需缓存) |
| 擦写寿命 | 10万~100万次 | 1万~10万次 | 1千~10万次 |
| 典型容量 | 几Kb~几Mb | 几Mb~几百Mb | 几百Mb~几Tb |
| 成本 | 高 | 中 | 低 |
1.5 选型实战:我一般这么选
每次做新项目,我都会问自己三个问题:
- 数据量多大? 几十字节用EEPROM,几MB用NOR Flash,几百MB以上用NAND Flash。
- 写入频率多高? 频繁写入(每秒几次以上)优先考虑FRAM或SRAM+电池备份。偶尔写入用EEPROM或Flash都行。
- 需不需要代码就地执行? 需要XIP就用NOR Flash,否则NAND Flash更划算。
一个小技巧:如果你不确定选哪种,可以先看看市面上成熟的开发板用的是什么。比如STM32的官方开发板,内部Flash存代码,外部挂一颗EEPROM存配置参数。这个组合在工业产品里非常常见。
1.6 总结一下
ROM已经基本退出历史舞台了。RAM是运行时的临时存储。EEPROM适合小容量、按字节修改的场景。Flash是当前嵌入式存储的主力,NOR适合存代码,NAND适合存大量数据。
选型没有绝对的对错,关键看你的应用场景。我见过有人用大容量Flash存几个配置字节,也见过有人用EEPROM存几十MB的日志。不是不能用,但成本和可靠性上总会打折扣。
下一章,咱们聊聊EEPROM的驱动怎么写。从I2C接口开始,手把手带你调通一颗AT24C02。到时候我会把踩过的坑都告诉你。