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

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

3天内不再提示

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

先楫半导体HPMicro 2023-09-22 08:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

MCU的使用中,经常遇到需要存储参数或掉电保持数据等功能。其中,Flash和EEPROM是常见的非易失性存储器,都可以做到设备掉电重启后,数据还会保留。但二者有明显的区别:EEPROM可以被编程和电擦除,而且大多数的EEPROM可以被编程和电擦除,大多数串行EEPROM允许逐字节程序或擦除操作。与EEPROM相比,闪存具有更高的密度,这允许在芯片上实现更大的内存阵列(扇区)。通过对每个单元施加时间控制的电压来执行闪存擦除和写入周期。典型的Flash写时间是50µs/8位字;然而,EEPROM通常需要5到10 ms。EEPROM不需要进行页面(扇区)擦除操作,可以擦除一个需要指定时间的特定字节。与EEPROM相比,Flash具有更高的密度和更低的价格。

先楫产品可以外接大容量Flash芯片,支持可达256Mbyte程序或数据存储;部分产品如HPM6754、HPM6364、HPM6284内置4Mbyte Flash,HPM53XX系列全系支持1Mbyte Flash。在使用Flash模拟EEPROM时,最重要的挑战是满足Flash程序/擦除持久性和数据保留方面的可靠性目标。

其次,在应用程序的控制下,需要满足更新和读取数据的实时应用要求。请注意,在Flash擦写期间,它不能执行Flash应用程序,因为在此时间内不能执行在Flash中的程序,通常程序是将Flash擦写程序拷贝到RAM中执行。先楫半导体为了方便客户程序应用,已经将Flash驱动程序集成到ROM中,减少了系统对RAM的需求,用户使用时更加灵活方便。

由于Flash的块擦除要求,必须完全为模拟的EEPROM保留至少一个Flash扇区。例如,一个4K x 8bit大小的Flash扇区可以分为16页,每个页的大小为256 x 8bit。这使得每个页面相当于一个256 x 8字节的EEPROM。要保存的数据首先写入RAM中的缓冲区中,每个部分RAM可以模拟EEPROM的存储的数据。

如何实现?

根据Flash扇区和模拟的EEPROM的大小,划分相应的Flash和RAM空间。

功能:

• 读取片内或片外flash信息。

• 批量读取flash中数据到RAM缓存中。

• 用户可以自由读写RAM缓存中数据。

• 用户可以将RAM缓存中数据写入flash。

• 用户可以根据自己的需要定制存储空间大小和存储地址。

由于先楫半导体MCU已经集成了Flash驱动,用户可以不再需要把精力放到繁琐的底层Flash驱动部分。

为了实现此功能,需要8个函数来进行编程、读取和擦除,3个宏定义确定存储空间和位置。

/* Sector size */

#defineSECTOR_SIZE (uint32_t) (0x1000)

/* Sectors 0 and 1 base and end addresses */

#defineFlash_base 0x80000000L

#defineSECTOR1_BASE_ADDRESS (Flash_base+0x3FE000)

#defineSECTOR1_END_ADDRESS (SECTOR1_BASE_ADDRESS+SECTOR_SIZE*2-1)

其中,SECTOR_SIZE定义了flash扇区大小,单位是byte。若不确定flash扇区大小可以在Initial_EEProm函数中获取flash信息。Flash_base定义flash起始地址,具体可以参考user guider中系统内存映射 System Memory Map地址。SECTOR1_BASE_ADDRESS和SECTOR1_END_ADDRESS为数据存放起始地址,SECTOR1_BASE_ADDRESS必须是特定扇区起始地址。

ATTR_PLACE_AT_WITH_ALIGNMENT(".ahb_sram",8) uint8_tEEPROM_data[SECTOR1_END_ADDRESS-SECTOR1_BASE_ADDRESS+1];

Flash模拟EEPROM时需在RAM中开辟缓存用于常态数据读写,开辟数据时应注意RAM区数据应放到ahb_sram或noncacheable区域。

ifdefined(FLASH_XIP) &&FLASH_XIP

ATTR_RAMFUNC hpm_stat_tInitial_EEProm(void)

#else

hpm_stat_tInitial_EEProm(void)

#endif

{

xpi_nor_config_option_toption;

option.header.U= BOARD_APP_XPI_NOR_CFG_OPT_HDR;

option.option0.U= BOARD_APP_XPI_NOR_CFG_OPT_OPT0;

option.option1.U= BOARD_APP_XPI_NOR_CFG_OPT_OPT1;

hpm_stat_tstatus= rom_xpi_nor_auto_config(HPM_XPI0, &s_xpi_nor_config, &option);

if(status!= status_success) {

returnstatus;

}

rom_xpi_nor_get_property(HPM_XPI0, &s_xpi_nor_config, xpi_nor_property_total_size,

&flash_size);

rom_xpi_nor_get_property(HPM_XPI0, &s_xpi_nor_config, xpi_nor_property_sector_size,

§or_size);

rom_xpi_nor_get_property(HPM_XPI0, &s_xpi_nor_config, xpi_nor_property_page_size, &page_size);

printf("Flash Size:%dMBytes\nFlash Sector Size:%dKBytes\nFlash Page Size:%dBytes\n",

flash_size/ 1024U/ 1024U, sector_size/ 1024U, page_size);

EEProm_Flush();

}/* End Initial_EEProm */

