一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

使用MCU Flash模擬EEPROM

jf_pJlTbmA9 ? 來源:敏矽MCU ? 作者:敏矽MCU敏矽MCU ? 2023-10-18 18:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1、概述

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

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

2、MCU Flash與EEPROM使用比較

擦除

擦除時間

編程

編程時間

硬件接口

擦寫壽命

MCU Flash

扇區(qū)為單位擦除,擦除后數(shù)據(jù)為0xFF

5ms

32位word編程

7us

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

10萬次

EEPROM

沒有單獨擦除功能

-

Byte編程

-

I2C接口

100萬次

3、使用MCU Flash 存儲數(shù)據(jù)舉例

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

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

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

所有需要存儲數(shù)據(jù)放在一個數(shù)據(jù)結(jié)構(gòu)中,方便存儲和提取數(shù)據(jù):

#defineDATA_AREA_ADDRESS 62*512 //數(shù)據(jù)扇區(qū)起始地址
#defineDATA_AREA_SIZE 2*512 //兩個扇區(qū)大小
#defineDATA_UINT_SIZE 64 //每一個存儲單元大小,一定要整除扇區(qū)大?。?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的數(shù)據(jù)當(dāng)錯誤發(fā)生時
{
     //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)//返回一個指向數(shù)據(jù)單元的指針,空指針表示沒有數(shù)據(jù)
{
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)//返回一個指向數(shù)據(jù)單元的指針
{
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的數(shù)據(jù)當(dāng)錯誤發(fā)生時
{
     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

系統(tǒng)啟動時,先調(diào)用data_area_init()函數(shù),返回當(dāng)前數(shù)據(jù)單元指針,你可以使用memory copy 復(fù)制數(shù)據(jù)到你的程序中。如果是空指針,你需要對你的數(shù)據(jù)賦予初值,并把它存儲到數(shù)據(jù)區(qū)。

全局變量:

data_uint_typemydata;
data_uint_type * dataptr;
main(void)
{
…
dataptr=data_area_init();//初始化
if((uint32_t)dataptr==0) //空指針
{
//對mydata賦予初值
…
//存儲數(shù)據(jù)到Flash 數(shù)據(jù)區(qū)
data_ptr =(data_uint_type *) DATA_AREA_ADDRESS;
store_data_uint( mydata,data_ptr);
}
…
//任何時候,調(diào)用store_data_uint()把mydata數(shù)據(jù)存儲到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永遠指向當(dāng)前Flash 數(shù)據(jù)
…
}

注意事項:

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

4、Revision History

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

審核編輯 黃宇


;n++)>)>

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

    關(guān)注

    146

    文章

    17978

    瀏覽量

    366658
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    17100

    瀏覽量

    184220
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1678

    瀏覽量

    151780
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7649

    瀏覽量

    167343
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1086

    瀏覽量

    83731
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    如何使用Flash模擬EEPROM存儲參數(shù)

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

    FLASH模擬EEPROM

    FLASH模擬EEPROM 由于 AT32 單片機沒有 EEPROM 功能,但是在一些應(yīng)用中需要使用 EEPROM 存儲數(shù)據(jù)。出于節(jié)省外置
    發(fā)表于 07-16 15:13

    AN0002—AT32 MCU如何使用片上Flash來實現(xiàn)EEPROM功能

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

    如何使用Flash模擬出一片eeprom

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

    在AT32系列MCUFlash模擬EEPRO的應(yīng)用原理和使用方法

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

    FLASH模擬EEPROM入門指南

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

    STM32 FLASH模擬EEPROM資料

    STM32 FLASH模擬EEPROM資料,mcu,單片機相關(guān)的知識及內(nèi)容。
    發(fā)表于 03-10 17:14 ?19次下載

    單片機上FLASHEEPROM有什么不同?

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

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

    N76E003的EEPROM問題解決方案:使用Data Flash模擬EEPROM(嵌入式開發(fā)與應(yīng)用專業(yè)開學(xué)要買電腦嗎)-N76E003的EEPRO
    發(fā)表于 07-30 09:28 ?29次下載
    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提供自編程
    發(fā)表于 10-28 19:06 ?13次下載
    <b class='flag-5'>MCU</b><b class='flag-5'>模擬</b><b class='flag-5'>eeprom</b>基本功能

    AN0002—AT32 MCU如何使用片上Flash來實現(xiàn)EEPROM功能

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

    STM32F103:內(nèi)部Flash模擬EEPROM

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

    如何使用Flash模擬EEPROM存儲參數(shù)?

    MCU的使用中,經(jīng)常遇到需要存儲參數(shù)或掉電保持?jǐn)?shù)據(jù)等功能。其中,FlashEEPROM是常見的非易失性存儲器
    的頭像 發(fā)表于 09-21 09:14 ?1911次閱讀

    APM32F4 Flash模擬EEPROM介紹和代碼實現(xiàn)

    FlashEEPROM一次操作的數(shù)據(jù)大小不同。雖然MCU內(nèi)部的FlashEEPROM一樣,可以實現(xiàn)按字節(jié)的讀寫,但是在寫入的時候,是必須
    的頭像 發(fā)表于 12-01 17:52 ?2148次閱讀
    APM32F4 <b class='flag-5'>Flash</b><b class='flag-5'>模擬</b><b class='flag-5'>EEPROM</b>介紹和代碼實現(xiàn)

    第2代C2000實時MCUEEPROM模擬

    電子發(fā)燒友網(wǎng)站提供《第2代C2000實時MCUEEPROM模擬.pdf》資料免費下載
    發(fā)表于 09-20 09:34 ?0次下載
    第2代C2000實時<b class='flag-5'>MCU</b>的<b class='flag-5'>EEPROM</b><b class='flag-5'>模擬</b>