141|4

86

帖子

0

资源

一粒金砂(中级)

【GD32E503评测】+ Littlefs移植 [复制链接]

  littlefs 是 ARM 官方推出的,专为嵌入式系统设计的文件系统,相比传统的文件系统,littlefs 具有以下优点:

  • 自带擦写均衡
  • 支持掉电保护
  • 占用的 RAM/ROM 少

littlefs 自带的擦写均衡和掉电保护使开发者可以放心的将文件系统挂载到 nor flash 上。

https://github.com/littlefs-project/littlefs  这是github上的开源项目地址,有兴趣的可以关注下载。

 

littlefs的移植也非常简单,项目上添加lfs_util.c和lfs.c文件,然后配置参数如下:

#define BUFFER_SIZE 256
#define BLOCK_SIZE 4096
#define BOLCK_NUM 512  // 2M--512   8M--2048   16M--4096
#define LOOKAHEAD_SIZE (lfs_size_t)(BOLCK_NUM / 8)

lfs_t lfs;
lfs_file_t lfs_file;


static int lfs_flash_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size);
static int
lfs_flash_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size);
static int lfs_flash_erase(const struct lfs_config *c, lfs_block_t block);
static int lfs_flash_sync(const struct lfs_config *c);

const struct lfs_config cfg = {
	// block device operations
	.read = lfs_flash_read,
	.prog = lfs_flash_prog,
	.erase = lfs_flash_erase,
	.sync = lfs_flash_sync,

	// block device configuration
	.read_size = BUFFER_SIZE,
	.prog_size = BUFFER_SIZE,
	.block_size = BLOCK_SIZE,
	.block_count = BOLCK_NUM,
	.cache_size = BUFFER_SIZE,
	.lookahead_size = LOOKAHEAD_SIZE,
	.block_cycles = 500,
};

然后对接口函数进行补充

static int lfs_flash_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size)
{
	uint32_t addr;
	addr = ((uint32_t)block << (uint32_t)12);
	addr += off;

#ifdef enable_flash_debug
	char message[64];
	if(Flash_Debug_Flag)
	{
		memset(message, 0x00, sizeof(message));

		sprintf(message, "Flash Read Block is %d, Offset is %d, Size is %d\n\r", block, off, size);
		debug_log(message, strlen(message));
	}

#endif
	spi_flash_buffer_read((uint8_t *)buffer, addr, size);
	return LFS_ERR_OK;
}

static int
lfs_flash_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size)
{
	uint32_t addr;
	addr = ((uint32_t)block << (uint32_t)12);
	addr += off;
// SPI_Flash_Write(addr, size, (uint8_t *)buffer);
#ifdef enable_flash_debug
	char message[64];
	if(Flash_Debug_Flag)
	{
		memset(message, 0x00, sizeof(message));

		sprintf(message, "Flash Prog Block is %d, Offset is %d, Size if %d\n\r", block, off, size);
		debug_log(message, strlen(message));
	}

#endif
	spi_flash_buffer_write((uint8_t *)buffer, addr, size);
	return LFS_ERR_OK;
}

static int lfs_flash_erase(const struct lfs_config *c, lfs_block_t block)
{
#ifdef enable_flash_debug
	char message[64];

	if(Flash_Debug_Flag)
	{
		memset(message, 0x00, sizeof(message));

		sprintf(message, "Erase Block is %d\n\r", block);
		debug_log(message, strlen(message));
	}

#endif
	spi_flash_sector_erase(block << 12);
	return LFS_ERR_OK;
}

static int lfs_flash_sync(const struct lfs_config *c)
{
	return LFS_ERR_OK;
}

开发板中的spi flash的型号是gd25q16,空间大小是2M 字节,相应的驱动,开发板上附带的例程已经有了。

image-20210114160206-2.png

 

运行littlefs的测试程序,用串口debug输出结果

image-20210114160243-3.png

littlefs已经在我的多个项目中使用并量产了,到目前为止还没发现过大问题,就是写入文件有时候耗费的时间比较多,特别是文件数量比较多的时候,感觉更明显。

附上完整的项目文件供大家参考,有什么问题也大家也可以互相讨论一下:

GD32E503V-EVAL.7z (577.28 KB, 下载次数: 1)

image-20210114160139-1.png

赞赏

1

查看全部赞赏


回复

115

帖子

0

资源

一粒金砂(中级)

mark,非常棒


回复

677

帖子

2

资源

版主

666,厉害了哈!


回复

170

帖子

0

资源

一粒金砂(中级)

666,我也学习一下,还不知道怎么用

个人签名

gitee/casy


回复

3180

帖子

1

资源

五彩晶圆(初级)

好东西,前面看见推过littlefs,不错

个人签名人已离开,无事别找,找也找不到。

回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表