MM32F3273G8P火龙果开发板MindSDK开发教程19 - littlefs文件系统的移植

news2024/11/27 8:27:58

MM32F3273G8P火龙果开发板MindSDK开发教程19 - littlefs文件系统的移植

1、littlefs简介

LittleFS 由ARM官方发布,ARM mbedOS的官方推荐文件系统,具有轻量级,掉电安全的特性。主要用在微控制器和flash上,特点如下:
掉电恢复,在写入时即使复位或者掉电也可以恢复到上一个正确的状态。
擦写均衡,有效延长flash的使用寿命。例如W25QXX系列的spi接口的flash,擦写次数大概在10万次,如果是操作flash比较频繁那么这10万次很快就会到达上限从而导致芯片废掉。
有限的RAM/ROM,相对于FATFS节省ROM和RAM空间
github传送门

2、littlefs移植

上一节我们移植了sfud库,可以对spi flash进行读写操作。但是没有文件系统,就没有文件的概念。
这节,我们在上一节的基础上,再移植littlefs文件系统。
下载解压源码包,将如下几个文件拷贝到我们的工程。
在这里插入图片描述

并且增加ifs_port.c文件,工程视图如下:
在这里插入图片描述
ifs_port.c内容如下,里面的读写函数其实调用的是sfud中的读写函数。

/* lfs_port.c */
#include "lfs.h"
#include "sfud.h"

       int lfs_flash_init(      struct lfs_config *c);
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);

int lfs_flash_init(struct lfs_config *c)
{
    sfud_init(); /* init sfud. */
    const sfud_flash *flash = sfud_get_device(0u);

    c->read = lfs_flash_read;
    c->prog = lfs_flash_prog;
    c->erase = lfs_flash_erase;
    c->sync = lfs_flash_sync;

    c->read_size = 16;
    c->prog_size = 16;
    //c->block_size = LFS_FLASH_SECTOR_SIZE;
    c->block_size = flash->chip.erase_gran;
    c->block_count = 256;
    c->block_cycles = 500;
    c->cache_size = 16;
    c->lookahead_size = 16;

    //c->read_buffer = (void *)lfs_flash_read_buf;
    //c->prog_buffer = (void *)lfs_flash_prog_buf;
    //c->lookahead_buffer = (void *)lfs_flash_lookahead_buf;


    return LFS_ERR_OK;
}

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 = block * c->block_size + off;
    const sfud_flash *flash = sfud_get_device(0u);

    sfud_read(flash, addr, size, (uint8_t *)buffer);
    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 = block * c->block_size + off;
    const sfud_flash *flash = sfud_get_device(0u);

    sfud_write(flash, addr, size, (uint8_t *)buffer);
    return LFS_ERR_OK;
}

static int lfs_flash_erase(const struct lfs_config *c, lfs_block_t block)
{
    const sfud_flash *flash = sfud_get_device(0u);

    sfud_erase(flash, block * c->block_size, c->block_size);
    return LFS_ERR_OK;
}

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

/* EOF. */

3、调用与测试

创建一个文件,写入一个值,每次开机+1,然后看是否每次开机后的值会+1。

#include <stdint.h>
#include <stdio.h>
#include "clock_init.h"
#include "hal_rcc.h"
#include "hal_gpio.h"
#include "hal_uart.h"
#include "led.h"
#include "uart.h"
#include "systick.h"
#include "key.h"
#include "timer.h"
#include "multi_button.h"
#include "spi.h"
#include "sfud.h"
#include "lfs.h"

lfs_t app_lfs;
lfs_file_t app_lfs_file;
struct lfs_config app_lfs_config;

int lfs_flash_init(struct lfs_config *c);

struct Button btn1;

void BTN1_PRESS_DOWN_Handler(void* btn)
{
	//do something...
	printf("BTN1_PRESS_DOWN_Handler \r\n");
}

void BTN1_PRESS_UP_Handler(void* btn)
{
	//do something...
	printf("BTN1_PRESS_UP_Handler \r\n");
}

