SM470 F05库函数阅读笔记

写在前面:本文为作者原创,转载请注明出处。

函数:

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里的数据长度。

5.Flash_Match_Key_B

仅用于有flash protection keys的器件。

操作flash之前必须调用此函数并且返回值为TRUE。

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。

代码实现TIPS

program之前记得要完成两个工作:

1)配置FLASH为可写(MFBALRx.1);

2)对于有KEY的FLASH要先Match KEY。

posted @ 2017-06-18 16:47  没有记忆的石头  阅读(446)  评论(0编辑  收藏  举报