【合泰杯】HT32F52352的Flash移植easyflash(HT32F52367通用)
是一款开源的轻量级嵌入式Flash存储器库,方便开发者更加轻松的实现基于Flash存储器的常见应用开发。
简介
为了扇区的持久利用和存储方便采用了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博客
更多推荐



所有评论(0)