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

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

3天內不再提示

使用MCU Flash模擬EEPROM

jf_pJlTbmA9 ? 來源:敏矽MCU ? 作者:敏矽MCU敏矽MCU ? 2023-10-18 18:01 ? 次閱讀

1、概述

ME32x系列是內嵌ARM Cortex? M0/M3核的32位微控制器。該系列控制器由敏矽微電子有限公司自主開發,并具有自主知識產權。敏矽微電子的微控制器包括有通用MCU和專用SOC系列,具有非常高的性價比,是MCU產品升級換代和國外產品替代的最佳選擇。通用功能有高精度ADC,CAN接口,I2S音頻接口,UART串口,SPI接口,I2C總線接口,看門狗定時器(WDT),通用計數器/定時器。特殊接口包括人機界面控制器(LCD驅動,電容觸摸按鍵)和馬達控制功能模塊。

EEPROM作為比較廉價和方便數據存儲器,被廣泛使用并且習慣思維。而MCU Flash與EEPROM相比,除使用方法略有差異外,作為數據存儲器,所起的效果是一樣的。

2、MCU Flash與EEPROM使用比較

擦除

擦除時間

編程

編程時間

硬件接口

擦寫壽命

MCU Flash

扇區為單位擦除,擦除后數據為0xFF

5ms

32位word編程

7us

通過寄存器接口設置編程,讀Flash通過指針直接讀

10萬次

EEPROM

沒有單獨擦除功能

-

Byte編程

-

I2C接口

100萬次

3、使用MCU Flash 存儲數據舉例

以ME32S003系列為例,下面說明如何使用MCU Flash 存儲小量的數據(注意,本例重點在探討實現的一個思路,程序調試請用戶自行解決)。

ME32S003系列有32K Flash,我們拿出1K, 即兩個扇區來存儲數據,在這里約定一個數據存儲單元為64 Bytes(包括標志)。

兩個扇區有16個存儲單元,換句話說,可以存儲10萬x 16 =160 次數據,遠遠超過EEPROM的壽命。

所有需要存儲數據放在一個數據結構中,方便存儲和提取數據:

