5314|6

89

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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

 

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

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

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

链接已隐藏,如需查看请登录或者注册
  这是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 字节,相应的驱动,开发板上附带的例程已经有了。

 

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

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

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

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

image-20210114160139-1.png (125.52 KB, 下载次数: 0)

image-20210114160139-1.png

最新回复

芯片自己的 flash 用这个不知道能不能充当  模拟EEPROM 的作用 ?    详情 回复 发表于 2021-1-19 17:10

赞赏

1

查看全部赞赏

点赞 关注
 
 

回复
举报

144

帖子

0

TA的资源

版主

沙发
 

mark,非常棒

 
 
 

回复

1942

帖子

2

TA的资源

版主

板凳
 

666,厉害了哈!

 
 
 

回复

267

帖子

0

TA的资源

一粒金砂(高级)

4
 

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

个人签名

gitee/casy

 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

5
 

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

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

29

帖子

0

TA的资源

一粒金砂(中级)

6
 

芯片自己的 flash 用这个不知道能不能充当  模拟EEPROM 的作用 ? 

点评

理论上可行  但是内部的flash有的不是连续的块  这样操作起来就有问题  详情 回复 发表于 2021-1-20 08:25
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(中级)

7
 
yang377156216 发表于 2021-1-19 17:10 芯片自己的 flash 用这个不知道能不能充当  模拟EEPROM 的作用 ? 

理论上可行  但是内部的flash有的不是连续的块  这样操作起来就有问题

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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