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

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

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

使用MCU Flash存儲(chǔ)數(shù)據(jù)舉例

MCU開發(fā)加油站 ? 來源:敏矽MCU ? 作者:敏矽MCU ? 2022-09-28 10:08 ? 次閱讀

1、概述

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

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

2、MCU Flash與EEPROM使用比較

擦除 擦除時(shí)間 編程 編程時(shí)間 硬件接口 擦寫壽命
MCU Flash 扇區(qū)為單位擦除,擦除后數(shù)據(jù)為0xFF 5ms 32位word編程 7us 通過寄存器接口設(shè)置編程,讀Flash通過指針直接讀 10萬次
EEPROM 沒有單獨(dú)擦除功能 - Byte編程 - I2C接口 100萬次

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

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

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

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

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

#defineDATA_AREA_ADDRESS62*512//數(shù)據(jù)扇區(qū)起始地址#defineDATA_AREA_SIZE2*512//兩個(gè)扇區(qū)大小#defineDATA_UINT_SIZE64//每一個(gè)存儲(chǔ)單元大小,一定要整除扇區(qū)大?。?12)#defineDATA_UINT_FLAG0x5555AAAAtypedefstruct{uint32_tflag;uint32_tdata1;…}data_uint_type;voidflash_erase(uint32_tstartaddr,uint32_tsize){uint32_tendaddr;endaddr=startaddr+size;//erasesectorwhile(startaddrADDR=startaddr;//setupaddrFMC->CMD=0x04;//Triggerprogrammingwhile((FMC->CMD&0x100)!=0);startaddr+=512;}return;  }uint8_tflash_word_program(uint32_taddr,uint32_tworddata)//返回一個(gè)非0的數(shù)據(jù)當(dāng)錯(cuò)誤發(fā)生時(shí){//programwordFMC->ADDR=addr;//setupaddrFMC->DATA=worddata;FMC->CMD=0x02;//Triggerprogrammingwhile((FMC->CMD&0x100)!=0);if(*(uint32_t*)addr==worddata)return0;elsereturn1;}data_uint_type* data_area_init(void)//返回一個(gè)指向數(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)//返回一個(gè)指向數(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;elseenduintaddr=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);}elsereturn(data_uint_type*)(startuintaddr);}}uint8_tstore_data_uint(data_uint_type*sur_data_ptr,data_uint_type*dst_data_ptr)//返回一個(gè)非0的數(shù)據(jù)當(dāng)錯(cuò)誤發(fā)生時(shí){uint32_tn,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);//erasewholedatasectors}for(n=0;n
系統(tǒng)啟動(dòng)時(shí),先調(diào)用data_area_init()函數(shù),返回當(dāng)前數(shù)據(jù)單元指針,你可以使用memory copy 復(fù)制數(shù)據(jù)到你的程序中。如果是空指針,你需要對(duì)你的數(shù)據(jù)賦予初值,并把它存儲(chǔ)到數(shù)據(jù)區(qū)。

全局變量:

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

由于mydata的地址是編譯器自動(dòng)設(shè)定的,如果發(fā)生mydata地址不是word對(duì)齊地址,需要手動(dòng)設(shè)置??傊_保mydata地址是word對(duì)齊的。

4、Revision History

Revision Description Date
1.0 Initial Release. July 2019