int main(void)
{
	BOARD_InitBootClocks();  // ³õʼ»¯Ê±ÖÓ
	BOARD_InitDebugConsole();
	BOARD_UserKeyInit();
	LED_Init();
	BOARD_TIM6_Init();

	// for mutilbutton init
	button_init(&btn1, read_button_GPIO, 0, btn1_id);
	button_attach(&btn1, PRESS_DOWN,       BTN1_PRESS_DOWN_Handler);
	button_attach(&btn1, PRESS_UP,         BTN1_PRESS_UP_Handler);
	button_start(&btn1);

	BOARD_TIM7_Init();

	BOARD_Delay1Ms(1000);
	
	printf("Board Init Success\r\n");

    printf("spi_lfs_sfud_spi example.\r\n");

    int err = lfs_flash_init(&app_lfs_config);
    if (err)
    {
        printf("lfs_flash_init() failed.\r\n");
        while (1);
    }

    err = lfs_mount(&app_lfs, &app_lfs_config);
    if (err)
    {
        printf("lfs_mount() failed.\r\n");
        lfs_format(&app_lfs, &app_lfs_config);
        printf("lfs_format() done.\r\n");
        lfs_mount(&app_lfs, &app_lfs_config);
        printf("lfs_mount() done.\r\n");
    }

    // read current count
    uint32_t boot_count = 0;
    lfs_file_open(&app_lfs, &app_lfs_file, "boot_count", LFS_O_RDWR | LFS_O_CREAT);
    lfs_file_read(&app_lfs, &app_lfs_file, &boot_count, sizeof(boot_count));

    // update boot count
    boot_count += 1;
    lfs_file_rewind(&app_lfs, &app_lfs_file);
    lfs_file_write(&app_lfs, &app_lfs_file, &boot_count, sizeof(boot_count));

    // remember the storage is not updated until the file is closed successfully
    lfs_file_close(&app_lfs, &app_lfs_file);

    // release any resources we were using
    lfs_unmount(&app_lfs);

    // print the boot count
    printf("boot_count: %u\r\n", (unsigned)boot_count);

	while(1)
	{
	}	
}

4、现象

在这里插入图片描述

代码

代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/647102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java中的多线程、同步代码块、同步方法、锁

一、java中实现多线程的三种方式 &#xff08;1&#xff09;继承Thread类的方式进行实现&#xff1b; &#xff08;2&#xff09;实现Runnable接口的方式进行实现&#xff1b; &#xff08;3&#xff09;利用Callable接口和Future接口方式实现。 1.继承Thread类的方式进行实现 …

