01
前言
嵌入式軟件中經常要存儲一些非易失參數,例如用戶設置、校準參數、設備運行參數等,通常情況下我們都會選擇存儲在EEPROM或者SPI-FLASH中。在削減成本考量的情況下,我們可以把存儲器省下來,參數存儲在內部flash中,畢竟就算每片減少一塊錢,量大后還是非??捎^的。
02
選擇參數存儲位置
stm32的flash地址起始于0x08000000,結束地址是0x08000000加上芯片實際的flash大小,不同的芯片flash大小不同。我們可以在KEIL項目工程的Target也看到ROM的起始地址和大小,前提是Device頁要選對正在使用的芯片規型號。
因為stm32擦除flash的時候是以扇區(sector)為單位的,我們存儲參數也是選擇以扇區為單位,從扇區頭開始擦、讀、寫,這樣邏輯簡單。LD、MD型產品的扇區大小是1K,HD、CL型產品的扇區大小是2K。
一般將參數存儲在flash的尾部最后幾個扇區比較穩妥,我們只要確保程序固件(編譯出的燒錄bin文件)的大小不進入尾部的這幾個扇區就可以。
以stm32f103cbt6為例,flash起始地址為0x8000000,大小是0x20000。一個Sector的大小是1K。那么定義參數位置如下:
#define PARA_START_ADDR ((u32)0x0801fc00)
#define PARA_PAGE_SIZE ((u16)0x400)
03
參數形式
將參數封裝成一個結構體,方便讀存。注意flash存儲時會自動做4字節對齊,所有盡量保證PARASAVED_T的大小是4的整數倍,避免存入讀取后數據錯位的麻煩。
#define PARA_FLAG 0x1000 //參數標記
typedef struct
{
u8 para[64];
u32 flag;
}PARASAVED_T;
PARASAVED_T para_t;
04
參數存取
讀參數,將flash內的數據,讀入到para_t結構體中
void ReadData(void)
{
u32 address;
u32 *pd;
u16 i;
address = PARA_START_ADDR;
pd = (u32 *)(¶_t);
for(i=0; i< sizeof(para_t)/4; i++)
{
*pd = *((u32 *) address);
address += 4;
pd ++;
}
}
寫參數,將para_t的數據寫入到flash中
void SaveData(void)
{
u16 i;
u8 writeTimes;
u32 address;
u8 isRight;
u32 * pd;
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
writeTimes = MAX_FLASH_WRITE_TIMES;
while(writeTimes--)
{
FLASH_ErasePage(PARA_START_ADDR);
address = PARA_START_ADDR;
pd = (u32 *)(¶_t);
for(i=0; i< sizeof(para_t)/4; i++)
{
FLASH_ProgramWord(address, *pd);
address += 4;
pd ++;
}
isRight = 1;
address = PARA_START_ADDR;
pd = (u32 *)(¶_t);
for(i=0; i< sizeof(para_t)/4; i++)
{
if((*(__IO u32*) address) != *pd)
{
isRight = 0;
}
address += 4;
pd ++;
}
if (isRight)
{
break;
}
}
}
05
讀寫調用邏輯
開機調用read函數,將參數讀取到全局變量para_t中,后面在整個生命周期中都操作para_t。當para_t的內容被改動后,調用save函數,將改動值保存。
結構體中的flag的作用,是做為一個全部參數的存儲標記,當開機讀到它是全ff時,就是參數全空的初始狀態,此時可以做初始化參數的操作,將一些默認值寫入到flash中。當開機讀到flag非全ff,但是與define PARA_FLAG不同時,就初始化參數或者參數中的一部分。這個作用是當我們需要改變某些默認參數值,并希望他在升級后生效時,可以修改define值,來觸發參數初始化。
06
優勢與缺點
把參數存儲在內部flash,好處是可以cost down,但是也要壞處,就是一旦全刷芯片的固件,所有的參數就會消失。但是一般的應用場合,這參數消失后觸發參數初始化,也沒有什么大問題。但是如果參數中存儲了一些非常困難才得到的校準參數、運行數據等,要慎用。
-
存儲器
+關注
關注
38文章
7530瀏覽量
164401 -
EEPROM
+關注
關注
9文章
1033瀏覽量
82009 -
嵌入式軟件
+關注
關注
4文章
242瀏覽量
26751 -
STM32F103
+關注
關注
33文章
479瀏覽量
63908 -
Flash存儲
+關注
關注
0文章
38瀏覽量
8334
發布評論請先 登錄
相關推薦
嵌入式系統中的Flash文件系統
基于FLASH的嵌入式存儲系統設計
![基于<b class='flag-5'>FLASH</b>的<b class='flag-5'>嵌入式</b><b class='flag-5'>存儲</b>系統設計](https://file1.elecfans.com//web2/M00/A5/B8/wKgZomUMOcaAfFdQAABruBuTeiI320.jpg)
FLASH的特點和結構與基于FLASH介質嵌入式存儲的設計
![<b class='flag-5'>FLASH</b>的特點和結構與基于<b class='flag-5'>FLASH</b>介質<b class='flag-5'>嵌入式</b><b class='flag-5'>存儲</b>的設計](https://file.elecfans.com/web2/M00/4A/06/pYYBAGKhvIqADTHSAAAohaNI2mY916.png)
評論