1. 程式人生 > >STM32F10x Flash 模擬 EEPROM

STM32F10x Flash 模擬 EEPROM

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
 y;     float z; } Point; char title[TITLE_SIZE] = "eeprom test string."; Point point;

  執行必要的初始化操作後,就可以進行寫入和讀取:

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
, sizeof(point)); result = memcpy_from_eeprom_with_checksum(title, TITLE_KEY, TITLE_SIZE); result = memcpy_from_eeprom_with_checksum(&point, POINT_KEY, sizeof(point));

  實現混合儲存的辦法,是給每個變數附加8位元組的控制資訊。因此,在儲存小資料時會有較大的空間損耗,而在儲存較大的資料結構時空間利用率更高(相對於範例)。程式碼是針對STM32F103VE的實現。不同晶片需要對應修改標頭檔案中 EEPROM_START_ADDRESS 的定義:

#define EEPROM_START_ADDRESS    ((uint32_t)0x0807F000)

轉自http://blog.sina.com.cn/s/blog_a486791c0101fik8.html