0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式軟件中如何利用內(nèi)部flash存儲參數(shù)呢?

冬至子 ? 來源:嵌入式案例Show ? 作者:潛言 ? 2023-10-27 14:12 ? 次閱讀

01

前言

嵌入式軟件中經(jīng)常要存儲一些非易失參數(shù),例如用戶設(shè)置、校準(zhǔn)參數(shù)、設(shè)備運行參數(shù)等,通常情況下我們都會選擇存儲在EEPROM或者SPI-FLASH中。在削減成本考量的情況下,我們可以把存儲器省下來,參數(shù)存儲在內(nèi)部flash中,畢竟就算每片減少一塊錢,量大后還是非??捎^的。

02

選擇參數(shù)存儲位置

stm32的flash地址起始于0x08000000,結(jié)束地址是0x08000000加上芯片實際的flash大小,不同的芯片flash大小不同。我們可以在KEIL項目工程的Target也看到ROM的起始地址和大小,前提是Device頁要選對正在使用的芯片規(guī)型號。

圖片

因為stm32擦除flash的時候是以扇區(qū)(sector)為單位的,我們存儲參數(shù)也是選擇以扇區(qū)為單位,從扇區(qū)頭開始擦、讀、寫,這樣邏輯簡單。LD、MD型產(chǎn)品的扇區(qū)大小是1K,HD、CL型產(chǎn)品的扇區(qū)大小是2K。

一般將參數(shù)存儲在flash的尾部最后幾個扇區(qū)比較穩(wěn)妥,我們只要確保程序固件(編譯出的燒錄bin文件)的大小不進(jìn)入尾部的這幾個扇區(qū)就可以。

以stm32f103cbt6為例,flash起始地址為0x8000000,大小是0x20000。一個Sector的大小是1K。那么定義參數(shù)位置如下:

#define PARA_START_ADDR ((u32)0x0801fc00)
#define PARA_PAGE_SIZE  ((u16)0x400)

03

參數(shù)形式

將參數(shù)封裝成一個結(jié)構(gòu)體,方便讀存。注意flash存儲時會自動做4字節(jié)對齊,所有盡量保證PARASAVED_T的大小是4的整數(shù)倍,避免存入讀取后數(shù)據(jù)錯位的麻煩。

#define PARA_FLAG 0x1000 //參數(shù)標(biāo)記
typedef struct
{
  u8 para[64];
  u32 flag;
}PARASAVED_T;
PARASAVED_T para_t;

04

參數(shù)存取

讀參數(shù),將flash內(nèi)的數(shù)據(jù),讀入到para_t結(jié)構(gòu)體中

void ReadData(void)
{
  u32 address;
  u32 *pd;
  u16 i;


  address = PARA_START_ADDR;   
  pd = (u32 *)(&para_t);
  for(i=0; i< sizeof(para_t)/4; i++)
  {
    *pd = *((u32 *) address);
    address += 4;
    pd ++;
  }
}

寫參數(shù),將para_t的數(shù)據(jù)寫入到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 *)(&para_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 *)(&para_t);  
    for(i=0; i< sizeof(para_t)/4; i++)
    {
      if((*(__IO u32*) address) != *pd)
      {
        isRight = 0;
      }
      address += 4;
      pd ++;
    }
    if (isRight)
    {
      break;
    }
  }
}

05

讀寫調(diào)用邏輯

開機調(diào)用read函數(shù),將參數(shù)讀取到全局變量para_t中,后面在整個生命周期中都操作para_t。當(dāng)para_t的內(nèi)容被改動后,調(diào)用save函數(shù),將改動值保存。

結(jié)構(gòu)體中的flag的作用,是做為一個全部參數(shù)的存儲標(biāo)記,當(dāng)開機讀到它是全ff時,就是參數(shù)全空的初始狀態(tài),此時可以做初始化參數(shù)的操作,將一些默認(rèn)值寫入到flash中。當(dāng)開機讀到flag非全ff,但是與define PARA_FLAG不同時,就初始化參數(shù)或者參數(shù)中的一部分。這個作用是當(dāng)我們需要改變某些默認(rèn)參數(shù)值,并希望他在升級后生效時,可以修改define值,來觸發(fā)參數(shù)初始化。

06

優(yōu)勢與缺點

