如果写入Flash前不擦除会发生什么

Flash写入原理:从老鼠夹子到硬件验证
文章通过老鼠夹子的比喻解释了Flash的写入原理,强调了为何在写入数据前需要擦除过程。在硬件上使用SiliconLabs的EFR32MG21单片机进行实验,验证了未经擦除的连续写入操作会导致数据不一致的情况,突显了Flash存储的特性。

如标题,相信给点进来的吃瓜群众大致有3种

1,知道Flash的写入原理,然后根据原理推测出结果,但是嫌麻烦没上手验证过的

2,同1,但是本着实事求是的做学问的原则,自己动手验证过的

3,没了解过Flash写入原理,好奇会发生什么的

首先为了第3类群众的吃瓜体验,这里打个比方:

Flash中的每个bit位就是一个老鼠夹子,小老鼠轻轻走上去就能触发,啪一下,老鼠夹子合上,合上之后要重新掰开就挺费劲的,这里需要人类来参与,老鼠就办不到了。

这里合上的老鼠夹子就相当于这个bit位为0,而还没被触发合上的老鼠夹子就相当于这个bit位为1。

老鼠夹子触发的条件是小老鼠轻轻走上去,夹子从张开变成合上,bit位从1变成0。

老鼠夹子复位的调价是要人类的大力参与,而且这里有个限制是人类来一次,图省事就会把所有老鼠夹子都掰开。夹子合上变张开,bit从0变成1;

〇好了,现在有8个老鼠夹子放一排,人类刚来过,全掰到张开的状态了,就是“张张张张张张张张”,对应bit的状态就是11111111

①第一只小耗子,走过了前4个老鼠夹子,并且全身而退,然后又绕过了后4个夹子,那么前4个老鼠夹子被触发,啪啪啪啪,合上了,这8个老鼠夹子就变成了“合合合合张张张张”,对应就是00001111,

②第二只小耗子,只走过了前2个老鼠夹子,绕过了后6个夹子,因为前4个老鼠夹子已经被触发合上了,所以这只小耗子没给这8个老鼠夹子带来任何改变。

③第三只小耗子,耗中猛耗,走过了全部8个老鼠夹子,前4个老鼠夹子已经被触发合上了所以没动静,后4个老鼠夹子被触发后,啪啪啪啪,被触发后合上,所以第三只耗子走过后,这8个老鼠夹子变成了“合合合合合合合合”,就是00000000

④然后来了个人类,看到有老鼠夹子被触发合上了,为了下次老鼠夹子能继续抓老鼠,就把老鼠夹子掰开了,而且根据规则,是一次把所有老鼠夹子都掰开了,8个夹子就变成了“张张张张张张张张”,就是11111111,回到了最开始的状态。

好了,总结一下

人类走过来一次性掰开所有老鼠夹子,就是电路帮你把Flash擦除成全1的操作,小耗子轻轻走过,就是你给Flash的某个bit写0的操作

①就是Flash中的11111111被写入00001111的操作,写入后为00001111,这也是Flash的正常用法,先擦(全部重置为1)再写(写1的地方不变,写0的地方变成0)

②就是如果不擦除之前已经被写成00001111的Flash,写入一次00111111,那么数据不变,依旧是00001111

③就是如果不擦除之前被写成00001111的Flash,直接写入00000000,那么这8个bitFlash会全部变成0,变成了00000000

④就是Flash被电路擦除,重新变成11111111的状态。

其实向Flash中写入数据,就像是给11111111的初始数据“与”上你要写入的数据

那么这里就解释了为什么Flash在写入数据前要擦除(重置为全1的状态)。就②中所描述的,小耗子实际只走过了前2个老鼠夹,就是给已经被写成了00001111(0x0F)的Flash中写入了00111111(0x3F),最后得到的却仍然是个00001111(0x0F),你存了个0x3F进去,却读出了一个0x0F,写进去的和读出来的不一样了,这出错了对吧。

