1. Flash存储技术概述:Flash发展历史、NOR vs NAND对比、Flash在嵌入式系统中的地位
各位同学好,我是老张。做嵌入式存储这块十几年了,今天咱们聊聊Flash存储技术。说实话,Flash这东西看着简单,但坑是真不少。我刚开始做驱动时,就因为没搞懂NOR和NAND的区别,差点把整个项目带沟里去。
嗯,咱们先从根上说起。
1.1 Flash发展历史:从EPROM到3D NAND
Flash存储器是1984年由东芝的舛冈富士雄博士发明的。当时他提出了一种全新的浮栅晶体管结构,能实现电可擦除。这玩意儿比EPROM方便太多了——EPROM得用紫外线灯照半天才能擦除,你想想看,那得多麻烦。
Flash的发展大致经历了这几个阶段:
- 1984年:NOR Flash诞生,东芝首次展示
- 1987年:NAND Flash问世,同样是东芝的手笔
- 1990年代:Flash开始大规模替代EPROM和EEPROM
- 2000年代:NAND容量突破GB级别,手机、U盘全面普及
- 2010年代:3D NAND技术出现,堆叠层数从32层一路干到200多层
- 现在:QLC、PLC都在搞,容量越来越大,但寿命嘛...嗯,后面会讲
我个人印象最深的是:2008年我在做一款工业控制器,用的还是256MB的NOR Flash。那时候觉得容量好大啊。现在呢?随便一个手机都是256GB起步。技术迭代的速度,真的让人感慨。
1.2 NOR vs NAND:核心差异对比
很多新手搞不清NOR和NAND到底有啥区别。说白了,它们俩的存储单元结构不同,导致读写方式、性能、可靠性都完全不一样。
我直接上表格,这样对比最清楚:
| 对比项 | NOR Flash | NAND Flash |
|---|---|---|
| 存储单元结构 | 并联结构,每个单元独立连接位线 | 串联结构,多个单元共享位线 |
| 读取方式 | 随机读取,类似SRAM | 页读取,必须整页读 |
| 读取速度 | 快,约50-100ns | 较慢,约20-50μs(首次读取) |
| 写入速度 | 慢,约1-5MB/s | 快,约10-40MB/s |
| 擦除速度 | 慢,约0.1-1s/扇区 | 快,约1-5ms/块 |
| 容量密度 | 低,通常≤512MB | 高,可达TB级别 |
| 位翻转率 | 极低,几乎不需要ECC | 较高,必须使用ECC |
| 坏块管理 | 不需要 | 必须管理坏块 |
| 典型应用 | 代码执行、启动引导 | 大容量数据存储 |
| 价格 | 贵,约$0.5-2/MB | 便宜,约$0.01-0.1/MB |
避坑指南:我曾经在一个项目里直接用NAND Flash存代码,结果上电后CPU死活跑不起来。后来才发现,NAND的随机读取延迟太大,CPU根本等不了。所以记住:代码执行用NOR,数据存储用NAND,这是铁律。
1.3 NOR Flash的详细特点
NOR Flash最大的优势就是随机读取快。它的接口跟SRAM很像,给个地址就能直接读到数据。这意味着CPU可以直接在NOR上执行代码(XIP,eXecute In Place),不需要先把代码拷贝到RAM里。
我做过一个项目,用的就是SPI NOR Flash。当时选型时纠结了好久,最后选了Winbond的W25Q64。为什么?因为它的读取速度能到104MHz,配合Quad SPI模式,读取带宽能到50MB/s以上。对于我们的RTOS系统来说,完全够用了。
NOR Flash的缺点也很明显:
- 写入慢:写入前必须先擦除,擦除时间很长
- 容量小:受限于工艺,很难做大容量
- 价格贵:每MB成本是NAND的10倍以上
所以NOR Flash现在主要用在:BIOS/UEFI、路由器固件、工业控制器、汽车ECU这些对可靠性要求高、容量需求不大的场景。
1.4 NAND Flash的详细特点
NAND Flash走的是另一条路。它的存储单元是串联的,所以密度可以做得很高。但代价就是不能随机读取,必须按页来读(通常一页2KB-16KB)。
NAND Flash的写入也很有意思。它支持页编程,写入速度比NOR快很多。但擦除必须按块来(一块通常包含64-256页)。这就引出了一个问题:写放大。
什么叫写放大?举个例子:你想修改一个字节,但NAND不支持直接改。你得先把整个块读出来,在内存里修改,然后擦除整个块,最后把整个块写回去。你看,改1个字节,实际写了整个块(比如128KB),写放大倍数就是131072倍。
注意:NAND Flash有寿命限制。SLC大约10万次擦写,MLC约3000-10000次,TLC约1000-3000次,QLC只有500-1000次。我见过有人用TLC做日志存储,结果三个月就报废了。所以选型时一定要算好寿命。
NAND Flash还需要坏块管理。出厂时就可能有坏块,使用过程中还会产生新的坏块。驱动必须能识别并跳过这些坏块。这个后面章节会详细讲。
1.5 Flash在嵌入式系统中的地位
说句实在话,没有Flash,就没有现代嵌入式系统。你想想看,单片机需要存程序吧?需要存配置参数吧?需要存运行日志吧?这些全得靠Flash。
在嵌入式系统里,Flash主要扮演这几个角色:
- 程序存储器:存放固件代码,通常是NOR Flash或内部Flash
- 数据存储器:存放文件系统、数据库、日志等,通常是NAND Flash
- 配置存储器:存放MAC地址、校准参数、用户设置等,常用EEPROM或小容量NOR
- 启动引导:Bootloader必须放在NOR Flash或内部Flash里
我做过一个物联网网关项目,里面用了三种Flash:
- 一颗8MB的NOR Flash放Bootloader和Linux内核
- 一颗128MB的NAND Flash放根文件系统和应用程序
- 一颗64KB的EEPROM放设备配置参数
你看,不同的存储需求,用的器件完全不同。这就是为什么我说搞嵌入式存储,先得搞清楚你的需求是什么。
核心观点:Flash在嵌入式系统中的地位,就像地基在房子里的地位。你看不见它,但没有它,整个系统就塌了。所以做驱动开发,一定要把Flash的脾气摸透——它什么时候快、什么时候慢、什么时候会出错、什么时候会坏掉。这些,都是咱们后面要讲的重点。
1.6 本章小结
好,咱们捋一下这章的核心内容:
- Flash从1984年发展到现在,经历了从NOR到NAND、从2D到3D的演进
- NOR Flash适合代码执行,NAND Flash适合数据存储
- NOR快、贵、容量小;NAND慢(随机读)、便宜、容量大
- NAND需要ECC、坏块管理、写放大处理
- 嵌入式系统里Flash无处不在,选型要按需匹配
下一章,咱们会深入讲Flash的物理结构和工作原理。搞懂了这个,你才能理解为什么Flash会有那些奇奇怪怪的特性。嗯,到时候我会拿我踩过的一个坑来举例,保证让你印象深刻。