STM32學習筆記-FLASH讀寫

     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個。如果所有的頁,數據都不正確,那麼就使用程序原代碼內值.同時產品要報出參數讀取錯誤狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章