通过调用rom_xpi_nor_auto_config()、rom_xpi_nor_get_property()获取flash信息。

/*******************************************************************************

* Routine: EEPromFlush

* Purpose: Refresh data from flash to buffer.

*******************************************************************************/

inlinevoidEEProm_Flush(void)

{

memcpy((void*)EEPROM_data,(constvoid*)SECTOR1_BASE_ADDRESS,(SECTOR1_END_ADDRESS-SECTOR1_BASE_ADDRESS));

}/* End EEProm_Flush */


从flash中读取数据无需单独调用API函数,直接寻址读取效率更高,文中通过memcpy()函数直接从flash中读取数据到RAM缓存中,后面读写参数直接读写RAM缓存即可。

如果需要将参数写入flash中,需将整块flash擦写,由于数据已经存在RAM缓存,不会存在flash擦写时数据丢失的问题。

/*******************************************************************************

* Routine: writeEEProm_withflush

* Purpose: Writes variable to EEPROM and flush flash later.

* Input : none

* Output: None.

* Return: Returns 0

*******************************************************************************/

#ifdefined(FLASH_XIP) &&FLASH_XIP

ATTR_RAMFUNC hpm_stat_twriteEEProm_withflush(uint16_tindex, uint8_t*data, uint16_tsize)

#else

hpm_stat_twriteEEProm_withflush(uint16_tindex, uint8_t*data, uint16_tsize)

#endif

{

hpm_stat_tstatus;

if(flash_size==0) returnstatus_fail;

memcpy((void*)&EEPROM_data[index],(constvoid*)data,size);

status= rom_xpi_nor_erase(HPM_XPI0, xpi_xfer_channel_auto, &s_xpi_nor_config,

SECTOR1_BASE_ADDRESS-Flash_base, SECTOR1_END_ADDRESS-SECTOR1_BASE_ADDRESS);

if(status!= status_success) {

returnstatus;

}

status= rom_xpi_nor_program(HPM_XPI0, xpi_xfer_channel_auto, &s_xpi_nor_config,

(constuint32_t*)EEPROM_data, SECTOR1_BASE_ADDRESS-Flash_base, SECTOR1_END_ADDRESS-SECTOR1_BASE_ADDRESS);

if(status!= status_success) {

returnstatus;

}

}


考虑到flash擦写期间不能读取flash,flash擦写函数需放置在RAM执行的程序存储空间。先楫SDK中已经定义好了ram运行区域,并在HPM_COMMON.H文件中将函数和数字放置属性重新封装,通过ATTR_RAMFUNC等效定义__attribute__((section(“.fast”)))。为确保擦写flash期间不会被中断打断从而调用其他flash中的程序,需在运行中关闭中断。

//disable all interrupt before programming flash

CSR_reg= disable_global_irq(CSR_MSTATUS_MIE_MASK);

disable_global_irq(CSR_MSTATUS_SIE_MASK);

disable_global_irq(CSR_MSTATUS_UIE_MASK);

writeEEProm_withflush(0,(uint8_t*)s_write_buf,0x1000);//update eeprom with flash

//restore interrupt

restore_global_irq(CSR_reg);

小 结

