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主要扮演这几个角色:

  1. 程序存储器:存放固件代码,通常是NOR Flash或内部Flash
  2. 数据存储器:存放文件系统、数据库、日志等,通常是NAND Flash
  3. 配置存储器:存放MAC地址、校准参数、用户设置等,常用EEPROM或小容量NOR
  4. 启动引导: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会有那些奇奇怪怪的特性。嗯,到时候我会拿我踩过的一个坑来举例,保证让你印象深刻。