标签:ges 检测 数据 not 记录 管理 sector 解决方法 ffffff
函数:
1.Flash_Compact_B
用于flash硬件检测。检测并校正flash里的电荷损耗bit。该函数一次只校正一个sector。
2.Flash_Blank_B
用于验证flash是否被正确擦除。每个bank单独调用,不能同时用于多个bank。
1=region is blank;
0=region is no blank(读取值为非0xFFFFFFFF)
3.Flash_Verify_B
验证写入的数据是否正确。
4.Flash_Verify_Data_B
验证写入的数据是否正确。
与Flash_Verify_B的区别是:指定了用于跟flash数据进行比对的buff里的数据长度。
NOTE:
1.调用Flash_Erase_B,Flash_Sector_Erase_B,Flash_Start_Erase_B之前先调用Flash_Compact_B,Flash_Compact_B不会对现有数据有任何影响,仅校正有可能存在的电荷损耗现象(depletion);
2.擦除过程中发生中断可能会导致产生这样的位:紧接着的Flash_Blank_B检测为已擦除,但是未被完全擦除(完全充电)的位。
解决方法:通过调用Flash_Blank_B将status.Stat1传给Flash_Erase_B来修正这样的bit。1)若Flash_Blank_B返回值为TRUE,则status.Stat1 = 0x12345678,Flash_Erase_B将屏蔽预处理步骤(将所有的位置0),仅擦除和compact;
2)若Flash_Blank_B返回值为FALSE,则status.Stat1 = 0x00000000,Flash_Erase_B执行完整的过程(full erase)。
**由于Flash_Start_Erase_B和Flash_Erase_Sector_B没有status参数,所以无法使用该功能。
结合以上两点,我们可以得出这样的结论:
1)每次擦除之前先调用Flash_Compact_B检测硬件是否完好;
2)再调用Flash_Blank_B检测是否为blank,如果是,就可以省去擦除预处理步骤以节省大量时间(使用FLASH_ERASE_B);
不同的擦除流程比较
1.使用FLASH_ERASE_B函数
1)可擦除任意个sector;
2)从数据吞吐量的角度看令人满意:被识别为blank的sector处理更快,但代码复杂;
3)优点:能够屏蔽预处理(屏蔽预处理能够极大地提高blank sector的擦除速度);
4)即使被识别为blank的块也要再擦除一次,以避免Flash_Erase_B过程中产生的不合格的数据;(使用之前无论如何再擦一遍就是了)
**Flash_Erase_B是唯一一个记录erase和compaction脉冲记数的函数。(有什么用处呢?)
2.使用FLASH_ERASE_SECTOR_B函数
1)可擦除任意个sector;
2)从数据吞吐量的角度看令人不太满意:所有的sector都执行了完整的擦除过程(full erase,包括预处理过程,相比FLASH_ERASE_B要慢);
3)优点:代码简洁;
4)即使被识别为blank的块也要再擦除一次,以避免Flash_Erase_Sector_B过程中产生的不合格的数据;(跟FLASH_ERASE_B一样)
5)无相关脉冲记录(相比于FLASH_ERASE_B)。
3.使用FLASH_START_ERASE_B和FLASH_STATUS_U16
1)可擦除任意个sector;
2)优点:多任务处理,状态机在执行擦除操作的同时可以执行其他指令
3)使用之前无论如何再擦一遍!
4)无相关脉冲记录(相比于FLASH_ERASE_B)。
写入流程
1)对于用到的sector,每次写入之前都要擦除;
2)管理要存入的数据。i.e.如果要存入的数据量大,需要跨bank存储,那么需要先对数据进行分割,并针对不同的bank单独调用FLASH_PROG_B。
原文地址:http://www.cnblogs.com/luyaoss/p/7044359.html
标签:ges 检测 数据 not 记录 管理 sector 解决方法 ffffff
原文地址:http://www.cnblogs.com/luyaoss/p/7044359.html