0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MCU Flash存储数据举例

MCU开发加油站 来源:敏矽MCU 作者:敏矽MCU 2022-09-28 10:08 次阅读

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_ADDRESS62*512//数据扇区起始地址#defineDATA_AREA_SIZE2*512//两个扇区大小#defineDATA_UINT_SIZE64//每一个存储单元大小,一定要整除扇区大小(512)#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)//返回一个非0的数据当错误发生时{//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)//返回一个指向数据单元的指针,空指针表示没有数据{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;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)//返回一个非0的数据当错误发生时{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
系统启动时,先调用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数据存储到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永远指向当前Flash数据…}
注意事项:

由于mydata的地址是编译器自动设定的,如果发生mydata地址不是word对齐地址,需要手动设置。总之,要确保mydata地址是word对齐的。

4、Revision History

Revision Description Date
1.0 Initial Release. July 2019

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16011

    浏览量

    343544
  • FlaSh
    +关注

    关注

    10

    文章

    1549

    浏览量

    146641
  • 存储器
    +关注

    关注

    38

    文章

    7144

    浏览量

    161978
  • EEPROM
    +关注

    关注

    9

    文章

    926

    浏览量

    80306
收藏 人收藏

    评论

    相关推荐

    实例分析MCU的Data Flash访问控制

    过去传统的方法是在MCU上外挂EEPROM或将MCU内部的部分存储单元专门划分出来,以存取运行数据。瑞萨RL78系列MCU内嵌2KB的DAT
    发表于 11-15 15:37 1.5w次阅读
    实例分析<b class='flag-5'>MCU</b>的Data <b class='flag-5'>Flash</b>访问控制

    求助 数据存储FLASH程序存储FLASH数据存储器的区别

    数据存储FLASH程序存储FLASH数据存储
    发表于 11-29 09:50

    MCU200T如何通过PC向MCU_FLASH写入数据,如何在E203运行中恰当读取这一FLASH

    我在基于MCU200T进行开发的时候希望在系统中存在一个几MB大的只读存储空间。在程序运行之前就把存储空间里面写入好数据,在程序运行期间只会从中读取
    发表于 08-16 08:14

    MC68HC908GP32 MCUFlash存储器在线编程

    MC68HC908GP32 MCUFlash存储器在线编程技术.doc
    发表于 04-05 00:01 47次下载

    Flash存储器概述

      Flash 存储器的简介   在众多的单片机中都集成了 Flash 存储器系统,该存储器系统可用作代码和
    发表于 11-11 18:25 4628次阅读
    <b class='flag-5'>Flash</b><b class='flag-5'>存储</b>器概述

    基于MCU数据存储及管理方法的研究

    本文提供一种利用MCU内部数据Flash存储非易失性数据的方法,它不仅操作方便,应用接口简单,而且可以尽量避免扇区擦除操作,提高
    发表于 09-19 11:13 4次下载

    【嵌入式】MCU外接Flash图片数据存取实例

    一 问题背景工程中需要使用大量的图片资源用于GUI显示,但是图片资源比较大,不能直接保存在MCU上,所以考虑外接Flash芯片用于图片数据存储。实际使用中,将
    发表于 11-05 16:50 22次下载
    【嵌入式】<b class='flag-5'>MCU</b>外接<b class='flag-5'>Flash</b>图片<b class='flag-5'>数据</b>存取实例

    如何使用Simplicity Studio查看MCU内部Flash数据

    很多嵌入式MCU开发工程师在产品开发和调试阶段,需要将MCU内部Flash存放的Code数据读取出来,来分析数据是否被异常更改。如果做过32
    发表于 12-02 09:36 15次下载
    如何使用Simplicity Studio查看<b class='flag-5'>MCU</b>内部<b class='flag-5'>Flash</b>的<b class='flag-5'>数据</b>

    瑞萨推出SH7216系列32-位片上Flash存储MCU

    瑞萨推出SH7216系列32-位片上Flash存储MCU作者:时间:2009-04-21来源:电子产品世界字号: 小 中 大关键词: 瑞萨 RISC 32MCU 
    发表于 12-02 09:51 11次下载
    瑞萨推出SH7216系列32-位片上<b class='flag-5'>Flash</b><b class='flag-5'>存储</b>器<b class='flag-5'>MCU</b>

    单片机片上Flash数据存储以及数据跨平台存储代码

    存储代码占用Ram资源极少,不占用Flash用于存储数据的空间,采用存储空间循环使用方法达到延长fla
    发表于 12-02 10:21 7次下载
    单片机片上<b class='flag-5'>Flash</b><b class='flag-5'>数据</b><b class='flag-5'>存储</b>以及<b class='flag-5'>数据</b>跨平台<b class='flag-5'>存储</b>代码

    YTM32系列MCU Flash模块功能详解

    的直接读取运行,而NAND Flash读取是基于页的方式,一般无法随机读取。在MCU中,Flash需要支持程序和数据存储,所以实现方式上也
    的头像 发表于 07-24 10:00 2046次阅读
    YTM32系列<b class='flag-5'>MCU</b> <b class='flag-5'>Flash</b>模块功能详解

    使用MCU Flash模拟EEPROM

    使用MCU Flash模拟EEPROM
    的头像 发表于 10-18 18:01 449次阅读

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

    MCU的使用中,经常遇到需要存储参数或掉电保持数据等功能。其中,Flash和EEPROM是常见的非易失性存储
    的头像 发表于 09-21 09:14 895次阅读

    fpga配置flash怎么用来存储数据

    要求使用其他存储设备,如Flash存储器,来存储数据Flash
    的头像 发表于 12-15 15:42 756次阅读

    stm32 flash数据怎么存储

    stm32 flash数据怎么存储的  STM32是一款广泛应用于嵌入式系统开发的微控制器,它的Flash存储器是其中一个重要的组成部分。
    的头像 发表于 01-31 15:46 757次阅读