基于HPM6000系列芯片如何使用Flash模拟EEPROM存储参数

概 述
在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 */
#define sector_size (uint32_t) (0x1000)      
/* sectors 0 and 1 base and end addresses */
#define flash_base 0x80000000l
#define sector1_base_address (flash_base+0x3fe000)
#define sector1_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_t eeprom_data[sector1_end_address-sector1_base_address+1];
flash模拟eeprom时需在ram中开辟缓存用于常态数据读写,开辟数据时应注意ram区数据应放到ahb_sram或noncacheable区域。
if defined(flash_xip) && flash_xip
attr_ramfunc hpm_stat_t initial_eeprom(void)
#else
hpm_stat_t initial_eeprom(void)
#endif
{      
    xpi_nor_config_option_t option;
    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_t status = rom_xpi_nor_auto_config(hpm_xpi0, &s_xpi_nor_config, &option);
    if (status != status_success) {
        return status;
    }
    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 flash sector size:%dkbytes flash page size:%dbytes ,
           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.
*******************************************************************************/
inline void eeprom_flush(void)
{
    memcpy((void*)eeprom_data,(const void*)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
*******************************************************************************/
#if defined(flash_xip) && flash_xip
attr_ramfunc hpm_stat_t writeeeprom_withflush(uint16_t index, uint8_t *data, uint16_t size)
#else
hpm_stat_t writeeeprom_withflush(uint16_t index, uint8_t *data, uint16_t size)
#endif
{
    hpm_stat_t status;
    if(flash_size==0) return status_fail;
    memcpy((void*)&eeprom_data[index],(const void*)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) {
        return status;
    }
    status = rom_xpi_nor_program(hpm_xpi0, xpi_xfer_channel_auto, &s_xpi_nor_config,
                                 (const uint32_t *)eeprom_data, sector1_base_address-flash_base, sector1_end_address-sector1_base_address);
    if (status != status_success) {
        return status;
    }
}
考虑到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存储数据,降低成本和提高使用灵活性。
“先楫半导体”(hpmicro)是一家致力于高性能嵌入式解决方案的半导体公司,总部位于上海,产品覆盖微控制器、微处理器和周边芯片,以及配套的开发工具和生态系统。公司成立于2020年6月,总部坐落于上海市张江高科技园区,并在天津、深圳和苏州均设立分公司。核心团队来自世界知名半导体公司管理团队,具有15年以上,超过20个soc的丰富的研发及管理经验。先楫半导体以产品质量为本,所有产品均通过严格的可靠性测试。目前已经量产的高性能通用mcu产品包含hpm6700/6400、hpm6300、hpm6200及hpm5300四个系列,性能领先国际同类产品并通过aec-q100认证。公司已完成iso9001质量管理认证和iso 26262功能安全管理体系asil d认证,全力服务中国乃至全球的工业、汽车和能源市场。更多信息,请访问 https://hpmicro.com/


无与伦比的威力与灵活性!赛灵思电源效率解决方案
FreeRTOS代码剖析之5:链表管理list.c
谷歌在今年商业化无人驾驶出租车业务 百度、华为和滴滴遭遇危机
如何选择示波器的带宽、采样率、存储深度、垂直分辨率
OPPOR11什么时候上市最新消息:OPPOR11发布会、发布会形式、发布会明星明日揭晓 ,拍照技术3大汇总
基于HPM6000系列芯片如何使用Flash模拟EEPROM存储参数
14nm北极星独显入驻15寸MBP,跑分杠杠的!
新款MCU EFM32和EFM8功能升级,加速物联网产品原型设计
品质因数Q0和带宽BW的联系
深度学习是实施机器学习的众多方法之一 拥有很大的提升空间
上半年全球风险投资额缩水48%至1739亿美元 近四分之一流向AI初创公司
DSl8B20构成的多点温度测量系统的设计
智能穿戴的春天来了?上海物联网及智能穿戴式峰会为你揭秘
爱仕达助推五金行业 实现自动化、智能化转型升级
揭秘日本雷克萨斯九州工厂
6位智能制造领域代表将提哪些议案?
元器件布局的10条规则
诚迈科技携数智成果亮相南京软博会,交出数实融合圆满答卷
仙知机器人惊艳亮相国际盛会,致力于服务自动化领域各行业集成商
浩鲸科技如何让5G与行业“共舞”?