【经验】以国产32位MCU N32G455VEL7为例简述如何将片内Flash模拟EEPROM?

2022-09-28 世强
32位MCU,N32G455,N32G455VEL7,国民技术 32位MCU,N32G455,N32G455VEL7,国民技术 32位MCU,N32G455,N32G455VEL7,国民技术 32位MCU,N32G455,N32G455VEL7,国民技术

由于国民技术的N32G455系列没有EEPROM功能,但是在一些项目中需要在断电情况下对数据进行保存,以便下次上电工作时能够恢复之前的工作状态。一般会在系统中外挂 EEPROM芯片来实现,芯片内部Flash保存的数据也具有掉电不丢失功能,在保存的数据量不大的情况下(用户代码空间 + 保存数据空间不超过芯片Flash空间大小) 可以用芯片内部Flash作为用户存储空间,以节省一定硬件成本。本文介绍如何利用N32G455VEL7芯片内部Flash来模拟EEPROM功能。N32G455VEL7拥有512KB的片内Flash,其结构如下图:



根据上图可知,在主存储区,Flash被划分为256页,每页2K字节,起始地址是0x08000000。可以根据【经验】国民技术MCU片内Flash操作指南和注意事项介绍的内容,来对Flash进行读写操作,用户可以利用文章中介绍的函数来实现应用层对于保存数据的功能。


由于Flash的特性,我们也发现了使用链接文章中官方库函数的一些局限性:Flash在写入数据前,先要将数据全擦除为0xFF,且最小擦除单位是页,占2K字节空间,这个特性决定了不能简单的将旧数据擦除然后写新数据,因为这样会导致存储在这个扇区内的其他数据也被擦除,并且也会导致Flash频繁擦除而降低其使用寿命;擦写Flash之前都要先解锁,完成后还要上锁;写入数据需要按字操作,不支持半字和字节操作;数据保存时还需要考虑地址跨页的问题。这些局限都是相较于EEPROM不便的地方,为了解决以上问题,国民官方基于库函数进行了二次封装,实现了能在任意起始地址写入任意长度的Flash操作函数,代码如下:


#define    FLASH_PAGE_SIZE           2048                 // flash一页空间为2048字节

static FLASH_STS FLASH_ProgramPage(uint32_t* SrcAddr, uint32_t DstAddr, uint16_t Len)

{

    uint32_t i;

 

    for (i = 0; i < Len; i += 4)

    {

        FLASH_ProgramWord(DstAddr + i, *(uint32_t*)((uint32_t)SrcAddr + i));

                  #if (0)                // 是否开启擦除校验

        if (*(uint32_t*)(DstAddr + i) != *(uint32_t*)((uint32_t)SrcAddr + i))

        {

            return FLASH_ERROR_PG;    

        }

                  #endif

    }

    return FLASH_COMPL;

}

 

FLASH_STS FLASH_Program_User(uint32_t addr,                 // 起始地址

                                                                      uint8_t *src,           // 写入的数据指针

                                                                      uint32_t len)            // 数据字节长度          

