首页/新闻资讯/正文详情

EEPROM与FLASH选型指南:从原理到嵌入式实战

发布时间:2026/9/25 10:15:10 来源:云帆数科 栏目:资讯中心
EEPROM与FLASH选型指南:从原理到嵌入式实战
1. 存储选型的困惑为什么嵌入式工程师总在EEPROM和FLASH之间纠结做嵌入式开发的朋友尤其是刚入行一两年的几乎都会在某个时刻被一个问题卡住这块板子上要存点参数到底该用EEPROM还是FLASH我当年第一次画板子的时候随手选了一颗EEPROM结果后来发现容量不够用换FLASH又发现擦写粒度太大改一个字节要把整页擦掉折腾了好几天。后来做多了才明白这两个东西虽然都是非易失性存储器断电都能保住数据但它们的底层原理、访问方式、适用场景差别非常大选错了不是不能用而是用起来别扭成本还高。这篇文章我想把EEPROM和FLASH的区别讲透不只是列个对比表格就完事而是从存储原理、擦写机制、接口方式、寿命计算、成本结构这几个维度展开结合嵌入式开发中实际会遇到的场景比如I2C读写EEPROM的代码怎么写、SPI NOR FLASH的ID怎么查、STM32写FLASH要注意什么、汽车电子里为什么偏爱EEPROM等等。不管你是做MCU裸机开发、嵌入式Linux应用开发还是FPGA读写FLASH这些底层逻辑都是通用的。适合谁看如果你正在选型存储方案、正在调试FLASH下载失败的问题、或者想搞清楚为什么有的参数存EEPROM有的存FLASH那这篇内容应该能帮你省下不少查资料和踩坑的时间。我会尽量用生活化的类比来解释技术原理同时给出可以直接参考的代码和参数计算方法让不同基础的读者都能有所收获。2. 从存储原理看本质EEPROM和FLASH到底哪里不一样2.1 浮栅晶体管两者共同的物理基础要理解EEPROM和FLASH的区别得先从它们的存储单元说起。两者本质上都基于浮栅晶体管Floating Gate Transistor技术。你可以把这个结构想象成一个三明治控制栅在上面浮栅在中间沟道在下面浮栅被绝缘层包裹得严严实实。往浮栅里注入电子相当于往一个密封的盒子里塞东西塞进去了就代表存了“0”把电子抽走就代表“1”。断电之后这些电子因为没有泄放路径会一直待在里面这就是非易失性的来源。那EEPROM和FLASH的区别在哪关键在于存储单元的排列方式和擦除的粒度。EEPROM的全称是Electrically Erasable Programmable Read-Only Memory它的每个存储单元都可以独立寻址、独立擦写。也就是说你想改第3个字节直接改第3个字节就行旁边的字节不受影响。FLASH则不同它的存储单元被组织成块Block或扇区Sector擦除操作必须以块或扇区为单位不能单独擦一个字节。你可以把EEPROM想象成一排独立的小抽屉每个抽屉都能单独打开清理FLASH则像一个大柜子要清理就得把整个抽屉层一起拉出来倒空。这个差异直接导致了两者在写入操作上的不同。EEPROM可以按字节写FLASH必须先擦后写而且擦的是整块。很多新手在STM32上写FLASH时遇到“写不进去”的问题十有八九是忘了先擦除或者擦除的地址范围不对。2.2 擦写粒度与写入方式的实际影响擦写粒度的差异在实际开发中影响很大。举个例子假设你要存一个配置参数总共16个字节每次修改只改其中1个字节。用EEPROM的话直接调用I2C写一个字节就行其他15个字节不动。用FLASH的话你得先把这16个字节所在的整个扇区读到RAM里修改目标字节擦除整个扇区再把16个字节写回去。这个过程不仅麻烦而且频繁擦写会加速FLASH老化。那为什么FLASH还要这么设计因为FLASH的存储密度更高、成本更低。FLASH的存储单元结构比EEPROM简单同样的晶圆面积能做出更大的容量。EEPROM因为每个单元都要独立寻址需要额外的选择晶体管单元面积大成本高所以容量通常很小常见的是几KB到几百KB。FLASH则可以从几MB到几GB甚至更大。这就是为什么大容量存储用FLASH小容量参数存储用EEPROM。还有一个细节值得注意EEPROM的擦写寿命通常是100万次左右而FLASH的擦写寿命一般在1万到10万次之间。这个差距在需要频繁更新数据的场景下非常关键。比如汽车电子里的里程表、故障码存储可能每天都要写好几次用FLASH的话几年下来就可能把某个扇区写坏。所以汽车电子里大量使用EEPROM来存关键参数虽然贵一点但可靠性高。2.3 NOR FLASH和NAND FLASH的分野FLASH内部又分为NOR FLASH和NAND FLASH两大阵营这个区分在嵌入式开发中也很重要。NOR FLASH的特点是随机读取速度快支持按字节读取可以直接在芯片上执行代码XIPeXecute In Place。很多MCU内部集成的FLASH就是NOR类型的程序直接在里面跑。NAND FLASH则不同它的读取是按页进行的随机读取速度慢但容量大、成本低适合做数据存储比如U盘、SSD、eMMC里面用的就是NAND。在嵌入式Linux开发中NOR FLASH通常用来存Bootloader和内核NAND FLASH用来存文件系统。如果你在查FLASH ID的时候发现读出来的是NOR的ID那就说明这颗芯片适合直接跑代码如果是NAND的ID那就得先初始化控制器按页读取。查FLASH ID的方法通常是通过SPI或QSPI接口发送特定的命令比如NOR FLASH的0x9F命令可以读出厂商ID和设备IDNAND FLASH的0x90命令可以读出制造商ID和设备ID。这些命令在芯片手册里都有详细说明实际调试时用逻辑分析仪抓一下SPI波形就能确认。2.4 接口方式I2C、SPI、QSPI和并行接口EEPROM和FLASH的接口方式也影响选型。EEPROM常见的是I2C和SPI接口I2C的EEPROM最常用因为两根线就能搞定速度虽然不快标准模式100kHz快速模式400kHz高速模式3.4MHz但胜在简单。SPI的EEPROM速度更快可以到几MHz甚至几十MHz但占用的引脚多。FLASH则主要是SPI、QSPI和并行接口。SPI NOR FLASH在嵌入式里非常常见QSPIQuad SPI可以四线并行传输速度更快适合需要快速启动的场景。在FPGA读写FLASH的场景中QSPI用得比较多因为FPGA需要从FLASH加载配置数据速度太慢会影响启动时间。Verilog实现QSPI读写FLASH的代码需要处理时钟分频、命令发送、数据收发等环节状态机的设计是关键。这个后面会详细讲。3. 嵌入式开发中的选型逻辑什么场景该用哪个3.1 参数存储EEPROM的主场在嵌入式开发中EEPROM最典型的应用就是参数存储。比如设备的校准系数、用户配置、网络参数、累计运行时间等这些数据量不大但需要频繁修改而且每次修改只改几个字节。用EEPROM的话I2C接口简单按字节读写方便寿命也够用。我做过一个工业采集设备需要每隔几分钟记录一次传感器校准值总共32个字节每天大概写100次。用EEPROM的话100万次寿命可以撑27年完全够用。如果用FLASH假设扇区大小是4KB每天擦写100次1万次寿命只能撑100天显然不行。所以这种场景下EEPROM是唯一合理的选择。I2C读写EEPROM的代码其实不复杂以AT24C02为例写一个字节的流程是发送起始条件发送设备地址加写标志发送内存地址发送数据发送停止条件。读一个字节的流程是发送起始条件发送设备地址加写标志发送内存地址发送起始条件发送设备地址加读标志读取数据发送NACK发送停止条件。实际写代码时要注意页写的限制AT24C02每页8个字节跨页写会回卷到页首导致数据写错位置。所以写多个字节时要按页对齐或者每写一个字节就发一次停止条件。注意I2C EEPROM写操作后需要等待5ms左右的内部写周期期间不会响应任何I2C命令。如果连续写多个字节每次都要等写周期结束否则数据会丢失。很多新手在这里踩坑以为写完了就直接读结果读出来是旧数据。3.2 程序存储FLASH的天然优势FLASH最大的优势是容量大、成本低、可以直接执行代码。MCU内部的程序存储器基本都是FLASH因为程序代码量大而且不需要频繁修改。STM32的FLASH通常按扇区组织比如STM32F103的FLASH扇区大小从1KB到2KB不等STM32F4的扇区更大从16KB到128KB。写FLASH之前必须先擦除擦除的最小单位是扇区。STM32写FLASH的步骤大致是解锁FLASH写KEY擦除扇区配置CR寄存器设置SER位和SNB位然后置STRT位等待擦除完成检查BSY位然后按半字或字写入数据。写入地址必须是偶数半字对齐或4的倍数字对齐否则会报错。写完之后要重新上锁防止误操作。这里有个常见的坑FLASH擦除后所有位都是1写入只能把1变成0不能把0变成1。所以如果你要修改某个数据不能直接覆盖写必须先擦除。很多人在调试时发现写进去的数据不对就是因为没有擦除或者擦除的扇区不对。另外STM32的FLASH在擦写期间CPU会暂停执行如果程序正在FLASH里跑擦写操作会导致程序卡顿。解决办法是把擦写代码放到RAM里执行或者用双Bank FLASH交替操作。3.3 大容量数据存储NAND FLASH和eMMC当数据量到了MB甚至GB级别EEPROM和NOR FLASH都不合适了这时候NAND FLASH和eMMC就派上用场。NAND FLASH的存储密度极高成本低但有个致命缺点坏块。NAND FLASH出厂时就可能存在坏块使用过程中还会产生新的坏块所以必须配合坏块管理和ECC校验。嵌入式Linux里的MTD子系统就是专门管理NAND FLASH的负责坏块扫描、ECC纠错、磨损均衡等。eMMC则是在NAND FLASH基础上集成了控制器对外提供标准的块设备接口坏块管理和ECC都在内部完成用起来简单很多。在嵌入式Linux应用开发中eMMC通常用来存根文件系统和用户数据NAND FLASH则更多用在成本敏感的场合。如果你在Ubuntu下开发嵌入式Linux交叉编译工具链和内核源码的配置是第一步这个和存储选型关系不大但存储驱动的配置会影响启动流程。3.4 汽车电子为什么偏爱EEPROM汽车电子对可靠性的要求极高温度范围要覆盖-40°C到125°C寿命要满足15年以上的使用周期。在这种场景下EEPROM因为擦写寿命长、按字节操作方便、数据保持能力强成为参数存储的首选。比如安全气囊的配置数据、发动机的标定参数、变速箱的学习值这些都需要频繁更新且不能丢失EEPROM的100万次擦写寿命和200年的数据保持时间典型值正好满足需求。FLASH在汽车电子里也有应用比如存程序代码、存地图数据但很少用来存频繁更新的参数。而且汽车级的EEPROM和FLASH都要通过AEC-Q100认证价格比消费级贵不少。选型时不能只看参数还要看供应商的资质和长期供货能力。4. 实操细节I2C读写EEPROM和SPI读写FLASH的完整流程4.1 I2C读写EEPROM的代码实现与避坑先来看I2C读写EEPROM的完整流程。以AT24C02为例设备地址是0xA0写和0xA1读具体取决于A0-A2引脚的接法。写一个字节的函数大概长这样void EEPROM_WriteByte(uint8_t devAddr, uint8_t memAddr, uint8_t data) { I2C_Start(); I2C_SendByte(devAddr | 0x00); // 写地址 I2C_WaitAck(); I2C_SendByte(memAddr); // 内存地址 I2C_WaitAck(); I2C_SendByte(data); // 数据 I2C_WaitAck(); I2C_Stop(); Delay_ms(5); // 等待内部写周期 }读一个字节的函数uint8_t EEPROM_ReadByte(uint8_t devAddr, uint8_t memAddr) { uint8_t data; I2C_Start(); I2C_SendByte(devAddr | 0x00); // 写地址 I2C_WaitAck(); I2C_SendByte(memAddr); // 内存地址 I2C_WaitAck(); I2C_Start(); // 重复起始条件 I2C_SendByte(devAddr | 0x01); // 读地址 I2C_WaitAck(); data I2C_ReadByte(); I2C_SendNack(); // 最后一个字节发NACK I2C_Stop(); return data; }这段代码看起来简单但有几个坑要注意。第一写周期等待不能省AT24C02的写周期最大5ms如果不等待直接发下一个命令EEPROM不会响应数据会丢。第二页写边界要处理AT24C02每页8字节如果从地址0x07开始写4个字节写到0x08时会回卷到0x00而不是继续到0x08。所以写多字节时要先计算当前页剩余空间分多次写。第三上拉电阻要选对I2C总线的上拉电阻一般是4.7kΩ到10kΩ阻值太大会导致上升沿变缓通信失败阻值太小会增加功耗。实测下来4.7kΩ在3.3V系统里比较稳。4.2 SPI NOR FLASH的ID查询与读写操作SPI NOR FLASH的操作比I2C EEPROM复杂一些因为涉及命令集和状态寄存器。第一步通常是查FLASH ID确认芯片型号和容量。以W25Q64为例发送0x9F命令可以读出厂商ID0xEF和设备ID0x4017其中0x40表示SPI NOR FLASH0x17表示64Mbit容量。代码大概是这样uint32_t FLASH_ReadID(void) { uint32_t id 0; FLASH_CS_Low(); SPI_SendByte(0x9F); // 读ID命令 id | SPI_SendByte(0xFF) 16; // 厂商ID id | SPI_SendByte(0xFF) 8; // 设备ID高字节 id | SPI_SendByte(0xFF); // 设备ID低字节 FLASH_CS_High(); return id; }读数据用0x03命令写数据用0x02命令但写之前必须先擦除。擦除命令有扇区擦除0x204KB、块擦除0xD864KB、整片擦除0xC7。擦除和写入之前都要先发写使能命令0x06然后读状态寄存器0x05等待BUSY位清零。这个流程不能省否则命令不会执行。注意SPI NOR FLASH的写入粒度是页通常256字节跨页写会回卷到页首。和I2C EEPROM的页写问题一样写多字节时要按页对齐。另外FLASH的擦除时间比较长扇区擦除典型值45ms块擦除150ms整片擦除可能要几十秒操作时要有超时处理。4.3 FPGA读写FLASH的Verilog实现要点FPGA读写FLASH的场景通常是加载配置数据或存储采集数据。用Verilog实现QSPI读写FLASH时核心是一个状态机负责处理命令发送、地址发送、数据收发、等待忙状态等环节。状态机的状态包括IDLE、CMD、ADDR、DATA、WAIT、DONE等。时钟分频模块要根据FLASH的最高时钟频率来设置比如W25Q64的最高SPI时钟是104MHz但FPGA初始调试时可以先降到10MHz稳定后再提速。写FLASH的状态机流程是拉低CS发送写使能命令0x06拉高CS拉低CS发送页写命令0x02发送24位地址发送数据拉高CS然后轮询状态寄存器直到BUSY位清零。读FLASH的流程类似只是命令换成0x03数据方向相反。Verilog代码里要注意跨时钟域的问题SPI时钟和系统时钟不同步时要用双触发器同步信号否则会出现亚稳态。4.4 STM32写FLASH的完整步骤与参数计算STM32写FLASH的步骤前面提过这里补充一下参数计算。假设你要存1000个采样点每个点2字节总共2000字节。STM32F103的扇区大小是1KB或2KB2000字节需要2个扇区如果扇区是1KB或1个扇区如果扇区是2KB。擦除时间方面STM32F103的扇区擦除典型值是20ms到40ms写入一个字32位的时间是几十微秒。如果每秒写100个点每个点2字节相当于每秒写50个字写入时间可以忽略但擦除操作不能频繁做。更好的方案是环形缓冲区把FLASH分成多个扇区轮流写入写满一个扇区后擦除最旧的扇区。这样可以大大延长FLASH寿命。假设FLASH有10个扇区可用每个扇区擦写1万次总寿命就是10万次。如果每天擦写10次可以撑27年。这个思路在数据记录仪里很常用。4.5 常见错误排查速查表问题现象可能原因排查方法I2C EEPROM写不进去写周期未等待每次写后延时5msI2C EEPROM读出来是0xFF设备地址错误用逻辑分析仪抓波形确认地址SPI FLASH ID读出来是0xFFFFFFCS未拉低或时钟极性错误检查CS时序和CPOL/CPHA设置SPI FLASH写数据失败未发写使能命令写前发0x06命令STM32 FLASH写失败未擦除或地址未对齐先擦扇区地址按半字对齐FLASH下载失败Cortex-M3芯片被读保护或时钟配置错误用烧录器解除读保护检查时钟NAND FLASH读数据有坏块未做坏块管理扫描坏块表跳过坏块QSPI FLASH读写不稳定时钟太快或走线太长降低时钟缩短走线加匹配电阻5. 寿命、成本与可靠性的深度权衡5.1 擦写寿命的计算方法与延长策略擦写寿命是选型时最容易忽略但又最关键的参数。EEPROM的100万次和FLASH的1万次看起来差距很大但实际影响要看写入频率。假设一个设备每天写100次EEPROM可以撑27年FLASH只能撑100天。但如果每天只写1次FLASH也能撑27年。所以写入频率是决定因素。延长FLASH寿命的常用策略有几种。第一种是磨损均衡把写入操作分散到不同的扇区避免某个扇区被反复擦写。第二种是数据压缩减少写入量。第三种是缓存机制把数据先写到RAM积累到一定量再一次性写入FLASH。第四种是日志式存储每次写新数据而不是覆盖旧数据写满后再擦除。这些策略在嵌入式文件系统如LittleFS、SPIFFS里都有实现可以直接用。EEPROM虽然寿命长但也不是无限写。如果某个地址被反复写比如每秒写一次100万次也只能撑11天。所以EEPROM也需要做地址轮换把数据写到不同的地址用计数器记录最新位置。这个技巧在存累计运行时间、里程数等场景下很实用。5.2 成本结构的差异与选型建议成本方面EEPROM的单位容量价格比FLASH高很多。一颗128KB的I2C EEPROM可能要几块钱而一颗8MB的SPI NOR FLASH可能只要两三块。但如果只需要存几百字节的参数EEPROM的总成本反而更低因为FLASH需要更大的PCB面积和更多的引脚。所以选型时要看总拥有成本不只是芯片价格。我的经验是数据量小于64KB、写入频繁、需要按字节修改的场景优先选EEPROM数据量大于64KB、写入不频繁、可以按块操作的场景选FLASH数据量大于1MB、需要文件系统支持的场景选NAND FLASH或eMMC。这个分界线不是绝对的但可以作为快速判断的依据。5.3 数据保持能力与环境影响数据保持能力方面EEPROM通常标称200年FLASH标称20年。这个差异在高温环境下会更明显。温度每升高10°C数据保持时间大约减半。所以汽车电子里用EEPROM不只是因为寿命长还因为高温下的数据保持能力更好。如果你的设备工作在高温环境比如发动机舱、工业烤箱附近EEPROM是更稳妥的选择。另外辐射也会影响存储器的数据保持能力。在航天、核工业等场景下需要用抗辐射加固的存储器普通EEPROM和FLASH都不行。这个属于特殊领域一般嵌入式开发不会涉及但了解一下有好处。6. 调试实录那些年我踩过的FLASH和EEPROM的坑6.1 FLASH下载失败的各种姿势调试FLASH时最让人头疼的就是下载失败。我遇到过好几次“error: flash download failed - target dll has been cancelled”每次原因都不一样。有一次是芯片被读保护了需要先解除保护有一次是时钟配置错误外部晶振没起振导致FLASH编程时钟不对还有一次是调试器驱动版本太老换了新版本就好了。后来我总结了一个排查顺序先确认芯片是否被保护再确认时钟是否正常然后确认调试器连接是否稳定最后检查FLASH算法文件是否匹配。还有一次更离谱Keil里改了FLASH大小但算法文件没更新导致下载地址超出实际FLASH范围一直报错。后来在Keil的Options for Target里把FLASH大小改成实际值重新选算法文件才解决。这个坑很隐蔽因为编译能过就是下载失败。6.2 EEPROM数据丢失的排查过程EEPROM数据丢失的问题我也遇到过。有一次客户反馈设备参数偶尔会恢复出厂值查了半天发现是I2C总线上的上拉电阻太大导致通信误码EEPROM写入了错误数据。后来把上拉电阻从10kΩ换成4.7kΩ问题就消失了。还有一次是电源掉电时EEPROM正在写导致数据写了一半下次上电读出来就是乱码。解决办法是在电源端加一个大电容保证掉电后EEPROM能完成写周期或者在软件里做双备份存两份数据读的时候校验。提示EEPROM的写周期期间如果掉电数据可能损坏。重要参数建议存两份读的时候比较两份数据如果不一致就用备份恢复。这个技巧在工业设备里很常见。6.3 FLASH ID查询的意外发现查FLASH ID时也遇到过意外。有一次读出来ID是0xEF4017以为是W25Q64结果容量对不上后来查手册发现0x17对应的是64Mbit但实际芯片是32Mbit的W25Q32ID应该是0xEF4016。原来是采购换料了但BOM没更新。这件事提醒我FLASH ID一定要在代码里做校验不匹配就报错避免用错芯片导致数据存储异常。还有一次用QSPI读FLASH ID读出来全是0xFF查了半天发现是QSPI的IO模式配置错了应该用单线模式读ID结果配成了四线模式。改成单线模式后就正常了。这个细节在芯片手册里有说明但很容易忽略。6.4 嵌入式Linux下的FLASH分区与文件系统在嵌入式Linux应用开发中FLASH的分区配置是个关键环节。NOR FLASH通常分成Bootloader、内核、设备树、文件系统几个分区NAND FLASH还要加坏块管理和ECC配置。分区表一般在设备树里定义或者用MTD工具动态分区。文件系统方面NOR FLASH常用JFFS2或UBIFSNAND FLASH常用UBIFS或YAFFS2。选文件系统时要考虑挂载速度、擦写寿命、掉电保护等因素。我在Ubuntu下开发嵌入式Linux时交叉编译工具链的配置和内核源码的修改是第一步。存储驱动的配置在make menuconfig里的Device Drivers - MTD devices support里需要根据实际芯片选对应的驱动。调试时可以用mtd_debug工具读写FLASH用flash_erase擦除用nanddump查看数据。这些工具在mtd-utils包里交叉编译后放到目标板上就能用。7. 一些实用的经验参数和选型对照7.1 常用EEPROM和FLASH型号参数对照型号类型容量接口擦写寿命数据保持典型应用AT24C02EEPROM2KbitI2C100万次200年参数存储AT24C256EEPROM256KbitI2C100万次200年配置存储W25Q64NOR FLASH64MbitSPI/QSPI10万次20年程序存储W25Q128NOR FLASH128MbitSPI/QSPI10万次20年数据存储MT29F4G08NAND FLASH4Gbit并行10万次10年文件系统STM32F103内部FLASHNOR FLASH64KB-512KB内部1万次20年程序存储这个表格里的参数是典型值实际选型时要看具体芯片手册。比如W25Q64的擦写寿命标称10万次但这是整片擦写的寿命单个扇区的寿命可能更低。NAND FLASH的寿命还和ECC强度有关ECC越强寿命越长。7.2 选型决策的快速判断流程面对一个存储需求可以按这个流程快速判断数据量小于64KB写入频繁每天超过10次需要按字节修改 - EEPROM数据量小于64KB写入不频繁可以按块修改 - SPI NOR FLASH数据量大于64KB需要存文件 - NAND FLASH或eMMC需要直接执行代码 - NOR FLASH高温环境超过85°C - EEPROM或汽车级FLASH成本极度敏感 - 内部FLASH或NAND FLASH这个流程不是绝对的但能帮你快速缩小选型范围。实际选型时还要考虑供货周期、封装尺寸、引脚数量等因素。7.3 代码层面的通用建议不管用EEPROM还是FLASH代码层面有几个通用建议。第一抽象存储接口把读写操作封装成统一的函数换芯片时只改底层驱动上层代码不动。第二加校验每个数据块加CRC或校验和读的时候校验不对就用备份恢复。第三加版本号数据结构变化时能识别旧版本数据并做兼容处理。第四加写保护重要数据写完后锁定防止误操作。第五加日志记录每次读写操作方便排查问题。这些建议看起来简单但实际做项目时能省很多事。我见过太多项目因为存储问题导致现场故障最后查出来都是没加校验或没做备份。存储虽然只是嵌入式系统的一小部分但它的可靠性直接影响整个产品的口碑。7.4 关于FLASH和EEPROM的未来趋势从趋势上看EEPROM的市场在逐渐缩小很多场景被FLASH替代尤其是MCU内部FLASH容量越来越大很多参数直接存内部FLASH就行。但EEPROM在汽车电子、工业控制、医疗设备等对可靠性要求高的领域仍然不可替代。FLASH则在往更大容量、更高速度、更低功耗的方向发展比如UFS、NVMe等新接口不断涌现。对于嵌入式开发者来说理解两者的底层原理和适用场景比记住具体型号更重要。技术会变但存储的基本原理不会变。掌握了这些面对新的存储技术也能快速上手。最后分享一个小技巧如果你不确定选哪个可以先在开发板上用EEPROM和FLASH各做一个版本实测写入速度、擦除时间、功耗、寿命用数据说话。我当年就是这么做的虽然多花了两天时间但后面选型再也没纠结过。

相关推荐

微信个人号二次开发实战:基于WTAPI框架快速搭建微信机器人
微信个人号二次开发实战:基于WTAPI框架快速搭建微信机器人

参考资料WTAPI框架 接口路径、参数与回调字段以api文档weiti.apifox.cn 为准。在微信生态运营中,个人微信机器人开发已成为提升效率的关键技术。本文将详细介绍如何使用WTAPI框架进行微信机器人二次开发,从环境搭建到功能实现,帮助您快速掌握… · 2026/9/25 10:15:04

vLLM部署LLama2-7B实战:PagedAttention与连续批处理高并发调优
vLLM部署LLama2-7B实战:PagedAttention与连续批处理高并发调优

1. 为什么选vLLM跑LLama2-7B,而不是继续用HuggingFace原生推理如果你之前用transformers库直接加载过LLama2-7B做推理,大概率经历过这样的场景:单条请求响应还算能忍,一旦并发上来,显存直接爆掉,或者吞吐量… · 2026/9/25 10:15:04

Win10日历节日红字看不清?改这3个设置即可恢复清晰
Win10日历节日红字看不清?改这3个设置即可恢复清晰

先把话放前面:win10日历里那一堆中国传统节日的红字,真的不是每次都能让人看清楚。我自己就遇到过好几次,春节前一天打开日历想确认放假安排,屏幕上“春节”两个字和背景糊在一起,得歪着头凑近才能分清楚。后来把系统主… · 2026/9/25 10:15:04

LLMs之HumanEval:HumanEval的简介、安装、使用方法之详细攻略——TaoToken统一API通道下的Python代码评测实战
LLMs之HumanEval:HumanEval的简介、安装、使用方法之详细攻略——TaoToken统一API通道下的Python代码评测实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 10:39:31

从行为克隆到ACT:Ventuno Q机器人模仿学习部署实践
从行为克隆到ACT:Ventuno Q机器人模仿学习部署实践

1. 为什么偏偏是ACT:从行为克隆到动作分块的进化1.1 行为克隆的瓶颈:平均动作陷阱第一次在Ventuno Q上尝试模仿学习时,我的第一反应其实是拿行为克隆(Behavior Cloning,BC)直接上。毕竟最朴素的做法&#x… · 2026/9/25 10:39:25

使用 AWS SDK for Java V2 与 AWS Step Functions 构建无服务器工单处理工作流
使用 AWS SDK for Java V2 与 AWS Step Functions 构建无服务器工单处理工作流

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地… · 2026/9/25 10:39:19

开放式代码评审:从形式化到团队共识的工程实践
开放式代码评审:从形式化到团队共识的工程实践

1. 从一次"走过场"评审说起:为什么我不再小看"Open Code Review"过去很长一段时间,我对自己团队里的代码评审(Code Review)抱着一种"做了总比不做好"的态度。每周固定两个下午,几个人拉… · 2026/9/25 10:39:13

moto DynamoDB Mock 功能覆盖解析:完整操作清单、实现限制与源码级验证
moto DynamoDB Mock 功能覆盖解析:完整操作清单、实现限制与源码级验证

Mock测试 【免费下载链接】moto A library that allows you to easily mock out tests based on AWS infrastructure. 项目地址: https://gitcode.com/gh_mirrors/mo/moto 点击查看 免费下载 本文以 moto 仓库中的 DynamoDB 服务功能覆盖文档(docs/docs… · 2026/9/25 10:39:06

Flux Helm OCI 支持(RFC-0002):把 Helm Chart 存入容器镜像仓库的设计与落地
Flux Helm OCI 支持(RFC-0002):把 Helm Chart 存入容器镜像仓库的设计与落地

云原生CI/CD容器编排DevOps 【免费下载链接】flux2 Open and extensible continuous delivery solution for Kubernetes. Powered by GitOps Toolkit. 项目地址: https://gitcode.com/gh_mirrors/fl/flux2 点击查看 免费下载 本篇基于 Flux 官方设计文档 RFC-0002&… · 2026/9/25 10:39:00

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码