1. 簡介
FLASH 和 EEPROM 都是非揮發性儲存器,在掉電後數據還會保留。FLASH 和 EEPROM 最 大的區別是擦除方式不同,EEPROM 可以按字節進行擦除,但 FLASH 最小擦除單位是頁,一 頁通常包含多個字節甚至幾 K 字節。FLASH 和 EEPROM 擦寫內容決定了 EEPROM 容量小 但擦寫壽命比較高,而 FLASH 容量非常大,但擦寫壽命短。 在 MCU 主頻高的情況下,可以采用 FLASH 模擬 EEPROM 來降低成本。
本文介紹了一種采 用 FLASH 模擬 EEPROM 的方法,實作了 EEPROM 按字節進行數據修改,可防止復位或掉 電產生的數據遺失,當采用的 FLASH 儲存空間越大,EEPROM 效能越好。
2. EEPROM 備份區結構
本文以63頁DATA FLASH模擬2K字節EEPROM來介紹FLASH模擬EEPROM的方法。
2.1. GD32A50x FLASH 簡介
GD32A50x提供高達384KB片上FLASH,其中bank0 256KB,bank1 128KB。基地址和大小如 表2-1. 384KB快閃記憶體基地址和大小所示。
表 2-1. 384KB 快閃記憶體基地址和大小
2.2. EEPROM 數據備份結構
表 2-2. FLASH 頁數據備份儲存結構1
表 2-2. FLASH 頁數據備份儲存結構2
3. FLASH 模擬 EEPROM
方案 3.1. 演算法實作
3.1.1. 參數宏
表 3-1. 參數宏
3.1.2. API 函數
函數 eeprom_init 函數 eeprom_init 用於初始化 EEPROM 備份區,並獲取當前正在用於 EEPROM 備份的 FLASH 頁相對編號。
表 3-2. EEPROM 初始化1
表 3-2. EEPROM 初始化2
表 3-2. EEPROM 初始化3
函數 eeprom_write
函數 eeprom_write 用於索引當前可寫的地址,並將數據寫到對應 FLASH 地址。註意該函數 的入參 ee_addr 是模擬 EEPROM 地址,範圍為 0-135。
表 3-3. EEPROM 寫函數
表 3-3. EEPROM 寫函數1
表 3-3. EEPROM 寫函數2
表 3-3. EEPROM 寫函數3
3.1.3. 測試結果
測試在 EEPROM 中覆寫第一個字節共 16 次。寫入數據如圖 3-1. 讀寫數據所示。
圖 3-1. 讀寫數據
程式碼如表 3-5. 測試 demo 所示。
表 3-5. 測試 demo
表 3-5. 測試 demo2
測試結果如圖 3-2. EEPROM 備份區數據所示
圖 3-2. EEPROM 備份區數據 圖 3-2. EEPROM 備份區數據