{

         uint8_t FLASH_PAGE_BUF[FLASH_PAGE_SIZE];

    uint32_t i, flag = 0;

    uint32_t pageAddr, pageCount;

    uint32_t tmpAddr, tmpLen;  

    uint32_t startAddr, endAddr; 

 

    FLASH_Unlock();

    startAddr = addr % FLASH_PAGE_SIZE;                          

    endAddr   = (addr + len) % FLASH_PAGE_SIZE;          

        

    if (startAddr == 0)

    {

        pageAddr = addr;           

        pageCount = len / FLASH_PAGE_SIZE;

        for (i = 0; i < pageCount; i++)

        {

            if (FLASH_COMPL != FLASH_EraseOnePage(pageAddr) != 0)

                          {FLASH_Lock();        return FLASH_ERROR_WRP;}

                                  

            if (FLASH_COMPL != FLASH_ProgramPage((uint32_t*)(src + (i * FLASH_PAGE_SIZE)), pageAddr, FLASH_PAGE_SIZE))

                          {FLASH_Lock();        return FLASH_ERROR_WRP;}

           

                          pageAddr += FLASH_PAGE_SIZE;

        }

                 

        if (endAddr != 0)

        {

            for (i = 0; i < FLASH_PAGE_SIZE; i++)

                          {FLASH_PAGE_BUF[i] = ((uint8_t*)pageAddr)[i];}

                         

            tmpAddr = len % FLASH_PAGE_SIZE;

            for (i = 0; i < tmpAddr; i++)

            {FLASH_PAGE_BUF[i] = ((uint8_t*)(src + (pageCount * FLASH_PAGE_SIZE)))[i];}

                         

            if (FLASH_COMPL != FLASH_EraseOnePage(pageAddr))

            {FLASH_Lock();       return FLASH_ERROR_WRP;}

 

            if (FLASH_COMPL != FLASH_ProgramPage((uint32_t*)FLASH_PAGE_BUF, pageAddr, FLASH_PAGE_SIZE))

            {FLASH_Lock();       return FLASH_ERROR_WRP;}

        }

    }

    else

    {

        pageAddr = (addr / FLASH_PAGE_SIZE) * FLASH_PAGE_SIZE;     

        tmpAddr = addr % FLASH_PAGE_SIZE;                                             

        tmpLen = FLASH_PAGE_SIZE - tmpAddr;                                                  

       

                  if (tmpLen > len)      { tmpLen = len; flag = 0; }

        else                           { flag = 1;                                            }

 

        for (i = 0; i < FLASH_PAGE_SIZE; i++)

        {FLASH_PAGE_BUF[i] = ((uint8_t*)pageAddr)[i]; }

 

        for (i = 0; i < tmpLen; i++)

        { FLASH_PAGE_BUF[tmpAddr + i] = ((uint8_t*)src)[i]; }

                 

        if (FLASH_COMPL != FLASH_EraseOnePage(pageAddr))

        {FLASH_Lock();       return FLASH_ERROR_WRP; }

                 

        if (FLASH_COMPL != FLASH_ProgramPage((uint32_t*)FLASH_PAGE_BUF, pageAddr, FLASH_PAGE_SIZE))

        {FLASH_Lock();      return FLASH_ERROR_WRP; }

                 

        pageCount = (len - tmpLen) / FLASH_PAGE_SIZE;

        pageAddr += FLASH_PAGE_SIZE;

        for (i = 0; i < pageCount; i++)

        {

            if (FLASH_COMPL != FLASH_EraseOnePage(pageAddr))

            { FLASH_Lock();      return FLASH_ERROR_WRP; }

 

            if (FLASH_COMPL != FLASH_ProgramPage((uint32_t*)(src + tmpLen + (i * FLASH_PAGE_SIZE)), pageAddr, FLASH_PAGE_SIZE))

            {FLASH_Lock();       return FLASH_ERROR_WRP; }

                         

            pageAddr += FLASH_PAGE_SIZE;

        }

                 

        if ((endAddr != 0) && (flag == 1))

        {

            for (i = 0; i < FLASH_PAGE_SIZE; i++)

            {FLASH_PAGE_BUF[i] = ((uint8_t*)pageAddr)[i]; }

                         

            tmpAddr = (len - tmpLen) % FLASH_PAGE_SIZE;

                         

            for (i = 0; i < tmpAddr; i++)

            {FLASH_PAGE_BUF[i] = ((uint8_t*)(src + tmpLen + (pageCount * FLASH_PAGE_SIZE)))[i]; }

 

            if (FLASH_COMPL != FLASH_EraseOnePage(pageAddr))

            {FLASH_Lock();       return FLASH_ERROR_WRP; }

 

            if (FLASH_COMPL != FLASH_ProgramPage((uint32_t*)FLASH_PAGE_BUF, pageAddr, FLASH_PAGE_SIZE))

            {FLASH_Lock();       return FLASH_ERROR_WRP; }

        }

    }

 

    FLASH_Lock();

    return FLASH_COMPL;

}


