一文搞懂RAM/ROM/SRAM/DRAM/SDRAM/NOR/NAND选型

发布时间:2026/10/13 11:45:59
一文搞懂RAM/ROM/SRAM/DRAM/SDRAM/NOR/NAND选型 上周帮朋友排查一块板子现象很奇怪程序烧进去能跑但只要一断电之前配好的参数全变回出厂值。查了半天发现是有人把配置数据放在了RAM里。这让我想起这些年带硬件团队、做方案评审时经常被问的一个问题RAM、ROM、SRAM、DRAM、SDRAM、NOR Flash、NAND Flash这一堆名字到底怎么区分说实话很多写了几年代码的人能把SRAM和SDRAM的分工讲清楚的也不多见更不用说NOR和NAND在嵌入式选型里的那点微妙博弈了。这篇文章不打算写成教科书式的名词解释而是想结合我实际做过的一些项目和踩过的坑把这几类存储器的底层逻辑、适用场景、选型平衡讲透。适合嵌入式开发者、硬件工程师、电子相关专业的学生也适合所有被面试官问过RAM和ROM有什么区别的人——看完你会比大部分面试官的理解还深一层。1. 从MCU的存储布局看懂RAM和ROM的分工使命1.1 ROM早就不是只读了但它的角色定位没变很多入门资料喜欢把ROM解释成只读存储器把RAM解释成随机访问存储器然后考试就考到这里。但真实世界早就不这么简单了。现代MCU里几乎没有真正的Mask ROM掩膜ROM取而代之的是Flash。那为什么大家还是习惯叫ROM因为它的角色没有变存储那些掉电后不能丢的东西也就是固件代码、启动参数、字库、配置文件。ROM家族其实走了一段很长的路早期是掩膜ROM出厂时数据就固定了你没法改后来出现PROM可编程只读存储器用户可以写一次接着是EPROM可擦除可编程只读存储器用紫外线照窗口才能擦除重写所以老电路板上经常能看到贴着银白色标签的芯片揭掉标签露出一个玻璃窗那玩意儿在实验室里特别不方便再往后是EEPROM电可擦除可编程只读存储器可以按字节擦写但速度慢、容量小。而现在我们讨论的主角——Flash其实就是EEPROM理念的大容量高速进化版它继承了ROM掉电不丢的家族使命但擦写能力和速度已经远超老前辈了。所以你在很多MCU的datasheet里看到Flash 512KB和SRAM 128KB这样的配置本质上就是Flash承担传统ROM的工作SRAM承担传统RAM的工作。程序编译出来烧进Flash上电后MCU从Flash里取指令执行变量、堆栈这些运行时数据才放到SRAM里。那为什么程序不直接在Flash里执行这个问题放到下一小节正好引出两者的核心差异。1.2 启动文件里的秘密为什么要搬代码和清数据如果你点开过任何一个ARM Cortex-M工程的启动文件startup文件除了堆栈设置和中断向量表你一定会看到三个段text、data、bss。text是代码段留在Flash里没问题CPU可以直接从Flash取指令现代MCU内部Flash有预取缓存速度损耗没有想象中大。但data段就很有意思了——它存的是有初值的全局变量比如int count 100这个初始值100必须放在Flash里因为掉电不能丢。可变量真正运行时要能被频繁修改Flash擦写次数有限、速度也慢不能当变量区用所以启动代码要做一件事把data段从Flash的镜像位置拷贝一份到SRAM里之后再读写的都是SRAM里的副本。bss段更简单那些没有初值的全局变量启动代码把它们所在的SRAM区域统一清零就行。这一拷一清其实就是RAM和ROM最真实的分工场景ROM负责存档RAM负责上场操作。如果你在做低功耗设计或者内存紧张的方案这些段的大小直接影响了SRAM选型——有些工程师不看map文件凭感觉选MCU结果程序跑到一半栈溢出往往是没算清楚data段占了多少SRAM。我习惯在工程最后看一眼编译输出的map文件SRAM用量、Flash用量分别列清楚再决定要不要换芯片。还有个细节值得注意常量字符串和const变量一般放在Flash里不会拷到SRAM。有些嵌入式新手在Flash较大的MCU上肆无忌惮地写超大日志缓冲结果一看SRAM爆了原因就是他们误以为所有变量都在Flash里没有意识到可修改的变量才在SRAM这个基本规则。2. SRAM和DRAM一个靠锁存一个靠电容价格差出数量级2.1 SRAM的核心是双稳态触发器你不需要给它刷新SRAM全称Static RAM静态随机访问存储器。它为什么叫静态因为它只要不掉电数据就能一直保持不需要任何外部干预。实现原理并不神秘SRAM的每个存储单元通常由6个晶体管组成一对交叉耦合的反相器形成双稳态锁存器——就像两颗钉子互相别住系统稳定在0或1两个状态之一。只要供电不中断这个状态就一直锁着。我做PCB设计的时候特别喜欢SRAM这一点不需要纠结刷新时序、不需要担心刷新电流上电就能用读写访问快速、时序简单。MCU内部的SRAM、CPU的一级二级缓存、路由器里的缓冲表基本都是SRAM的天下。但它的代价也很直接6个晶体管才能存1个bit而且交叉耦合结构决定了它不好做高密度工艺所以同样容量下SRAM的芯片面积大、成本高。这就是为什么你给MCU外扩一片128KB的并行SRAM价格可能比买一颗带1MB内部Flash的MCU还贵而128KB的DRAM几乎可以便宜到忽略不计。2.2 DRAM是漏水的水桶全靠刷新续命DRAM全称Dynamic RAM动态随机访问存储器。动态的意思就是不会一直保持因为它的每个存储单元只有1个晶体管加1个电容靠电容上有没有电荷来表示1和0。问题是电容会漏电电荷会跑所以必须周期性给所有存储单元充电——这就是刷新Refresh操作。另外DRAM的读操作本身是破坏性的读出电荷后电容状态会被破坏读完必须立刻写回这一般由内部逻辑自动完成但会占用时间。这个1T1C的单元结构让DRAM的集成密度远高于SRAM便宜、容量大所以电脑内存条、显卡显存、手机运行内存清一色都是DRAM家族的。但代价是速度慢、需要刷新、时序复杂。如果把SRAM比作一个开得很稳的水龙头打开就是水关上就是关上了那DRAM就是一只底上漏水的缸你得不停地往里续水才能保证里面始终有货。控制器每隔一小段时间就要发Refresh命令所有正在进行的读写都得排队等它先完成任务。刷新不只是消耗时间还会消耗电流所以在电池供电的穿戴设备里用大容量外部DRAM要保持数据不丢功耗是一个不容忽视的问题。我见过一个很有意思的选型对比同样是1MB的存储用SRAM待机电流可能只有几微安但物料成本很高用DRAM物料便宜但待机时必须持续刷新几十毫安的刷新电流根本省不掉。低功耗产品如果只是要个断电数据保存最优解往往是写进Flash而不是挂一块DRAM。2.3 嵌入式里到底选哪种RAM别只看价格说句实在话很多嵌入式工程师一辈子都用不到DRAM因为MCU内部SRAM够跑RTOS和业务逻辑了。到需要用DRAM的时候通常是这几类场景跑Linux/Android这类复杂系统、做大分辨率显示缓存、做摄像头图像帧缓冲、做音频算法的大块数据缓存。这时候SRAM的高成本和高功耗撑不住只能上DRAM而DRAM家族里最常用的就是SDRAM和DDR系列。不过近两年有一种新趋势在中等性能MCU上通过QSPI/OSPI接口接一颗PSRAM伪SRAM其实内部是DRAM加自刷新电路它对外表现像SRAM时序简单、不需要MCU做专门控制器但容量能做到几十Mb价格又远低于真SRAM。我在这类产品上踩过的坑是PSRAM内部自刷新会突然插入总线暂停如果你正在做音频I2S流式播放偶尔会碰到一个毛刺。所以最后我还是给主控加了硬件FMC/SDRAM控制器代价是PCB走线复杂一些但数据吞吐的稳定性完全不是一个量级。3. SDRAM的同步到底同步了什么以及它的时序为啥这么啰嗦3.1 从异步DRAM到同步DRAM一套固定节拍的流程化作业很多初学者看到SDRAM的第一反应是这是不是一个很高级的RAM其实SDRAM就是Synchronous DRAM同步动态随机访问存储器。它和那些老掉牙的FPM/EDO异步DRAM相比核心区别就一个词同步。异步DRAM时代CPU给出地址和读写信号后DRAM内部慢慢干活CPU只能干等干多长时间取决于芯片自身性能和频率没法稳定预测。SDRAM则给整个访问过程引入了一个参考时钟所有命令、地址、数据的进出都与时钟上升沿对齐就像一场所有员工都按照统一节拍器工作的流水线作业吞吐量一下子拉开了。但流程化作业肯定意味着控制变复杂。SDRAM把存储阵列分成若干个Bank访问前要先打开对应的Bank和行Active命令这一行里面的数据会送到一个叫行缓冲器的地方然后你才能通过列地址去取这一行的某几个数据Read命令用完了要关闭这一行Precharge命令还要定期给电容充电Refresh命令。命令之间的间隔也不是随意定的比如tRCD行寻址到列寻址的延时、CLCAS Latency列地址发送到首个数据输出的时钟数、tRFC刷新周期每一个都写死在SDRAM的时序参数里你的内存控制器必须严格照做。我在初期调试SDRAM时最有用的一个比喻把SDRAM想象成一张巨大的网格书架Bank是在第几排Active命令是把某一排的书抽出来放到阅览桌上Read命令是从桌上取某一本用完不还回去就开不了下一排。理解了这个流程datasheet上那些密密麻麻的时间参数就不再是乱码了它们全是抽书-取书-还书-刷新这些动作之间的固定等待时间。3.2 一个实际项目里的SDRAM时序初始化我踩过的坑我之前在某块带LCD的高性能主控方案上外扩了一片SDRAM用于显示缓冲framebuffer和GUI控件存储。画面上总是偶发一条横带撕裂类似屏幕上部正常、下部错位的问题。一开始怀疑是LCD扫描时序配置有问题查了两天没头绪。后来用示波器抓了SDRAM时钟和片选信号发现刷新命令和读写命令经常挤在同一帧里才怀疑到SDRAM初始化参数上。我重新打开主控的内存控制器驱动对照SDRAM芯片手册逐项核对行列地址位宽、Bank数量、刷新周期发现刷新计数器的配置值写错了我按64ms刷新所有行的常见值算出一个数但实际芯片的刷新周期要求是32ms/4096行意味着每行的刷新间隔应该更短。修改刷新计数器和tRFC参数后画面撕裂消失了。这次经历让我学到一个教训SDRAM的寄存器参数不能从网上随便复制必须亲自对着所选芯片的手册和主控参考手册算一遍特别是刷新周期这个值不同容量的颗粒不一样同一颗芯片在不同温度下还会放宽或收紧。另外调试顺序最好是先跑官方或通用内存测试程序确认全地址读写稳定再接LCD。我后来花了一个晚上自己写了个伪随机地址的回文测试把坏位抓出来比直接接外设调试要高效得多。4. NOR Flash和NAND Flash掉电不丢世界里的一对欢喜冤家4.1 NOR Flash能在原地址上执行代码的慢写怪NOR Flash名字里的NOR来自或非门它的存储单元阵列结构使得它的每一位都可被独立随机访问。这意味着你可以像读ROM一样按任意地址直接取数据而不用先读一整页。正是这个特性让NOR Flash支持XIPExecute in Place原地执行代码可以直接在NOR Flash上跑不需要在启动时拷到RAM里再执行。这对于MCU来说太重要了上电复位向量就能直接从Flash取指令系统秒起。但是NOR Flash有它的两大软肋。第一写入数据前必须先擦除而且擦除是按扇区sector进行的一个扇区通常是4KB、32KB或64KB哪怕你只想改一个字节也得先把整个扇区擦除再重新写入。第二擦除和写入速度都比读取慢几个数量级比如读取可以按几十兆波特率跑但擦除一个64KB扇区往往要几百毫秒甚至一秒钟。所以NOR Flash适合放固件、代码、启动加载器、关键配置不适合当文件系统做频繁数据写入。寿命上NOR的擦写次数一般在10万次级别这个数字看着还行但如果某个存储区域每秒被写一次一天就86400次写寿命只有一天多所以磨损均衡在Flash方案里不是可选项是必选项。我做过一个小批量产品初版用NOR Flash存日志每5秒写一条记录结果样机跑了一周就出现配置丢失。后来日志改存到外部大容量NAND FlashNOR只放代码和出厂参数问题才彻底解决。这就是典型的没有搞清楚NOR的写寿命边界的教训。4.2 NAND Flash按页读写的大仓库坏块和纠错是它的命门NAND Flash的存储阵列结构和NOR完全不同它不能随机访问任意字节读取和写入都按页page进行一个页常见是2KB、4KB或者更大擦除则按块block进行一个块由多个页构成常见是128KB、256KB甚至1MB。这个组织结构决定了NAND适合顺序读写、大文件存储不适合像代码那样频繁随机访问。NAND真正麻烦的地方在于底层工艺不保证可靠。因为NAND堆叠密度高、单元间距小天然会存在坏块bad block出厂时就有使用过程中还会产生新的坏块同时读数据可能出现比特翻转bit flip需要ECC纠错编码来检测和修复。所以裸的NAND Flash必须搭配坏块管理、ECC、磨损均衡、垃圾回收这一整套FTLFlash Translation Layer逻辑才能稳定使用。这些逻辑如果放在主控CPU里做会占用大量CPU时间放在专用SSD主控或eMMC控制器里做就是市面上所有U盘、存储卡、SSD的底层原理。一个很有帮助的类比把NAND Flash想成一座码头仓库你只能一箱一箱地搬货按页读写不能打开某个箱子从里面拿一个零件按字节随机读而且这个仓库本身管理不善有些角落是塌的坏块有些货物来说不定上面被水打湿了比特翻转你必须请一套仓库管理系统FTL来记账、修补、定期搬运防止货箱腐烂磨损均衡。相比之下NOR Flash就是一个小货架东西摆得整整齐齐随手就能拿但放不了多少货。4.3 这对冤家的选型细节接口、寿命、控制器成本在实际产品选型里NOR和NAND从来不是谁取代谁的关系而是各司其职。NOR容量往往做到1Mb到256Mb接口除了并行的还有QSPI串行封装引脚少、读速度快很适合放在MCU旁边当外部启动代码存储NAND容量从1Gb起步往上能到几Tb接口有并行8位/16位和串行如SPI NAND密度和单位成本优势极其明显适合存数据、日志、媒体文件、操作系统文件系统。如果产品对启动时间要求极高且固件又大很多方案会采用Boot ROM/NOR启动 NAND存数据的组合这个思路非常常见。另外要注意的是同样是NAND颗粒类型不同寿命也差得很远。SLC是1个单元存1bit寿命最长通常几万到十万次擦写MLC是1个单元存2bit寿命几千到一万次TLC是3bit寿命几百到一千次QLC是4bit寿命就更短了。所以别看到这颗NAND便宜一半就换得算明白你要写多少数据、产品生命周期内要多久刷一遍磨损均衡。我之前在某数据采集器项目里选了TLC颗粒因为产品打算用五年、每天写几十MB日志结果固件团队测试阶段就把磨损均衡算法放弃了最后只能换回“带FTL的eMMC”方案成本和开发周期都远超预期。还有一个容易漏掉的点NOR和NAND的擦写次数指的都是整块擦除后的重新编程次数而且高温下数据保留时间会显著缩短。工业级和消费级Flash的规格就是这么分出来的工业级往往保证更宽的温度范围和更长的数据保持时间。你在选型时看datasheet里的Data Retention那一栏不是看常温下的而是看最高工作温度下的保持时间。同为NOR Flash消费级在85摄氏度下可能只保证10年工业级能到20年甚至更长价格差也由此而来。5. 实践选型跑一圈这套存储器搭配方案我用了好几年5.1 一个典型智能控制器的完整内存地图我拿最近做的一个带触摸屏的智能设备举例。主控选的是带内部Flash和SRAM的MCU但为了跑HMI界面和大缓冲外部还挂了SDRAM固件存储在内部Flash里出厂参数存储在另一片EEPROM里日志和大屏图片资源放到外部的SD NAND里。整个存储布局是这样的数据类别存放介质为什么选它注意事项固件代码内部NOR FlashMCU集成支持XIP上电直接执行速度快、封装小写前必须按扇区擦除OTA升级时要设计双备份全局变量/堆栈内部SRAM高速、时序简单、无需刷新容量有限需要看map文件控制使用率显示缓冲/大算法缓冲外部SDRAM容量大、单位价格低、吞吐量高初始化时序复杂需要认真配置刷新出厂参数/校准数据独立EEPROM或Flash模拟按字节改写、寿命高、掉电保持注意写次数不要高频写入日志/图片/媒体SD NAND带FTL的NAND容量大、可靠性由NAND控制器承载文件系统友好注意文件系统掉电保护防止日志目录损坏字库/关键配置NOR Flash外部QSPI随机读取快、可靠性高可考虑映射成只读区域防止误写这份搭配用了好几个项目都没出过大问题。它体现了一个思路按数据类型把速度、密度、寿命、可修改性四个维度逐一匹配不要试图用一颗Flash包打天下。NOR负责代码和关键只读数据SDRAM负责大块运行数据带控制器的NAND负责大量外部数据存储EEEPROM负责需要频繁小量改写的参数这四者分工明确各自都待在各自性价比最高的位置。如果产品功耗要求特别苛刻外部SDRAM会用得谨慎因为它的刷新电流在待机时也省不掉显示缓冲如果一定要用可以考虑LPDDR或让LCD进入自刷新模式或者降级采用带自刷新的PSRAM。我那个低功耗版本最后确实把SDRAM换成PSRAM尽管吞吐量略降但待机功耗从毫安级降到了微安级整个产品形态都变了。5.2 我保留的几条存储选型铁律这几条是我从各种教训里沉淀出来的算不上系统方法论但实用。第一能放在内部就不放外部。内部Flash和SRAM的走线、时序、可靠性都由MCU厂家负责你只要在配置工具里勾选就行外部存储一接上就要面对PCB布局、信号完整性、初始化时序、坏块管理等一堆问题。外部存储是为了解决内部容量不足不是为了看起来更专业。第二所有NAND类或者大容量Flash应用都认真算刷新和磨损。哪怕你不懂FTL内部实现也要留好“分区规划”的余地比如日志分区、配置分区、升级分区分开管理避免某个分区被频繁擦写拖垮整盘寿命。第三调试存储相关硬件时不要跳过读写测试环节。任何外扩的SDRAM、NOR、NAND上电后先跑一遍标准的地址线、数据线测试地址线相邻短路、数据线粘连都能测出来再接文件系统、再接应用。这一步省下来的时间永远比花费的时间多。有一次我在某产品上跳过这一步直接调文件系统结果写文件随机报错排查了很久才定位到是数据线有一根虚焊如果提前跑32位数据线测试可能半小时就结束了。第四多看map文件和编译报告。很多存储相关的问题不是芯片选错了而是工程配置导致某个段超出了物理存储范围链接器和编译器其实已经警告过了却被大家忽略了。养成每次编译后看Flash/RAM占用率的习惯可以避开大量的隐性Bug。6. 我是怎么把这一串名字理成一条记忆主线的看到这里前面那些含义你现在应该能梳理出一个主干了先把存储分成掉电丢不丢两条线RAM线路只关心速度ROM线路只关心数据保持再在RAM里区分要不要刷新SRAM不用、DRAM要用DRAM里分同时钟不SDRAM同步了DDR也是它的后辈在ROM线路里Flash接过现代大旗再按能不能原地执行、按字节读还是按页按块读、密度更极致来区分NOR和NAND。这一条主线靠场景串起来比死记硬背名词好记得多。最后再分享一个我做板子调试时的习惯上电先不急着跑业务代码而是先判断板上每一颗存储芯片的身份归属——它是掉电保持的ROM/Flash还是运行时才需要的RAM它需要刷新、需要ECC、需要坏块管理吗把这些问题写在原理图上对应的网络标号旁边作为BOM评审时的注释。这个方法帮我在后续维护和转交接时省了很多口水因为每一个后来接手的人都能一眼看懂为什么这颗芯片在这为什么这颗芯片必须在那。存储这东西不深奥无非是芯片内部的保持和速度在做权衡产品上的成本和功耗也在做权衡。把权衡做好了你手里的方案真正落地的那一天自然会理解这些名词背后那些实实在在的本事。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询