本文不对代码做详细解析。先说结论,和常见问题
结论
结论1:FLASH在操作的时候,需要先“擦除”。然后在“写入”。
结论2:擦除需要一整块擦除。不能只擦除某几个字节。
结论3:写入是可以按照字节这样写入的。但是“结论1”的存在。导致写入也整片写入。否则数据就会丢失。
结论4:写入可以写0 。不能写1.如果要写1.必须先“擦除”。
问题:
如果不按照如上结论来做。会怎样呢?
分析如下。
============================ 验证1===================================
1.验证擦除,到底做了啥?步骤如下
先读出FLASH-》擦除FLASH->读取FLASH
运行结果
可以看出擦除其实是写入1。所以读取出来是0xFFFFFFFF。
============================ 验证2===================================
1.验证不按照整块擦除会怎样,步骤如下
先读出FLASH-》擦除FLASH。但是只擦除1个地址0x3000->读取FLASH
从擦除这个库函数可以看到。必须以块为单位。整块擦除。
运行结果
可以看到传入一个地址0x3000后。这一地址对应的512byte都会被擦除。
============================ 验证3===================================
1.擦除的地址,不是传入512byte的块对齐首地址,会怎样。上一步验证传入的0X3000是可以被512整除的。也就是块对齐首地址。但是如果不是传入块对齐首地址,会怎样。如传入地址0X3001。步骤如下。先读出FLASH-》擦除FLASH。但是只擦除1个地址0x3001->读取FLASH。
运行结果:
和验证2是一样的,库里面会根据传入的地址,找到这一块的首地址。然后擦除。
============================ 验证4===================================
不擦出,直接写入会怎样
验证步骤,先读出,然后写入数据0XFFFFFF。再读出。
如果不擦出,写入0x000000.然后读出来会怎样。
写入0 是可以的。
============================ 验证5===================================
不擦出,直接对某个字节写0.不写1可以吗
验证步骤,先读出,然后写入数据0X0。再读出。
写入0是可以不整片写的。但是写1只能用擦除来完成。
为什么会有以上的怪现象呢?
这个半导体FLASH的结构有关。详细的。我看不是很懂。但大概的意思是。因为工艺和半导体设计原因。这些存储信息的半导体是按照“块”为单位划分成一块块的。当改变某一块的时候。因为需要控制某个总闸。将所有的电子通过“隧道效应”打进去(不确定电子是打进去还是打出来)。这个总闸的改变是区域性的。所以擦除的时候,就会导致整块数据被改变。