把參數(shù)存儲在內(nèi)部flash,好處是可以cost down,但是也要壞處,就是一旦全刷芯片的固件,所有的參數(shù)就會消失。但是一般的應(yīng)用場合,這參數(shù)消失后觸發(fā)參數(shù)初始化,也沒有什么大問題。但是如果參數(shù)中存儲了一些非常困難才得到的校準(zhǔn)參數(shù)、運行數(shù)據(jù)等,要慎用。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7403

    瀏覽量

    163398
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1007

    瀏覽量

    81225
  • 嵌入式軟件
    +關(guān)注

    關(guān)注

    4

    文章

    239

    瀏覽量

    26581
  • STM32F103
    +關(guān)注

    關(guān)注

    33

    文章

    475

    瀏覽量

    63352
  • Flash存儲
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    8269
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式參數(shù)存儲處理

    嵌入式參數(shù)存儲,你是怎么處理的?
    發(fā)表于 03-30 08:29

    嵌入式軟件如何利用內(nèi)部flash存儲參數(shù)?

    01前言嵌入式軟件中經(jīng)常要存儲一些非易失參數(shù),例如用戶設(shè)置、校準(zhǔn)參數(shù)、設(shè)備運行參數(shù)等,通常情況下
    發(fā)表于 11-25 08:52

    嵌入式平臺中參數(shù)的思考與設(shè)計相關(guān)資料下載

    嵌入式平臺中參數(shù)的思考與設(shè)計提筆有因存儲介質(zhì)FLASH存儲設(shè)計數(shù)據(jù)類型設(shè)計參數(shù)歸類設(shè)計讀寫接口設(shè)
    發(fā)表于 12-23 06:05

    嵌入式系統(tǒng)Flash文件系統(tǒng)

    介紹嵌入式系統(tǒng)Flash文件系統(tǒng)。對 FFS需求,Flash存儲器特性,F(xiàn)FS要求和實現(xiàn)作了描述,并介紹幾種免費和商用的 FFS。
    發(fā)表于 04-07 09:40 ?15次下載

    嵌入式系統(tǒng)Flash 存儲管理

    以TRI 公司的基于NOR FlashFlash 管理軟件FMM 為例, 詳細(xì)介紹嵌入式系統(tǒng)如何根據(jù)
    發(fā)表于 05-15 13:21 ?15次下載

    基于虛擬存儲嵌入式存儲系統(tǒng)的設(shè)計方法

    基于虛擬存儲嵌入式存儲系統(tǒng)的設(shè)計方法   1、引言   嵌入式系統(tǒng)由嵌入式硬件和固化在硬件平臺中的
    發(fā)表于 11-05 16:10 ?758次閱讀
    基于虛擬<b class='flag-5'>存儲</b>的<b class='flag-5'>嵌入式</b><b class='flag-5'>存儲</b>系統(tǒng)的設(shè)計方法

    基于FLASH嵌入式存儲系統(tǒng)設(shè)計

    1 引言 FLASH(閃速存儲器)作為一種安全、快速的存儲體,具有體積小、容量大、成本低、掉電數(shù)據(jù)不丟失等一系列優(yōu)點,已成為嵌入式系統(tǒng)數(shù)據(jù)
    發(fā)表于 09-24 09:51 ?1122次閱讀
    基于<b class='flag-5'>FLASH</b>的<b class='flag-5'>嵌入式</b><b class='flag-5'>存儲</b>系統(tǒng)設(shè)計

    嵌入式參數(shù)存儲的一種方式

    如果有幾個設(shè)置參數(shù)需要存儲Flash,我們一般會怎么存儲?將不同的
    發(fā)表于 04-20 09:57 ?713次閱讀

    嵌入式參數(shù)存儲訣竅分享

    分享到:標(biāo)簽:嵌入式 工業(yè)4.0 如果有幾個設(shè)置參數(shù)需要存儲Flash,我們一般會怎么存儲
    發(fā)表于 10-13 20:24 ?0次下載
    <b class='flag-5'>嵌入式</b>的<b class='flag-5'>參數(shù)</b><b class='flag-5'>存儲</b>訣竅分享

    FLASH的特點和結(jié)構(gòu)與基于FLASH介質(zhì)嵌入式存儲的設(shè)計

    FLASH(閃速存儲器)作為一種安全、快速的存儲體,具有體積小、容量大、成本低、掉電數(shù)據(jù)不丟失等一系列優(yōu)點,已成為嵌入式系統(tǒng)數(shù)據(jù)和程序最主
    發(fā)表于 10-15 10:15 ?6次下載
    <b class='flag-5'>FLASH</b>的特點和結(jié)構(gòu)與基于<b class='flag-5'>FLASH</b>介質(zhì)<b class='flag-5'>嵌入式</b><b class='flag-5'>存儲</b>的設(shè)計

    嵌入式軟件利用內(nèi)部flash存儲參數(shù)的方法

    01前言嵌入式軟件中經(jīng)常要存儲一些非易失參數(shù),例如用戶設(shè)置、校準(zhǔn)參數(shù)、設(shè)備運行參數(shù)等,通常情況下
    發(fā)表于 11-16 18:21 ?18次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b><b class='flag-5'>中</b><b class='flag-5'>利用</b><b class='flag-5'>內(nèi)部</b><b class='flag-5'>flash</b><b class='flag-5'>存儲</b><b class='flag-5'>參數(shù)</b>的方法

    嵌入式開發(fā),嵌入式硬件和軟件有什么區(qū)別?

    嵌入式指的是把軟件直接燒錄在硬件里,而不是安裝在外部存儲介質(zhì)上,就像賦予機器人靈魂,從而方便人類操控。在嵌入式開發(fā),分為
    的頭像 發(fā)表于 07-18 18:11 ?3284次閱讀
    <b class='flag-5'>嵌入式</b>開發(fā)<b class='flag-5'>中</b>,<b class='flag-5'>嵌入式</b>硬件和<b class='flag-5'>軟件</b>有什么區(qū)別?

    如何讀取、修改嵌入式產(chǎn)品Flash內(nèi)容?

    如何讀取、修改嵌入式產(chǎn)品Flash內(nèi)容?
    的頭像 發(fā)表于 10-26 15:31 ?773次閱讀
    如何讀取、修改<b class='flag-5'>嵌入式</b>產(chǎn)品<b class='flag-5'>Flash</b><b class='flag-5'>中</b>內(nèi)容?

    嵌入式開發(fā),如何將Flash的程序轉(zhuǎn)移到RAM運行?

    嵌入式開發(fā),如何將Flash的程序轉(zhuǎn)移到RAM運行? Flash
    的頭像 發(fā)表于 10-29 16:23 ?3142次閱讀

    什么才是嵌入式Flash的邊界?

    什么才是嵌入式Flash的邊界? 嵌入式Flash是一種非易失性存儲器,常用于嵌入式電子設(shè)備
    的頭像 發(fā)表于 10-29 17:29 ?459次閱讀