#defineDATA_AREA_ADDRESS 62*512 //數據扇區起始地址
#defineDATA_AREA_SIZE 2*512 //兩個扇區大小
#defineDATA_UINT_SIZE 64 //每一個存儲單元大小,一定要整除扇區大?。?12)
#defineDATA_UINT_FLAG 0x5555AAAA
typedef struct {
uint32_t flag;
uint32_t data1;
…
} data_uint_type;
voidflash_erase(uint32_t startaddr, uint32_t size)
{
uint32_t endaddr;
endaddr=startaddr+size;
     //erase sector
     while(startaddrADDR = startaddr; // setup addr
              FMC->CMD = 0x04; //Triggerprogramming
              while ((FMC->CMD  0x100)!=0);
              startaddr+=512;
     }
return;  
}
uint8_t flash_word_program(uint32_taddr, uint32_t worddata) //返回一個非0的數據當錯誤發生時
{
     //program word
              FMC->ADDR = addr; // set upaddr     
              FMC->DATA =worddata;
              FMC->CMD = 0x02; //Triggerprogramming
              while ((FMC->CMD  0x100)!=0);
              if (*(uint32_t *)addr== worddata)
      return 0;
else
      return 1;
}
data_uint_type* data_area_init(void)//返回一個指向數據單元的指針,空指針表示沒有數據
{
data_uint_type* ptr;
ptr=get_last_data_uint_ptr();
if (((uint32_t) ptr==DATA_AREA_ADDRESS)  (ptr->flag!==DATA_UINT_FLAG))
{
flash_erase(DATA_AREA_ADDRESS,DATA_AREA_SIZE);
ptr= null;
}
}
data_uint_type* get_last_data_uint_ptr(void)//返回一個指向數據單元的指針
{
uint32_tstartuintaddr,enduintaddr,temp;
startuintaddr= DATA_AREA_ADDRESS/DATA_UINT_SIZE;
enduintaddr= startuintaddr+DATA_AREA_SIZE/ DATA_UINT_SIZE-1;
while(startuintaddr!=enduintaddr)
{
              temp= (startuintaddr+ enduintaddr)>1;
              if ((data_uint_type*)(temp* DATA_UINT_SIZE)->flag==DATA_UINT_FLAG)
                       startuintaddr= temp;          
else
                enduintaddr= temp
}
startuintaddr =startuintaddr * DATA_UINT_SIZE;
if (((data_uint_type*)startuintaddr)->flag!=DATA_UINT_FLAG)
return (data_uint_type*) 0;
else
                {
                        If (startuintaddr< (DATA_AREA_ADDRESS+DATA_AREA_SIZE))
                                 {
                                          If  (((data_uint_type*)(startuintaddr+ DATA_UINT_SIZE)->flag==DATA_UINT_FLAG)
                                          return(data_uint_type*)(startuintaddr+ DATA_UINT_SIZE) ;
}else
return (data_uint_type*)(startuintaddr) ;
}
}
uint8_tstore_data_uint(data_uint_type* sur_data_ptr, data_uint_type* dst_data_ptr) //返回一個非0的數據當錯誤發生時
{
     uint32_t n,temp0,temp1,temp2,*dataptr;
     temp1= sizeof(data_uint_type) >>2;
if((temp1<<2)!= sizeof(data_uint_type))
     temp1++;
     temp2=(uint32_t) dst_data_ptr;
     dataptr=(uint32_t *) sur_data_ptr;
     //erase sector
     if ((DATA_AREA_ADDRESS==temp2)  (dst_data_ptr->flag==DATA_UINT_FLAG))
     {
              flash_erase(DATA_AREA_ADDRESS, DATA_AREA_SIZE);//erase whole data sectors
     }
     for (n=0;n

系統啟動時,先調用data_area_init()函數,返回當前數據單元指針,你可以使用memory copy 復制數據到你的程序中。如果是空指針,你需要對你的數據賦予初值,并把它存儲到數據區。

全局變量:

data_uint_typemydata;
data_uint_type * dataptr;
main(void)
{
…
dataptr=data_area_init();//初始化
if((uint32_t)dataptr==0) //空指針
{
//對mydata賦予初值
…
//存儲數據到Flash 數據區
data_ptr =(data_uint_type *) DATA_AREA_ADDRESS;
store_data_uint( mydata,data_ptr);
}
…
//任何時候,調用store_data_uint()把mydata數據存儲到Flash
data_ptr++;
if ((uint32_t)data_ptr==DATA_AREA_ADDRESS)
data_ptr =(data_uint_type *) DATA_AREA_ADDRESS;
store_data_uint( mydata,data_ptr);
…
//data_ptr永遠指向當前Flash 數據
…
}

注意事項:

由于mydata的地址是編譯器自動設定的,如果發生mydata地址不是word對齊地址,需要手動設置??傊?,要確保mydata地址是word對齊的。

4、Revision History

來源:敏矽MCU
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理

審核編輯 黃宇


;n++)>)>

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    16142

    瀏覽量

    345101
  • 控制器
    +關注

    關注

    112

    文章

    15439

    瀏覽量

    173095
  • FlaSh
    +關注

    關注

    10

    文章

    1567

    瀏覽量

    146904
  • 存儲器
    +關注

    關注

    38

    文章

    7222

    瀏覽量

    162476
  • EEPROM
    +關注

    關注

    9

    文章

    930

    瀏覽量

    80669
收藏 人收藏

    評論

    相關推薦

    如何使用Flash模擬EEPROM存儲參數

    概述在MCU的使用中,經常遇到需要存儲參數或掉電保持數據等功能。其中,FlashEEPROM是常見的非易失性存儲器,都可以做到設備掉電重啟后,數據還會保留。但二者有明顯的區別:EEPROM
    的頭像 發表于 09-22 08:19 ?932次閱讀
    如何使用<b class='flag-5'>Flash</b><b class='flag-5'>模擬</b><b class='flag-5'>EEPROM</b>存儲參數

    AN0002—AT32 MCU如何使用片上Flash來實現EEPROM功能

    性的數據存儲設備。出于客戶低成本的考慮,AT32 系列部分型號的 MCU 并未搭載片上 EEPROM,但是在此我們將介紹一種使用片上 Flash模擬
    發表于 08-15 14:23

    如何使用Flash模擬出一片eeprom

    MCU模擬eeprom基本功能 如果你的MCUflash足夠大。并且你的MCU提供自編程
    發表于 11-03 06:42

    在AT32系列MCUFlash模擬EEPRO的應用原理和使用方法

    型號的 MCU 并未搭載片上 EEPROM,但是在此我們將介紹一種使用片上 Flash模擬 EEPROM 使用的方法,以作為對此應用需求的
    發表于 11-26 07:15

    Flash模擬EEPROM的方法

    如何將Flash模擬EEPROMEEPROM Emulation)溫馨提示:本文參考《EEPROM Emulation with Qo
    發表于 12-10 06:12

    FLASH模擬EEPROM入門指南

    FLASH模擬EEPROM入門指南使用AT32 的片上FLASH 模擬EEPROM 功能。
    發表于 10-19 06:10

    STM32 FLASH模擬EEPROM資料

    STM32 FLASH模擬EEPROM資料,mcu,單片機相關的知識及內容。
    發表于 03-10 17:14 ?18次下載

    單片機上FLASHEEPROM有什么不同?

    EEPROM麻煩的多,所以更人性化的MCU設計會集成FLASHEEPROM兩種非易失性存儲器,而廉價型設計往往只有FLASH,早期
    發表于 09-21 22:40 ?931次閱讀

    N76E003的EEPROM問題解決方案:使用Data Flash模擬EEPROM

    N76E003的EEPROM問題解決方案:使用Data Flash模擬EEPROM(嵌入式開發與應用專業開學要買電腦嗎)-N76E003的EEPRO
    發表于 07-30 09:28 ?27次下載
    N76E003的<b class='flag-5'>EEPROM</b>問題解決方案:使用Data <b class='flag-5'>Flash</b><b class='flag-5'>模擬</b><b class='flag-5'>EEPROM</b>

    MCU模擬eeprom基本功能

    MCU模擬eeprom基本功能?如果你的MCUflash足夠大。并且你的MCU提供自編程
    發表于 10-28 19:06 ?12次下載
    <b class='flag-5'>MCU</b><b class='flag-5'>模擬</b><b class='flag-5'>eeprom</b>基本功能

    MCUFLASH模擬EEPROM

    原始文件ST 官方有例子和文檔:AN2594 http://www.st.com/mcu/familiesdocs-110.html 看到不少網上使用官方例子程序不成功的問題,我估計大概是沒詳細閱讀
    發表于 10-29 09:21 ?2次下載
    <b class='flag-5'>MCU</b>之<b class='flag-5'>FLASH</b><b class='flag-5'>模擬</b><b class='flag-5'>EEPROM</b>

    AN0002—AT32 MCU如何使用片上Flash來實現EEPROM功能

    型號的 MCU 并未搭載片上 EEPROM,但是在此我們將介紹一種使用片上 Flash模擬 EEPROM 使用的方法,以作為對此應用需求的
    發表于 11-18 16:21 ?14次下載
    AN0002—AT32 <b class='flag-5'>MCU</b>如何使用片上<b class='flag-5'>Flash</b>來實現<b class='flag-5'>EEPROM</b>功能

    STM32F103:內部Flash模擬EEPROM

    內部Flash模擬EEPROM一、原因由于STM32F103系列的單片機內部Flash的擦寫次數僅有10k次,如果遇到想要存儲又多變,又需要掉電保存的數據,就顯得有點捉襟見肘了。我決定
    發表于 12-02 11:36 ?32次下載
    STM32F103:內部<b class='flag-5'>Flash</b><b class='flag-5'>模擬</b><b class='flag-5'>EEPROM</b>

    如何使用Flash模擬EEPROM存儲參數?

    MCU的使用中,經常遇到需要存儲參數或掉電保持數據等功能。其中,FlashEEPROM是常見的非易失性存儲器
    的頭像 發表于 09-21 09:14 ?983次閱讀

    APM32F4 Flash模擬EEPROM介紹和代碼實現

    FlashEEPROM一次操作的數據大小不同。雖然MCU內部的FlashEEPROM一樣,可以實現按字節的讀寫,但是在寫入的時候,是必須
    的頭像 發表于 12-01 17:52 ?532次閱讀
    APM32F4 <b class='flag-5'>Flash</b><b class='flag-5'>模擬</b><b class='flag-5'>EEPROM</b>介紹和代碼實現
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>