STM32F10x Flash 模擬 EEPROM
阿新 • • 發佈:2019-02-05
STM32F10x晶片本身沒有整合EEPROM,替代方案是用片上Flash來模擬EEPROM。Flash與EEPROM的區別主要是:一、EEPROM可以按位擦寫,而Flash只能按塊(頁)擦除;二、Flash的擦除壽命約1 萬次,較EEPROM低一個量級。ST網站有個Flash模擬EEPROM的範例:AN2594: EEPROM emulation in STM32F10x microcontrollers(包括原始碼和文件)。範例在儲存修改的資料時,以寫入新資料來替代對原資料的修改,並使用兩個頁面輪流寫入,單頁寫滿後進行資料遷移,再一次性擦除舊頁面。這個策略可以有效降低Flash擦除次數。
不過,範例程式碼只能儲存固定大小的資料(16bits),雖然容易改成不同的固定大小,但實際用起來還是很不方便。我改寫了一下,新的特性包括:
- 支援不同大小資料(字元陣列、結構體等)的混合儲存;
- 增加對資料的校驗和(Checksum)檢查。
附件提供了原始碼。使用方法很簡單,比如要儲存一個字元陣列 title 和一個 point 結構體:
#include "eeprom.h" #define TITLE_SIZE 80 #define TITLE_KEY 1 #define POINT_KEY 2 typedef struct { float x; float執行必要的初始化操作後,就可以進行寫入和讀取:
uint16_t result = 0; FLASH_Unlock(); EE_Init(); result = memcpy_to_eeprom_with_checksum(TITLE_KEY, title, TITLE_SIZE); result = memcpy_to_eeprom_with_checksum(POINT_KEY, &point實現混合儲存的辦法,是給每個變數附加8位元組的控制資訊。因此,在儲存小資料時會有較大的空間損耗,而在儲存較大的資料結構時空間利用率更高(相對於範例)。程式碼是針對STM32F103VE的實現。不同晶片需要對應修改標頭檔案中 EEPROM_START_ADDRESS 的定義:
#define EEPROM_START_ADDRESS ((uint32_t)0x0807F000)轉自http://blog.sina.com.cn/s/blog_a486791c0101fik8.html