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裏的數據長度。
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。
SM470 F05庫函數閱讀筆記