本文首先介绍了基于HPM6000系列芯片如何使用Flash模拟EEPROM存储参数。由于先楫SDK中已经提供了强大的驱动库,用户可以方便地通过Flash存储数据,降低成本和提高使用灵活性。

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

    关注

    147

    文章

    18613

    浏览量

    387207
  • FlaSh
    +关注

    关注

    10

    文章

    1715

    浏览量

    154710
  • 存储
    +关注

    关注

    13

    文章

    4696

    浏览量

    89574
  • 模拟
    +关注

    关注

    7

    文章

    1445

    浏览量

    85125
  • EEPROM
    +关注

    关注

    9

    文章

    1129

    浏览量

    85540
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    把CW32L010用FLASH模拟EEPROM

    CW32L010横空出世,定时器和ADC变化很大,FLASH基本和以前型号一样,但有一点改动,BUSY位从CR1寄存器改到ISR寄存器了。 把F003的程序改改就能用,太棒了,拿走不谢。 只有一个
    发表于 11-24 07:40

    意法半导体Page EEPROM打破数据存储的玻璃天花板

    EEPROM是一项成熟的非易失性存储(NVM)技术,其特性对当今尖端应用的发展具有非常重要的意义。意法半导体(ST)是全球EEPROM芯片知名厂商和存储器产品和工艺创新名企之一,其连接
    的头像 发表于 11-17 09:30 1230次阅读

    ‌STM32 EEPROM存储扩展板技术解析与应用指南

    STMicroelectronics X-NUCLEO-EEICA1 I²C EEPROM存储器扩展板非常适合用于M24256E-F和M24M01E-F系列I^2^C EEPROM
    的头像 发表于 10-21 16:22 416次阅读
    ‌STM32 <b class='flag-5'>EEPROM</b><b class='flag-5'>存储</b>扩展板技术解析与应用指南

    A25:MCU系统器件知识与应用专题--MCU、EEPROM/FLASH和晶体/晶振知识及应用案例

    基本特点、功能、选型参数详细说明、供应资源)及选用案例; 3、介绍flash/EEPROM的基本知识及选用案例; 4、介绍晶振及其他外围器件的基本知识及选用案例; 适应对象:PACK
    的头像 发表于 09-09 10:24 433次阅读
    A25:MCU系统器件知识与应用专题--MCU、<b class='flag-5'>EEPROM</b>/<b class='flag-5'>FLASH</b>和晶体/晶振知识及应用案例

    FLASH模拟EEPROM入门指南

    以下是一份基于多款芯片实践总结出的 FLASH模拟EEPROM入门指南,涵盖核心概念、关键步骤及实用技巧: 一、基本概念与原理 背景动机 需求驱动:许多MCU(如AT32)未集成原生EEPR
    发表于 08-14 06:13

    求助,关于STM32F407的flash读写问题求解

    目前flash模拟EEPROM是参考的官方的flash读写代码,但C语言中attribute ((at())绝对定位的应用 网上的一段代码如下 1、定位到
    发表于 07-18 07:14

    FLASH模拟EEPROM

    FLASH模拟EEPROM 由于 AT32 单片机没有 EEPROM 功能,但是在一些应用中需要使用 EEPROM
    发表于 07-16 15:13

    第二十九章 读写内部FLASH

    本文介绍了W55MH32内部FLASH,其含主存储、系统存储等,可存储代码及掉电保存数据。读写需解锁、擦除页等步骤,标准库提供相关函数。还展示了擦除编程测试及
    的头像 发表于 06-20 14:09 1002次阅读
    第二十九章 读写内部<b class='flag-5'>FLASH</b>

    扒一扒单片机与存储器的那些事

    单片机与存储器的关系像什么?单片机里的存储都是一样的吗?为什么有的单片机既有EEPROM又有Flash
    的头像 发表于 04-10 10:06 1332次阅读
    扒一扒单片机与<b class='flag-5'>存储</b>器的那些事

    存储技术探秘 NAND Flash vs NOR Flash:藏在芯片里的&quot;门道之争&quot;

    门电路玄机 NOR Flash:Intel 1988 年革命性突破,终结 EPROM/EEPROM 垄断时代 NAND Flash:东芝 1989 年发布,开创 "低成本比特" 存储
    的头像 发表于 03-18 12:06 1056次阅读

    如何优化EEPROM的数据存储策略

    EEPROM(Electrically Erasable Programmable Read-Only Memory,电可擦除可编程只读存储器)是一种非挥发性存储器,可以在没有电源的情况下保持数据
    的头像 发表于 12-16 17:21 2031次阅读

    EEPROM与SRAM的区别和应用场景

    EEPROM(电可擦可编程只读存储器) 定义与特性 EEPROM是一种非易失性存储器,这意味着即使在断电的情况下,存储
    的头像 发表于 12-16 17:12 2246次阅读

    EEPROM存储器容量选择技巧 EEPROM的故障排查与维修

    EEPROM存储器容量选择技巧 选择合适的EEPROM存储器容量需要考虑多个因素,以确保所选型号能够满足应用需求并具备良好的性能和可靠性。以下是一些关键的选择技巧: 确定基本需求 :
    的头像 发表于 12-16 16:47 2599次阅读

    EEPROM在嵌入式系统中的应用 EEPROM数据保护技术解析

    的数据进行擦除和重写。在嵌入式系统中,EEPROM因其独特的特性而被广泛应用于存储关键数据,如配置参数、校准数据和固件更新等。 EEPROM在嵌入式系统中的应用 1.
    的头像 发表于 12-16 16:37 3721次阅读

    EEPROM存储器的工作原理 EEPROMFLASH存储器的比较

    EEPROM存储器的工作原理 基本结构 : EEPROM由浮栅晶体管构成,每个浮栅晶体管可以存储一个比特的数据。浮栅是一个隔离的导电区域,可以捕获和保持电子,从而改变晶体管的阈值电压。
    的头像 发表于 12-16 16:35 3047次阅读