STM32的FLASH除了可以燒寫如程序外,還可以供給用戶做存儲器,存儲參數用,但是要注意的是,FLSAH的擦寫次數是有限制的,10萬次。
STM32F1系列單片機內核是Cortext-M3系列的,其存儲器的映射是按照Cortext-M3的標準設計的,如下圖。
從上圖可看出最下main的512M是分配給Code 即程序存儲區. 其內部分配如下圖。
從上圖可以看到FLASH的起始地址是:0x0800 0000 到 0x0807 FFFF ,126M的FLASH空間。STM32按頁來編程擦寫FLASH,如我的 STM32F103RCT6 SRAM爲48KB,FLASH有256K. 分頁是2Kb一頁來設計的,而又的小容量的單片機是1Kb一頁。
下列圖片均是從芯片的參考文檔(RM0008)上截圖的.
可以算出127+1=128*2KB=256KB。
//flash讀寫代碼如下 寫之前要擦除一整頁的數據。寫入數據要傳入一個32位的地址,一次寫入1個16位的數據(半字)。
//u32 addr - flash地址
//u16 dat - 寫入數據
//有關STM32F103RCT6的FLASH詳細情況學習,請看我的筆記。
void FLASH_Write(u32 addr, u16 dat){
FLASH_Unlock(); //解鎖FLASH編程擦除控制器
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
FLASH_ErasePage(addr); //寫之前要先擦除頁。
FLASH_ProgramHalfWord(addr,dat); //從指定也的addr地址開始寫。
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
FLASH_Lock();
}
//從FLASH讀取半個字
u16 FLASH_Read_HalfWord(u32 addr){
u16 data;
data = *(u16*)(addr); //從指定的地址讀取數據。
return data;
}
有關數據存儲讀取的可靠性思考。一直以來,見過我司好多儀表的參數保存,都是直接一次寫入到EEPROM或者FLASH中。 在設計時不考慮到,當程序正在寫入參數斷電時或上電抖動造成參數的存儲和讀取失效。這種失效後的保護機制如何設計?
拿STM32來說,如果FLASH充裕,可以將數據存儲在3個頁。(最好3個不連續的位置)。
1:存數據邏輯。對要寫入的數據按模塊或整體做校驗,校驗碼作爲存入參數的一部分,要寫入FLASH。
存入第1個頁,存好後,立刻讀取,判斷是否存好。然後依此操作存後面2頁數據。
2:讀數據邏輯。讀取第1頁數據後,做校驗,看數據是否正確,如果不正確讀後面2個。如果所有的頁,數據都不正確,那麼就使用程序原代碼內值.同時產品要報出參數讀取錯誤狀態。