简介

为了扇区的持久利用和存储方便采用了EasyFlash库(EasyFlash是一款开源的轻量级嵌入式Flash存储器库,方便开发者更加轻松的实现基于Flash存储器的常见应用开发)。

1.下载EasyFlash源码

通过以下网页可以下载源码

https://github.com/armink/EasyFlash

EasyFlash: 轻量级物联网设备信息存储方案,让 Flash 成为小型 KV 数据库。 全新一代版本请移步至 https://gitee.com/armink/FlashDB

2.将EasyFlash源码加入工程

 进入下载文件后,将easyflash复制到工程中,建议复制到你的硬件层同等级的文件夹(比如取名字hardware之类的)一起,需要你的工程能够找到

打开改工程,右键下图左边箭头位置,再点击Manage Project Items...

添加easeflash,再点击Add Fles...

把刚才加入到工程的easy flash文件夹中的全部.c和.h文件(包括嵌套了多重文件夹下的)都添加进入,可以根据需要剪裁,因为占用资源不多这里就不剪裁了,下图是添加完后的样子,可进行对比,是否有遗漏,然后点击ok

接着点击魔术棒,c/c++,IncludePaths的...

将easeflash的所有文件夹都包含起来,需要包含以下6个文件夹,但路径不是和我完全一样,需要多少个(..\)参考ease flash的同等级文件,输入完后点击ok,再点击ok。

3.修改源码

点开ef_cfg.h,修改添加以下内容

EF_ENV_VER_NUM是版本号,随便写了个0

EF_ERASE_MIN_SIZE这个是擦除最小字节,ht32的提供的接口是按页擦除,HT32F52352每页是512字节,HT32F52367是1024字节——从ht32f5xxxx_flash,找到LIBCFG_FLASH_PAGESIZE右键跳转定义查看。

EF_WRITE_GRAN是一次写入多少bit,接口一次写入的是u32所以是32bit

EF_START_ADDR是Flash开始使用的地址,下图使用的是100kb后的空间,HT32F52352的flash是128kb所以不能大于128*1024

ENV_AREA_SIZE是用于ENV功能的区域大小,EF_ERASE_MIN_SIZE * 2就是1024字节

点开ef_port.c加入#include "ht32.h",修改以下数组和函数

这个是为储存的数据命名的数组,需要自行添加名字,这里添加一个“reboot_time”用于后续测试

读取Flash

EfErrCode ef_port_read(uint32_t addr, uint32_t *buf, size_t size) {
    EfErrCode result = EF_NO_ERR;
		
    /* You can add your code under here. */
	
	uint8_t *buf_8 = (uint8_t *)buf;
    for (size_t i = 0; i < size; i++, addr ++, buf_8++)
    {
      *buf_8 = *(uint8_t *) addr;
    }
	
    return result;
}

删除flash

EfErrCode ef_port_erase(uint32_t addr, size_t size) {
    EfErrCode result = EF_NO_ERR;

    /* make sure the start address is a multiple of EF_ERASE_MIN_SIZE */
    EF_ASSERT(addr % EF_ERASE_MIN_SIZE == 0);

    /* You can add your code under here. */
	for(size_t i = 0;i <= size;i+=EF_ERASE_MIN_SIZE)
	{
		FLASH_ErasePage(addr+size);
	}
		

    return result;
}

写入flash

EfErrCode ef_port_write(uint32_t addr, const uint32_t *buf, size_t size) {
    EfErrCode result = EF_NO_ERR;
	uint32_t read_data;
	
    for (size_t i = 0; i < size; i += 4, buf++, addr += 4)
    {
	    FLASH_ProgramWordData(addr,*buf);
		read_data = (*((u32 volatile *) (addr)));
        /* check data */
        if (read_data != *buf)
        {
            result = EF_WRITE_ERR;
            break;
        }
	}
    /* You can add your code under here. */

    return result;
}

4.测试

在主函数中加入以下代码,串口在每次复位之后打印的数字会累加就移植成功了

  unsigned int Reboot_Time = 0;
  if(easyflash_init() == EF_NO_ERR)                         // 初始化成功
  {
    ef_get_env_blob("reboot_time", &Reboot_Time, 8, NULL);  // 读出reboot_time的值
  }
  Reboot_Time++;                                            // reboot_time的值加1
  ef_set_env_blob("reboot_time",&Reboot_Time,8);            // 保存reboot_time的值
  Bsp_Debug_Printf("Reboot_Time is %d\n",Reboot_Time);                // 打印reboot_time的值

以上移植内容参考了该博客STM32CubeMx开发之路—移植easyflash_stm32 easyflash移植-CSDN博客

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