在實際應用中,經常需要在程式執行過程中儲存或讀取一些資料,這些資料在工作中經常會變化,而且掉電後也不能丟失,所以需要及時地進行儲存,儲存這些資料常用的儲存器是 eeprom。
stm32 雖然本身不帶 eeprom,但是它支援自程式設計技術,可以利用內部 flash 來模擬 eeprom,這樣不僅簡化了設計,而且降低了成本。
flash 的擦寫次數是有限的,一般是 10w 次, flash 單個儲存單元bit只能從1變為0,而不能從0變成1。
想要變成1,只能 page 擦除,這裡的 page 表示乙個擦除單位,擦除過程就是把 page 所有的位都寫1,這種硬體特性決定需要一種比較高效的寫 flash 演算法。
總不能一次更改數值時擦除整一大片 flash。
1、均值儲存演算法
劃分:0x10*n +0x00 +0x01 +0x02 ... +0x0e +0x0f
內容: flag data1 data2 ... data14 data15 check_sum
check_sum=(flag+data1+data2+...+data15)&0xff
flag 為 0xa5 表示當前 16 個位元組為正在使用的記錄,為其它值表示當前 16 位元組已經丟棄。
這種儲存方法是使用空間來換取擦寫次數。
2、具體實現
1)定義 flash 頁大小,儲存資料大小:
#define flash_page 1024
#define flash_datapack 16
2)定義乙個儲存結構體
typedef struct eepromtypedef;
// flash 寫函式
void flashwrite( eepromtypedef *flash_16 )
else if ( flash_16->write < 64 && flag != 0xff ) // 如果位址在一頁內卻有資料儲存
else if(flash_16->write >= 64 ) // 如果位址不在一頁內
}
// flash 讀函式
void flashread(eepromtypedef *flash_16)
else if(flash_16->read < 64 && flag != 0xa5) // 如果位址在一頁之內但資料無效
{
if(flag != 0xff)
}
else if(flash_16->read >= 64) // 如果位址不在一頁之內
}
PCM和flash的均衡演算法
前面的幾篇文章已經說明了pcm的特性,它可以和傳統的dram構成混合記憶體提高計算機系統的效能的同時降低記憶體功耗。然而仍然有人提出將pcm用於外存,這種非易失的新型儲存器用於外存必將大幅提高計算機的速度。但是鑑於pcm的 較高,所以可以使用pcm和flash的混合外存。首先介紹flash,快閃儲存...
stm32 讀寫內部Flash
stm32的flash分為主儲存塊和資訊塊。主儲存塊用於儲存具體的程式 和使用者資料,資訊塊用於負責由stm32出廠是放置2kb的啟動程式 bootloader 和512b的使用者配置資訊區。主儲存塊是以頁為單位劃分的,一頁大小為1kb。範圍為從位址0x08000000開始的128kb內。對flas...
STM32 讀寫內部Flash
flash模組組織 儲存器被組織為程式儲存器模組,資料eeprom模組和資訊塊。程式儲存器塊分為4 kb的扇區,每個扇區都是進一步分成16頁,每頁256位元組。該操作用於擦除程式儲存器中的頁面 64個字 要做到這一點 解鎖flash pecr暫存器 1.將pekey1 0x89abcdef寫入程式設...