如果写入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都没擦除过,那么写入的和读出的大概率是不一样的,这就算不上存储了对不对

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值