3、SRAM与DRAM:原理、速度、功耗对比及在MCU中的应用
说到单片机里的存储器,SRAM和DRAM是绕不开的两个主角。很多初学者容易把它们搞混,觉得都是RAM,能存数据不就行了?其实差别大了去了。我当年刚入行时也犯过糊涂,直到有一次在项目里选错了存储颗粒,导致产品在高温下频繁死机……嗯,从那以后我就把这两者的脾气摸得透透的。
3.1 工作原理:一个靠锁存,一个靠电容
先说说SRAM。它的全称是Static Random Access Memory,静态随机存取存储器。为什么叫“静态”?因为它只要不断电,数据就能一直保持,不需要刷新。它的存储单元是由6个晶体管组成的锁存器(也就是一个D触发器),说白了就是两个反相器首尾相接,互相锁住状态。
SRAM核心特点:
- 存储单元:6T结构(6个晶体管)
- 数据保持:静态,无需刷新
- 访问方式:随机存取,地址线直接寻址
- 速度:极快,通常1-2个时钟周期完成读写
DRAM就不一样了。它的全称是Dynamic Random Access Memory,动态随机存取存储器。每个存储单元只有一个晶体管加一个电容,靠电容里存不存电荷来表示0和1。电容会漏电啊,所以必须定期刷新,这就是“动态”二字的由来。
我个人习惯这样记:SRAM像是一个带锁的抽屉,锁上了就稳稳的;DRAM像是一个漏水的杯子,你得不停地往里加水(刷新),否则数据就没了。
3.2 速度对比:SRAM完胜,但代价不小
速度方面,SRAM是当之无愧的王者。因为它是纯组合逻辑+锁存器,没有刷新等待时间,地址一给,数据就出来了。我做过实测,在同样的工艺下,SRAM的访问延迟大约是DRAM的1/5到1/10。
DRAM为什么慢?原因有两个:
- 刷新开销:每隔几十微秒就得停下手头的活去刷新一行,这期间不能读写
- 行/列地址复用:DRAM为了减少引脚,把地址分成行地址和列地址分两次送,多了一个步骤
你想想看,MCU里跑实时任务时,如果内存访问突然被刷新打断,那实时性就悬了。所以很多对响应时间要求苛刻的场景,比如中断服务程序里的数据缓冲,我一般都用SRAM。
| 参数 | SRAM | DRAM |
|---|---|---|
| 访问时间 | 10-20 ns | 50-100 ns |
| 刷新周期 | 不需要 | 64 ms(每行) |
| 地址方式 | 单次地址输入 | 行/列地址分时复用 |
| 典型应用 | Cache、片内RAM | 主存、大容量存储 |
3.3 功耗对比:SRAM是耗电大户?其实不一定
很多人以为SRAM静态功耗低,DRAM动态功耗低。这话只说对了一半。SRAM的静态漏电流确实比DRAM大,因为6个晶体管总有几个在导通状态。但DRAM的刷新电流也不小,尤其是容量大了以后。
我在一个低功耗物联网项目里做过对比:同样是1MB的存储容量,SRAM待机电流约50μA,DRAM待机电流约200μA(因为要持续刷新)。但SRAM的动态工作电流能达到10mA以上,而DRAM只有3-5mA。所以怎么选,得看你的应用场景:
- 频繁读写、短时间工作:选SRAM,速度快,不用等刷新
- 长时间待机、偶尔唤醒:选DRAM,待机功耗更低
- 实时性要求高:必须SRAM,DRAM的刷新延迟不可控
我曾经踩过一个坑:在一个电池供电的传感器节点里,用了大容量DRAM做数据缓存。结果发现设备在低温环境下(-20°C)频繁死机。查了半天,原来是DRAM在低温下刷新周期需要调整,默认的刷新定时器不够用了。从那以后,我在宽温产品里一律用SRAM或者铁电存储器FRAM。
3.4 在MCU中的应用:各司其职
现在的MCU内部,SRAM和DRAM的分工其实很明确。我画了一张图,帮你理清它们的关系:
在实际的MCU选型中,我一般遵循这几个原则:
- 片内SRAM:放关键数据——中断向量表、RTOS的任务栈、高频访问的全局变量。容量不够?换更大SRAM的型号,别轻易上外部DRAM。
- 外部DRAM:放“大块头”数据——摄像头帧缓冲、音频采样缓冲区、GUI的显存。这些数据量大,但对访问延迟不敏感。
- 混合使用:有些MCU支持同时使用片内SRAM和外部DRAM,通过MPU(内存保护单元)划分区域。我习惯把实时性要求高的任务栈放在SRAM,把数据采集缓冲放在DRAM。
一个小技巧:如果你的MCU有D-Cache(数据缓存),可以把外部DRAM映射到缓存区域。这样大部分时候命中缓存,速度接近SRAM。但要注意,DMA传输的数据要小心缓存一致性问题——我吃过这个亏,数据明明写进去了,CPU读到的却是旧值。
3.5 实战选型建议
最后,我总结了一个快速决策表,帮你根据项目需求选型:
| 项目需求 | 推荐方案 | 理由 |
|---|---|---|
| 实时控制(电机、电源) | 片内SRAM | 确定性的访问延迟,无刷新干扰 |
| 数据采集(ADC、传感器) | 片内SRAM + DMA | 高速、低延迟,DMA直接搬运 |
| 人机界面(LCD、触摸) | 外部DRAM | 需要大容量显存,对延迟不敏感 |
| 低功耗待机(电池供电) | 小容量SRAM + 深度睡眠 | SRAM在待机时可保持数据,DRAM需要刷新 |
| 音视频处理 | 外部DRAM + 片内SRAM缓存 | DRAM存原始数据,SRAM做中间计算缓冲 |
说白了,SRAM和DRAM没有绝对的好坏,关键看你怎么用。我见过有人为了省成本,在实时控制项目里硬上外部DRAM,结果产品一上市就出问题。也见过有人在小项目里用大容量SRAM,成本翻倍不说,还占PCB面积。选型这事,多想想你的数据流和实时性要求,就不会跑偏。