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产品升级换代和国外产品替代的最佳选择。通用功能有高精度ADCCAN接口,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 //每一个存储单元大小,一定要整除扇区大小(512)
#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

    文章

    16019

    浏览量

    343633
  • 控制器
    +关注

    关注

    112

    文章

    15228

    浏览量

    171202
  • FlaSh
    +关注

    关注

    10

    文章

    1551

    浏览量

    146646
  • 存储器
    +关注

    关注

    38

    文章

    7150

    浏览量

    161997
  • EEPROM
    +关注

    关注

    9

    文章

    927

    浏览量

    80321
收藏 人收藏

    评论

    相关推荐

    如何使用Flash模拟EEPROM存储参数

    概述在MCU的使用中,经常遇到需要存储参数或掉电保持数据等功能。其中,FlashEEPROM是常见的非易失性存储器,都可以做到设备掉电重启后,数据还会保留。但二者有明显的区别:EEPROM
    的头像 发表于 09-22 08:19 732次阅读
    如何使用<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

    如何利用STM32的FLASH模拟EEPROM

    ;不过FLASH的容量还是可观的,我们可以利用FLASH模拟EEPROM。根据《STM32F10X闪存编程》中的介绍,FLASH除了保存用户
    发表于 12-09 07:13

    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 846次阅读

    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 10次下载
    <b class='flag-5'>MCU</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 899次阅读

    APM32F4 Flash模拟EEPROM介绍和代码实现

    FlashEEPROM一次操作的数据大小不同。虽然MCU内部的FlashEEPROM一样,可以实现按字节的读写,但是在写入的时候,是必须
    的头像 发表于 12-01 17:52 400次阅读
    APM32F4 <b class='flag-5'>Flash</b><b class='flag-5'>模拟</b><b class='flag-5'>EEPROM</b>介绍和代码实现