審核編輯:湯梓紅

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

    關(guān)注

    146

    文章

    17269

    瀏覽量

    352058
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1641

    瀏覽量

    148367
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7522

    瀏覽量

    164127
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1028

    瀏覽量

    81804
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    實(shí)例分析MCU的Data Flash訪問控制

    過去傳統(tǒng)的方法是在MCU上外掛EEPROM或?qū)?b class='flag-5'>MCU內(nèi)部的部分存儲(chǔ)單元專門劃分出來,以存取運(yùn)行數(shù)據(jù)。瑞薩RL78系列MCU內(nèi)嵌2KB的DAT
    發(fā)表于 11-15 15:37 ?1.6w次閱讀
    實(shí)例分析<b class='flag-5'>MCU</b>的Data <b class='flag-5'>Flash</b>訪問控制

    求助 數(shù)據(jù)存儲(chǔ)FLASH程序存儲(chǔ)FLASH數(shù)據(jù)存儲(chǔ)器的區(qū)別

    數(shù)據(jù)存儲(chǔ)FLASH程序存儲(chǔ)FLASH數(shù)據(jù)存儲(chǔ)
    發(fā)表于 11-29 09:50

    MC68HC908GP32 MCUFlash存儲(chǔ)器在線編程

    MC68HC908GP32 MCUFlash存儲(chǔ)器在線編程技術(shù).doc
    發(fā)表于 04-05 00:01 ?47次下載

    Flash存儲(chǔ)器概述

      Flash 存儲(chǔ)器的簡(jiǎn)介   在眾多的單片機(jī)中都集成了 Flash 存儲(chǔ)器系統(tǒng),該存儲(chǔ)器系統(tǒng)可用作代碼和
    發(fā)表于 11-11 18:25 ?5004次閱讀
    <b class='flag-5'>Flash</b><b class='flag-5'>存儲(chǔ)</b>器概述

    基于MCU數(shù)據(jù)存儲(chǔ)及管理方法的研究

    本文提供一種利用MCU內(nèi)部數(shù)據(jù)Flash存儲(chǔ)非易失性數(shù)據(jù)的方法,它不僅操作方便,應(yīng)用接口簡(jiǎn)單,而且可以盡量避免扇區(qū)擦除操作,提高
    發(fā)表于 09-19 11:13 ?4次下載

    關(guān)于Flash MCU仿真器的幾種設(shè)計(jì)方法詳解

    次的擦寫操作,順應(yīng)了MCU功能不斷修改的需求;另一方面,Flash MCU市場(chǎng)價(jià)格也在不斷下降。實(shí)際上,Flash MCU工作時(shí)
    發(fā)表于 08-05 09:58 ?3735次閱讀

    MCU——SRAM和Flash

    前言:MCU中的SRAM和Flash相當(dāng)于計(jì)算機(jī)系統(tǒng)中的RAM和ROM概念。1. SRAM和Flash對(duì)比區(qū)別分類SRAMFlash容量容量小容量大讀寫速度快慢掉電易失掉電易失掉電不易失價(jià)格高昂低廉
    發(fā)表于 10-25 13:36 ?14次下載
    <b class='flag-5'>MCU</b>——SRAM和<b class='flag-5'>Flash</b>

    【嵌入式】MCU外接Flash圖片數(shù)據(jù)存取實(shí)例

    一 問題背景工程中需要使用大量的圖片資源用于GUI顯示,但是圖片資源比較大,不能直接保存在MCU上,所以考慮外接Flash芯片用于圖片數(shù)據(jù)存儲(chǔ)。實(shí)際使用中,將
    發(fā)表于 11-05 16:50 ?24次下載
    【嵌入式】<b class='flag-5'>MCU</b>外接<b class='flag-5'>Flash</b>圖片<b class='flag-5'>數(shù)據(jù)</b>存取實(shí)例

    如何使用Simplicity Studio查看MCU內(nèi)部Flash數(shù)據(jù)

    很多嵌入式MCU開發(fā)工程師在產(chǎn)品開發(fā)和調(diào)試階段,需要將MCU內(nèi)部Flash存放的Code數(shù)據(jù)讀取出來,來分析數(shù)據(jù)是否被異常更改。如果做過32
    發(fā)表于 12-02 09:36 ?15次下載
    如何使用Simplicity Studio查看<b class='flag-5'>MCU</b>內(nèi)部<b class='flag-5'>Flash</b>的<b class='flag-5'>數(shù)據(jù)</b>

    瑞薩推出SH7216系列32-位片上Flash存儲(chǔ)MCU

    瑞薩推出SH7216系列32-位片上Flash存儲(chǔ)MCU作者:時(shí)間:2009-04-21來源:電子產(chǎn)品世界字號(hào):?小?中?大關(guān)鍵詞:?瑞薩?RISC?32MCU?
    發(fā)表于 12-02 09:51 ?11次下載
    瑞薩推出SH7216系列32-位片上<b class='flag-5'>Flash</b><b class='flag-5'>存儲(chǔ)</b>器<b class='flag-5'>MCU</b>

    單片機(jī)片上Flash數(shù)據(jù)存儲(chǔ)以及數(shù)據(jù)跨平臺(tái)存儲(chǔ)代碼

    存儲(chǔ)代碼占用Ram資源極少,不占用Flash用于存儲(chǔ)數(shù)據(jù)的空間,采用存儲(chǔ)空間循環(huán)使用方法達(dá)到延長fla
    發(fā)表于 12-02 10:21 ?10次下載
    單片機(jī)片上<b class='flag-5'>Flash</b><b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>存儲(chǔ)</b>以及<b class='flag-5'>數(shù)據(jù)</b>跨平臺(tái)<b class='flag-5'>存儲(chǔ)</b>代碼

    YTM32系列MCU Flash模塊功能詳解

    的直接讀取運(yùn)行,而NAND Flash讀取是基于頁的方式,一般無法隨機(jī)讀取。在MCU中,Flash需要支持程序和數(shù)據(jù)存儲(chǔ),所以實(shí)現(xiàn)方式上也
    的頭像 發(fā)表于 07-24 10:00 ?4003次閱讀
    YTM32系列<b class='flag-5'>MCU</b> <b class='flag-5'>Flash</b>模塊功能詳解

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

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

    fpga配置flash怎么用來存儲(chǔ)數(shù)據(jù)

    要求使用其他存儲(chǔ)設(shè)備,如Flash存儲(chǔ)器,來存儲(chǔ)數(shù)據(jù)Flash
    的頭像 發(fā)表于 12-15 15:42 ?2709次閱讀

    stm32 flash數(shù)據(jù)怎么存儲(chǔ)

    stm32 flash數(shù)據(jù)怎么存儲(chǔ)的? STM32是一款廣泛應(yīng)用于嵌入式系統(tǒng)開發(fā)的微控制器,它的Flash存儲(chǔ)器是其中一個(gè)重要的組成部分。
    的頭像 發(fā)表于 01-31 15:46 ?2482次閱讀