在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式軟件中如何利用內部flash存儲參數呢?

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

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 *)(&para_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 *)(&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

讀寫調用邏輯

開機調用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
收藏 人收藏

    評論

    相關推薦

    嵌入式參數存儲處理

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

    嵌入式軟件如何利用內部flash存儲參數

    01前言嵌入式軟件中經常要存儲一些非易失參數,例如用戶設置、校準參數、設備運行參數等,通常情況下
    發表于 11-25 08:52

    嵌入式平臺中參數的思考與設計相關資料下載

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

    嵌入式系統Flash文件系統

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

    嵌入式系統Flash 存儲管理

    以TRI 公司的基于NOR FlashFlash 管理軟件FMM 為例, 詳細介紹嵌入式系統如何根據
    發表于 05-15 13:21 ?15次下載

    基于虛擬存儲嵌入式存儲系統的設計方法

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

    基于FLASH嵌入式存儲系統設計

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

    嵌入式參數存儲的一種方式

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

    嵌入式參數存儲訣竅分享

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

    FLASH的特點和結構與基于FLASH介質嵌入式存儲的設計

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

    嵌入式軟件利用內部flash存儲參數的方法

    01前言嵌入式軟件中經常要存儲一些非易失參數,例如用戶設置、校準參數、設備運行參數等,通常情況下
    發表于 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'>內部</b><b class='flag-5'>flash</b><b class='flag-5'>存儲</b><b class='flag-5'>參數</b>的方法

    嵌入式開發,嵌入式硬件和軟件有什么區別?

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

    如何讀取、修改嵌入式產品Flash內容?

    如何讀取、修改嵌入式產品Flash內容?
    的頭像 發表于 10-26 15:31 ?1006次閱讀
    如何讀取、修改<b class='flag-5'>嵌入式</b>產品<b class='flag-5'>Flash</b><b class='flag-5'>中</b>內容?

    嵌入式開發,如何將Flash的程序轉移到RAM運行?

    嵌入式開發,如何將Flash的程序轉移到RAM運行? Flash
    的頭像 發表于 10-29 16:23 ?3804次閱讀

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

    什么才是嵌入式Flash的邊界? 嵌入式Flash是一種非易失性存儲器,常用于嵌入式電子設備
    的頭像 發表于 10-29 17:29 ?557次閱讀
    主站蜘蛛池模板: 夜间视频在线观看 | 性色免费视频 | 久久性生活| 久久夜色撩人精品国产 | 在线看你懂| 国产精品久久久久影院色老大 | 色视频免费观看 | 欧美精品久久久久久久小说 | 青草99| 噜噜噜动态图超猛烈 | 久草老司机 | 夜夜做夜夜爽 | 四虎院影永久在线观看 | 免费又黄又爽1000禁片 | 五月婷婷之婷婷 | 日本xxxx色视频在线观看免费 | ww.色| 欧美日一级 | 亚洲啊v| 淫操| 久久国产精品无码网站 | 午夜小视频男女在线观看 | 九九色网站 | 免费一级毛片不卡在线播放 | 天天碰天天操 | 国产精品资源在线观看 | 特级毛片免费视频播放 | 欧美黑人xxxx猛牲大交 | 国内精品手机在线观看视频 | 色噜噜狠狠色综合久 | 欧美成人一区二区三区在线电影 | 天天综合色天天综合 | 久久综合香蕉久久久久久久 | 国产全部理论片线观看 | 亚洲欧美国产高清va在线播放 | 亚洲乱亚洲乱妇41p国产成人 | 国产亚洲综合色就色 | 日本系列 1页 亚洲系列 | 欧美综合网站 | 中文字幕88页 | 高清视频一区二区 |