IoT STM32 Flash 均衡儲存演算法

2021-09-13 11:33:42 字數 1373 閱讀 7287

在實際應用中,經常需要在程式執行過程中儲存或讀取一些資料,這些資料在工作中經常會變化,而且掉電後也不能丟失,所以需要及時地進行儲存,儲存這些資料常用的儲存器是 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寫入程式設...