注意事项:此函数需要占用2K SRAM作为Flash缓存。以上就是如何利用N32G455VEL7芯片内部Flash来模拟EEPROM功能。

授权代理商:世强先进(深圳)科技股份有限公司
技术资料,数据手册,3D模型库,原理图,PCB封装文件,选型指南来源平台:世强硬创平台www.sekorm.com
现货商城,价格查询,交期查询,订货,现货采购,在线购买,样品申请渠道:世强硬创平台电子商城www.sekorm.com/supply/
概念,方案,设计,选型,BOM优化,FAE技术支持,样品,加工定制,测试,量产供应服务提供:世强硬创平台www.sekorm.com
集成电路,电子元件,电子材料,电气自动化,电机,仪器全品类供应:世强硬创平台www.sekorm.com
  • +1 赞 0
  • 收藏
  • 评论 0

本文由hide on bush提供,版权归世强硬创平台所有,非经授权,任何媒体、网站或个人不得转载,授权转载时须注明“来源:世强硬创平台”。

相关研发服务和供应服务

评论

   |   

提交评论

全部评论(0

暂无评论

相关推荐

【经验】国产32位MCU N32G457VEL7替换STM32F407VET6的硬件设计注意事项

国民技术推出的32位MCU N32G457VEL7采用32-bit ARM Cortex-M4内核,广泛应用于网络打印,工业控制等领域,在货源紧张时完全可以替换STM32F407VET6,但封装引脚定义上还是有些许差异,需要注意。

2021-06-24 -  设计经验 代理服务 技术支持 批量订货

【经验】国民技术32位MCU N32G455使用RTC的操作步骤

​对于国民技术32位MCUN32G455的RTC使用步骤,很多人会产生疑惑或者一知半解。本文带您进行详细的了解和剖析,相信您看完后会恍然大悟。

2022-05-12 -  设计经验 代理服务 技术支持 批量订货

【经验】32位MCU EFM32系列中断分组及优先级设置方式

Silicon Labs的32位MCU EFM32系列广泛应用于物联网、智能家居、无线抄表、智能照明、可穿戴设备等领域。中断是一个MCU中比较核心的部分,在实时性要求比较高、功耗低的场合经常需要中断的配合,中断优先级是根据中断事件的重要性和紧迫程度做出的一个设置,系统先响应优先级高的中断请求,再响应优先级低的中断请求。

2019-12-24 -  设计经验 代理服务 技术支持 批量订货

灵动微电子扎根张江造“芯”,打造本土32位MCU知名品牌

灵动微电子成立于2011年,2016年进军MCU市场,2019年积极向工业、大家电、汽车等领域发力,目前已涵盖消费电子、电机与电源、家电、汽车、计算机与通信、工业控制等应用领域,客户群体包括飞利浦、小米、汇川、海尔、海信、美的等,是中国本土领先的通用32位MCU 产品及解决方案供应商。

2024-09-19 -  原厂动态 代理服务 技术支持 批量订货

工业增强级MCU优势赋能,国民技术加快布局机器人控制领域“新蓝海”!

作为工业机器人核心控制器件,MCU等控制芯片必将受惠于工业机器人市场的快速增长。 当前,国民技术32位工业增强级MCU,如N32G45X、N32G43X和N32G030等系列,已经在机械臂、机器骨骼、步进电机、伺服电机等工业应用领域获得批量应用。

2022-03-23 -  原厂动态 代理服务 技术支持 批量订货

【IC】32位MCU HK32C030家族,业界创新,12寸迭代超高性价比

航顺芯片新推出的32位MCU HK32C030,12寸迭代具有超高性价比。适用于工业应用,物联网,PC外设,智能家居,医疗设备,大小家电,手持设备等领域

2024-06-13 -  产品 代理服务 技术支持 批量订货

2024年版国民技术N32 MCU选型,全面覆盖新能源、工控、汽车、消费、医疗、物联网等各主流应用场景

N32系列MCU是国民技术基于安全SoC技术平台架构,采用32位Arm® Cortex®-M处理器内核,创新打造的以高性能、高集成度、安全、低功耗、高可靠性为特色的MCU产品。产品内置嵌入式高速加密闪存、低功耗电源管理,集成数模混合电路,以及多种密码算法硬件加速引擎和安全单元,全面覆盖新能源、工控、汽车、消费、医疗、物联网等各主流应用场景。

2024-05-16 -  器件选型 代理服务 技术支持 批量订货

为物联网开发选择最佳的MCU架构

微控制器(MCU)如何在物联网设备中使用?开发人员又该如何为产品选择最合适的MCU解决方案?Silicon Labs产品营销高级经理Gopinath Krishniah先生将通过本篇博文说明MCU的应用知识和开发技巧,并介绍评估选用8位和32位MCU的关键考量。

2024-05-15 -  设计经验 代理服务 技术支持 批量订货

【应用】国民技术32位MCU N32G455VEL7用作扫地机器人主控,算力高于STM32

多数扫地机器人用STM32系列的MCU做为主控, 但遇到疫情影响,STM32的供货出了很大问题,替代方案的需求势在必行。本文推荐国民技术的32位MCU N32G455VEL7,已经成功替代了STM32在扫地机器人的应用中大批量出货。

2021-07-20 -  应用方案 代理服务 技术支持 批量订货

国产M4内核32位MCU,240M高主频、集成以太网口,独有安全库保护核心算法 | 国产物联网及消费电子专场 世强硬创新产品研讨会

型号- SXX32F103RET6,AT32F413,SXX32F103RGT6,AT32F415,SXX32F103VGT6,SXX32F103VET6,AT32F407XX,SXX32F103VCT6,SXX32F107RBT6,SXX32F107VBT6,DM9051,AT32F421,AT32F403ARGT7,AT32F4XX,SXX32F207VCT6,AT32F403ARET7,SXX32F207VET6,AT32F403,AT32F403ARCT7,AT32F407,AT32F403AVET7,AT32F403AVGT7,AT32F403ACGT7,AT32F403AXX,AT32F403ACET7,421系列,AT32F407AXX,SXX32F207VGT6,AT32F403ACCT7,SXX32F107,AT32F403AVCT7,AT32L031,DM9162,AT32F407AVCT7,SXX32 SERIES,AT32F435,AT32F437,AT32F407VCT7,AT32F407AVGT7,AT32F403AXXU7,AT32F407VGT7,AT32F407XXT7,AT32F407RCT7,AT32F403ACGU7,AT32F407VET7,AT32F407RET7,AT32F403ACEU7,AT32F407RGT7,AT32F403ACCU7,AT32 SERIES,413系列,415系列,SXX32F407VET6,SXX32F107RCT6,SXX32F407VGT6,SXX32F107VCT6,AT32F403A 系列,403A系列,AT32F425,DM8203,AT32F403AXXT7,AT32F407 系列,403系列,SXX32F207,407系列,SXX32F407,AT32F413XX,SXX32,AT32F403A,AT32L415,AT32F407A

雅特力  - 商品及供应商介绍 代理服务 技术支持 批量订货

【IC】芯科科技新品PG26 32位MCU系列,大容量存储 + 快速AI/ML推理满足未来的物联网需求

SILICON LABS最新发布的EFM32PG26(PG26)32位微控制器系列通过提升两倍的闪存和RAM容量,以及GPIO的数量来满足各种低功耗和高性能嵌入式物联网应用需求。面向无线连接功能的需求,PG26可作为EFR32xG26多协议无线SoC平台的软件兼容MCU版本,有助于开发人员基于同一平台设计快速且无缝地升级低功耗蓝牙、Matter、Thread、Zigbee或专有无线连接设计。

2024-04-17 -  产品 代理服务 技术支持 批量订货

【经验】国产32位MCU N32G43X上移植CoreMark的步骤及结果测试

MCU的性能是选型过程中一个重要的指标,通常描述MCU性能的指标有DMIPS和CoreMark,DMIPS数据手册一般会给出。那么CoreMark就需要用户自己通过移植程序进行跑分测试。本文以国民技术的N32G43X为例,简述移植步骤及测试结果。

2021-01-17 -  设计经验 代理服务 技术支持 批量订货

【经验】32位MCU EFM32系列在Keil中接收SWO信息的配置步骤

Silicon Labs的32位MCU EFM32系列广泛应用于物联网、智能家居、无线抄表、智能照明、可穿戴设备等领域。在研发过程中会有很多繁杂的调试过程,本文主要介绍如何将Jlink的SWO接口上输出的调试信息在Keil中显示出来。

2019-10-16 -  设计经验 代理服务 技术支持 批量订货

航顺芯片并购32位MCU研发公司成都蓉芯微,将围绕HK32 MCU生态和愿景快速扩张、赋能生态!

航顺芯片经过多年发展后为更快速的人才集聚和弥补核心技术商业化,采取先投资,双方团队磨合后并购32位MCU研发公司成都蓉芯微;将持续布局采取投资控股和并购等方式,围绕航顺HK32 MCU生态和愿景快速扩张赋能生态企业得以更加快速发展。

2023-08-03 -  原厂动态 代理服务 技术支持 批量订货
展开更多

电子商城

查看更多

品牌:国民技术

品类:微控制器

价格:¥18.6471

现货: 0

品牌:国民技术

品类:微控制器

价格:¥14.1176

现货: 218

品牌:国民技术

品类:32位MCU

价格:¥1.4118

现货: 5,155

品牌:国民技术

品类:32位MCU

价格:¥3.5882

现货: 695

品牌:国民技术

品类:32BITMCU

价格:

现货: 0

品牌:国民技术

品类:32位MCU

价格:¥1.5059

现货: 0

品牌:国民技术

品类:32BITMCU

价格:

现货: 0

品牌:广芯微电子

品类:32位MCU系列芯片

价格:

现货: 100,000

品牌:广芯微电子

品类:32位MCU系列芯片

价格:

现货: 100,000

品牌:广芯微电子

品类:32位MCU系列芯片

价格:

现货: 100,000

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

现货市场

查看更多

品牌:国民技术

品类:微控制器

价格:¥18.7261

现货:25,138

品牌:兆易创新

品类:MCU

价格:¥7.0000

现货:25,380

品牌:MindMotion

品类:32位MCU

价格:¥5.9400

现货:19,996

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥61.8336

现货:17,200

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥16.7100

现货:15,887

品牌:NXP

品类:单片机

价格:¥90.8686

现货:10,811

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥69.9064

现货:7,680

品牌:MindMotion

品类:32位MCU

价格:¥2.3800

现货:6,427

品牌:RENESAS

品类:32BIT MCU

价格:¥135.5187

现货:4,320

品牌:航顺芯片

品类:32位MCU

价格:¥4.1500

现货:2,900

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

服务

查看更多

TFT LCD液晶显示屏/模组定制

可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。

最小起订量: 1000 提交需求>

高频微波射频PCB打样定制

可定制PCB最高层数:32层;板材类型:罗杰斯高频板/泰康尼高频板/ZYF中英天线板/F4B高频板/高频电路板/高频混压板/高频纯压板等;最大加工尺寸:609*889mm。

最小起订量: 1 提交需求>

查看更多

授权代理品牌:接插件及结构件

查看更多

授权代理品牌:部件、组件及配件

查看更多

授权代理品牌:电源及模块

查看更多

授权代理品牌:电子材料

查看更多

授权代理品牌:仪器仪表及测试配组件

查看更多

授权代理品牌:电工工具及材料

查看更多

授权代理品牌:机械电子元件

查看更多

授权代理品牌:加工与定制

世强和原厂的技术专家将在一个工作日内解答,帮助您快速完成研发及采购。
我要提问

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

研发客服
商务客服
服务热线

联系我们

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

投诉与建议

E-mail:claim@sekorm.com

商务合作

E-mail:contact@sekorm.com

收藏
收藏当前页面