【性能优化】性能优化

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 性能优化运行效率![在这里插入图片描述](https://img-blog.csdnimg.cn/557680b0ca51484c9c2c6c2…

金升阳|三极管的开关速度如何提高?

​三极管是一种常见的电子器件&#xff0c;广泛应用于电路中。它的开关速度是指从关断到导通或从导通到关断的转换速度。提高三极管的开关速度可以提高电路的响应速度&#xff0c;从而提高系统的性能。本文将介绍一些常见的方法来提高三极管的开关速度。 一、选择合适的三极管 …

华为组播实验pim-dm

组播源配置&#xff1a; R1: [r1]dis current-configuration [V200R003C00] sysname r1 snmp-agent local-engineid 800007DB03000000000000 snmp-agent clock timezone China-Standard-Time minus 08:00:00 portal local-server load flash:/portalpage.zip drop illegal-mac…

2023年软件测试有前途吗?技术变革,测试人的进阶发展路线...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试行业是否…

瑞吉项目优化

Redis缓存菜品 动态构造key。客户端传来的分类id作为key。从redis中获取缓存的数据。根据分类Id&#xff0c;使用redisTemplate.opsForValue().get 方法获取缓存的数据。如果缓存数据存在&#xff0c;直接返回&#xff0c;无需访问数据库。如果不存在&#xff0c;需要查询数据…

Redis从入门到精通【高阶篇】之底层数据结构整数集(IntSet)详解

文章目录 0.前言1.IntSet基本详解1.1 整数集的压缩算法原理1.2 整数集编码方式选择原理1.2.1 判断逻辑1.2.2 举例说明 2. 源码解析2.1. intsetNew2.2. intsetAdd2.3. intsetRemove2.4. intsetFind2.5. intsetUpgradeAndAdd2.6 收获 3.总结4.思考题5. Redis从入门到精通系列文章…

【MySQL 数据库的命令操作】

目录 一、数据库的基本概念二、数据库的发展三、主流的数据库介绍五、关系数据库1、数据库的解释2、数据库的管理3、常用的数据类型4、常见的数据库结构5、SQL语句 四、MySQL 安装方法1、安装Mysql环境依赖包2、创建运行用户3、编译安装4.创建mysql用户5.修改mysql 配置文件6、…

手动将第三方资源加IOC容器中

说明&#xff1a;在SpringBoot中&#xff0c;我们可以通过在各层类上加注解&#xff08;Mapper、Service等&#xff09;声明Bean对象&#xff0c;在需要使用时&#xff0c;可直接使用AutoWirted注解自动装配。但如果是使用第三方依赖中的对象&#xff0c;因为源码不能修改&…

04 类图

类图 定义 类图显示了类(及其接口)、类的内部结构以及与其他类的联系&#xff0c;是面向对象分析和设计所得到的最重要的模型。 作用&#xff1a;可视化地表达系统的静态结构模型 类之间的几种关系&#xff1a;泛化&#xff08;Generalization&#xff09;、实现&#xff08;…

多元回归预测 | Matlab海洋捕食者算法(MPA)优化核极限学习机回归预测,MPA-KELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab海洋捕食者算法(MPA)优化核极限学习机回归预测,MPA-KELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% …

Jenkins部署及使用

Jenkins 1.定义 1.Jenkins是一款开源CI/CD软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测试和部署软件 1.CI/CD 1.CI&#xff1a;持续集成(Continuous Integration) 1.协同开发是目前主流的开发方式&#xff0c;一般由多位开发人员同时处理同一个应用的不同模块…

vue07---elementui使用/

elementui使用 cnpm isntall -S element-ui2.9 <template><div><h1>按钮的使用</h1><el-button-group><el-button type"primary" icon"el-icon-edit"></el-button><el-button type"primary" icon&…

《实战AI低代码》生成式AI和低代码开发的融合对组织效率的影响

目录 1. 自动化重复任务: 2. 智能流程优化: 3. 增强公民开发者: 4. 快速原型设计和实验: 5. 智能应用程序维护和更新: 随着科技的不断发展,生成式人工智能(AI)和低代码软件的融合已经成为了一个热门话题。这两种技术的结合可以加速创新并改变组织运作的方式。在本…

性能测试-平均事务响应时间ART分析解析,要卷就卷成最强的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 业务背景&#xf…

5.基于图神经网络的点云分类

目录 一、数据处理二、点云生成三、PointNet阶段1&#xff1a;通过动态图生成进行分组阶段2&#xff1a;邻居聚合 四、网络架构五、训练程序 在本教程中&#xff0c;您将学习使用图神经网络进行点云分类的基本工具。在这里&#xff0c;我们得到了一个对象或点集的数据集&#x…

北京大学研发基于机器学习的多能干细胞分化系统,高效、稳定制备功能性细胞

内容一览&#xff1a;20 世纪以来&#xff0c;干细胞与再生医学技术一直是国际生物医学领域的热点前沿之一。现如今&#xff0c;研究人员已开始探索将干细胞转变为特定类型细胞。然而&#xff0c;这一过程中干细胞会出现不规则生长或自发分化为不同类型细胞的情况&#xff0c;因…

大数据治理:数据安全

数据安全 (Data Security)一般指保护重要的、机密的纸质信息或数字信息&#xff0c;防止未经授权的非法访问、泄露、篡改、丢失、损坏、数据滥用等情形。数据安全涵盖的范围非常广泛&#xff0c;包括存储数据的硬件设备、访问数据的软件环境、访问权限控制、相关的规章制度等。…

vscode配置clangd和clang-format

vscode安装和配置 如何安装和配置vscode以搭建c开发环境&#xff0c;可以查看我的另一篇博客&#xff1a;Windows上最轻量的vscode-C开发环境搭建。 在这篇博客中&#xff0c;详细介绍了如何安装vscode以及应该安装哪些插件。这里不再赘述。 vscode中想使用clangd来作为语言…

Unity极坐标Shader特效,以及使用Instanced Property实现相同材质不同参数

Unity极坐标特效 先看看效果 Unity极坐标Shader特效 有时候我们需要在场景中摆放一些热点&#xff0c;用户点击之后出现互动&#xff0c;当然实现这个功能的方法有很多&#xff0c;作为一名程序员&#xff0c;当然是要用最简单的实现。用shader程序化实现它。 啥是极坐标 极坐…