存储器体系全景:单片机存储器的层级结构与特性对比
做嵌入式开发这些年,我见过不少工程师在存储器选型上栽跟头。有人Flash用太狠导致寿命提前耗尽,有人SRAM溢出却浑然不知,还有人把EEPROM当Flash用结果写入慢到怀疑人生。说白了,不理解存储器的脾气,代码写得再漂亮也白搭。
这一章,咱们先把单片机存储器的家底摸清楚。你想想看,一个MCU芯片里就那么几兆甚至几百K的空间,却要同时跑代码、存数据、保参数,每种存储器的性格完全不同。搞懂了它们,你才知道什么数据该放哪儿,怎么放最划算。
一、单片机存储器的“四大家族”
主流单片机里,常见的存储器就四种:Flash、SRAM、EEPROM、SDRAM。它们各有各的活法,我习惯把它们比作一个团队里的不同角色:
- Flash —— 仓库管理员,记性好但动作慢,负责存代码和固件
- SRAM —— 前台接待,手脚麻利但记性差,一断电就忘光
- EEPROM —— 贴身秘书,能随时改小本本,但写一次要喘口气
- SDRAM —— 临时工,量大管饱但需要有人盯着(刷新),一般只有高端MCU才请得起
嗯,这个比喻虽然糙,但道理不糙。咱们一个一个细看。
二、Flash:程序的家
Flash是单片机里最常用的非易失性存储器。代码就躺在这儿,上电后CPU一条条取出来执行。我在项目中遇到过最典型的坑:某次量产一批设备,用了某款国产MCU,Flash擦写次数标称10万次,结果客户频繁远程升级,一年不到就挂了。后来一查,Flash的擦写寿命其实只有1万次左右——数据手册写的“10万次”是典型值,不是保证值。
Flash的读取速度还行,一般在几十ns级别,但写入就慢了——写一个字节要几微秒,擦除一个扇区可能要几十毫秒。所以,运行时变量千万别放Flash,那是找死。
| 特性 | Flash | SRAM | EEPROM | SDRAM |
|---|---|---|---|---|
| 易失性 | 非易失 | 易失 | 非易失 | 易失 |
| 读取速度 | ~50ns | ~10ns | ~100ns | ~10ns |
| 写入速度 | ~5µs/字节 | ~10ns | ~5ms/字节 | ~10ns |
| 擦写寿命 | 1万~10万次 | 无限 | 10万~100万次 | 无限 |
| 典型容量 | 32KB~2MB | 4KB~512KB | 128B~64KB | 1MB~64MB |
| 单位成本 | 低 | 高 | 中 | 低 |
三、SRAM:数据的临时工
SRAM是单片机里的“快枪手”。读写速度跟CPU时钟几乎同步,没有等待周期。我调试程序时最喜欢用SRAM做堆栈和全局变量——跑起来那叫一个丝滑。
但SRAM有个致命弱点:掉电丢数据。而且它贵,占芯片面积大。你看那些8位单片机,SRAM往往只有几百字节到几KB,就是因为成本压不住。我做过一个物联网项目,需要缓存大量传感器数据,结果SRAM不够用,最后不得不外挂SDRAM。
四、EEPROM:参数的小金库
EEPROM和Flash很像,都是非易失的。但EEPROM有个绝活:可以按字节擦写。Flash要擦就是一个扇区,EEPROM想改哪个字节就改哪个字节,灵活得多。
不过代价是速度慢。写一个字节要5ms左右,比Flash还慢。我早期做智能电表项目时,每次掉电前要保存几十个参数,用EEPROM一个个写,结果主循环被卡死,差点没赶上掉电保存窗口。后来改成批量写入+校验,才算搞定。
EEPROM的寿命比Flash长一些,一般在10万~100万次。但注意,这个寿命是按字节算的。如果你总盯着同一个地址写,它也会提前报废。我建议做磨损均衡(Wear Leveling),把写操作分散到不同地址。
五、SDRAM:大容量但娇气
SDRAM在单片机领域算是“奢侈品”。一般只有跑Linux的高端MCU(比如STM32MP1系列)才会用。它的容量大、速度快、成本低,但需要定期刷新(每64ms刷新一次),否则数据就丢了。
我接手过一个项目,前任工程师用SDRAM做视频缓存,结果画面时不时花屏。查了半天,发现是SDRAM的刷新时序没配好,导致某些行数据丢失。嗯,SDRAM的时序配置是个技术活,后面章节我会专门讲。
六、存储器层级结构全景图
下面这张图,是我自己画的一个存储器层级结构。你看,从CPU到Flash/SRAM再到外存,速度越来越慢,容量越来越大,成本越来越低。这就是典型的存储器金字塔。
从图上你能看到:越往上,速度越快,容量越小,成本越高。CPU寄存器最快但只有几十个字节,SDRAM最慢但能到几十MB。设计时就要权衡:热数据放SRAM,冷数据放Flash,参数放EEPROM,大块头放SDRAM。
七、选型实战建议
说了这么多,到底怎么选?我总结了几条铁律:
- 代码必须放Flash,别想着放SRAM里跑——掉电就没了。
- 全局变量和堆栈放SRAM,这是底线。SRAM不够时,优先优化算法,别硬上SDRAM。
- 配置参数、校准数据、设备序列号放EEPROM。如果MCU没有内部EEPROM,可以用Flash模拟,但要注意磨损均衡。
- 大缓存(比如LCD显存、音频缓冲)才考虑SDRAM。而且一定要配好刷新时序,否则数据会随机出错。