1 使用MCU Flash存储数据举例-德赢Vwin官网 网
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

审核编辑:汤梓红

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

    关注

    146

    文章

    17123

    浏览量

    350960
  • FlaSh
    +关注

    关注

    10

    文章

    1633

    浏览量

    147934
  • 存储器
    +关注

    关注

    38

    文章

    7484

    浏览量

    163759
  • EEPROM
    +关注

    关注

    9

    文章

    1019

    浏览量

    81557
收藏 人收藏

    评论

    相关推荐

    实例分析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

    MC68HC908GP32 MCUFlash存储器在线编程

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

    Flash存储器概述

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

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

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

    关于Flash MCU仿真器的几种设计方法详解

    次的擦写操作,顺应了MCU功能不断修改的需求;另一方面,Flash MCU市场价格也在不断下降。实际上,Flash MCU工作时
    发表于 08-05 09:58 3712次阅读

    MCU——SRAM和Flash

    前言:MCU中的SRAM和Flash相当于计算机系统中的RAM和ROM概念。1. SRAM和Flash对比区别分类SRAMFlash容量容量小容量大读写速度快慢掉电易失掉电易失掉电不易失价格高昂低廉
    发表于 10-25 13:36 14次下载
    <b class='flag-5'>MCU</b>——SRAM和<b class='flag-5'>Flash</b>

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

    一 问题背景工程中需要使用大量的图片资源用于GUI显示,但是图片资源比较大,不能直接保存在MCU上,所以考虑外接Flash芯片用于图片数据存储。实际使用中,将
    发表于 11-05 16:50 24次下载
    【嵌入式】<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 10次下载
    单片机片上<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 3774次阅读
    YTM32系列<b class='flag-5'>MCU</b> <b class='flag-5'>Flash</b>模块功能详解

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

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

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

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

    stm32 flash数据怎么存储

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