那么下面咱么实际在硬件上进行一下验证

硬件平台:silicon labs的EFR32MG21单片机,手头正在写zigbee,所以就用这个了

测试代码如下,很简单

  uint32_t data;
  uint32_t addr;
  addr = 0xBE000;//FLash地址

  data=0x0000FFFF;//先写入数据0x0000FFFF
  Flash_WriteData(addr,&data,4);

  data=0xFFFF0000;//再写入数据0xFFFF0000
  Flash_WriteData(addr,&data,4);

为了方便对比,这里先给Flash填充了55555555

第一次写入后,0x55555555 & 0x0000FFFF ,得到了0x00005555

 第二次写入后,0x00005555 & 0xFFFF0000 ,得到了0x00000000

 所以你看,上述2次写入前Flash都没擦除过,那么写入的和读出的大概率是不一样的,这就算不上存储了对不对

### Flash Memory 写入为何需要先擦除 Flash 存储器的编程机制决定了其在写入操作之必须进行擦除。这种限制源于浮栅晶体管(Floating Gate Transistor)的基本工作原理,即 Flash 存储单元只能将位从 1 改变为 0,而直接将 0 更改为 1 [^1]。因此,在向存储单元写入数据,必须将其恢复到全为 1 的状态,这个过程称为“擦除”。 #### 擦除操作的本质与作用 擦除是以“块(Block)”为最小单位执行的。一个块通常包含多个页(Page),例如 64 或 128 个页。当对某个块执行擦除命令时,该块中所有页的所有比特位都会被设置为 1(即每个字节变为 0xFF)。这一过程通过向控制栅施加高电压并利用 Fowler-Nordheim 隧穿效应实现电子从浮栅中移除[^1]。 由于擦除是以块为单位进行的,若仅需修改某一页中的部分数据,则必须将整个块的数据读取到缓存中,更新目标页的内容后,再将整块重新写入。这种方式虽然增加了额外操作,但确保了数据的一致性和完整性。 #### 写入操作的物理限制 Flash 存储单元在未擦除状态下处于“0”状态。写入操作实际上是通过向控制栅施加高压,使电子注入浮栅,从而改变阈值电压以表示“0”。然而,一旦某个单元已经被编程为“0”,就能再次被直接编程为“0”,除非该单元所在的整个块被擦除[^1]。 这种单向编程特性使得 Flash 控制器和文件系统必须采用特定策略来管理数据更新。例如,在 NAND Flash 中广泛使用的 Copy-on-Write(时复制)机制会将更新后的数据写入新的空白页中,而是覆盖原有页。这仅避免了频繁的块擦除操作,还延长了 Flash 的使用寿命。 #### 实际应用中的影响与优化 在实际使用中,操作系统或文件系统(如 UBIFS、YAFFS2、F2FS 等)会根据 Flash擦除写入特性设计相应的管理机制。例如: - **垃圾回收(Garbage Collection)**:用于回收含有无效页的块,使其可以被重新写入。 - **磨损均衡(Wear Leveling)**:通过均匀分布写入操作,防止某些块因频繁擦而提失效。 - **坏块管理(Bad Block Management)**:检测并标记无法正常擦的块,防止数据丢失。 以下是一个典型的 NAND Flash 写入流程伪代码示例: ```c void nand_page_write(uint32_t page_number, uint8_t *data_buffer) { // 发送页写入开始命令 send_command(0x80); // 发送地址周期(包括列地址和页号) send_address(page_number); // 写入数据(按页大小传输) for (int i = 0; i < PAGE_SIZE; i++) { write_data(data_buffer[i]); } // 发送确认命令触发写入 send_command(0x10); // 轮询状态寄存器等待写入完成 while (!is_ready()) { // 等待 } } ``` 上述代码展示了 Flash 控制器如何按照页为单位发送数据,但在执行此函数,必须确保目标页所在的块已经处于擦除状态,否则写入操作可能失败或导致数据错误[^1]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值