【ESP32-IDF】04-3 存储-FATFS

主系统flash挂载fatfs文件系统

1. 概述

  一般来说,我们使用存储器的时候,是使用存储器地址进行存储、读取数据的。但是,如果我们使用的存储器非常大的话,用这种方法管理数据就非常的不方便。所以就需要引入文件系统。

  这里以主系统flash挂载fatfs文件系统为例,进行举例

2. 步骤

2.1 修改分区表

  使用fatfs文件系统之前,需要在分区表内专门划分一块区域,供fatfs使用。不过我在arduino环境下修改了分区表并没有挂载成功,是在esp32-idf开发工具下成功的

  分区表具体的原理,使用方法可以参考【ESP32-IDF】04-1 存储-分区表

  本次使用的分区表结构如下

在这里插入图片描述

2.2 在主系统flash中挂载文件系统

  用到的头文件为

#include "esp_vfs.h"
#include "esp_vfs_fat.h"
 #include "esp_system.h"

  分区挂载

//01  fat系统的挂载
	
    static wl_handle_t s_wl_handle = WL_INVALID_HANDLE;  //负载均衡句柄

    esp_vfs_fat_mount_config_t mount_config;  //依托vfs管理fat文件系统
    mount_config.max_files = 4;    //同时打开的文件数量最大值是4个
    mount_config.format_if_mount_failed = true; //如果挂载失败,说明这段存储器没有fatfs的格式,就把这块内存区域格式化为fatfs
   
    
   
  
    esp_err_t e;
   
    e=esp_vfs_fat_spiflash_mount("/fat","myfat",&mount_config,&s_wl_handle); //挂载fatfs文件系统,包括文件系统路径名,分区表,文件系统配置,负载均衡句柄

    

    if (e != ESP_OK)
    {
        printf("挂载失败\n");
    }
    else
    {

        printf("挂载成功\n");
        
    }

2.3 使用操作文件的函数进行操作

  文件操作的步骤一般包括:

  • 建立文件
  • 读写文件
  • 关闭文件
//02 建立文件
FILE* f = fopen("/fat/hello.txt","wb"); //写权限,以二进制的方式打开文件
if(f==nullptr)
{
    printf("打开文件失败\n");
}
else
{
    printf("打开文件成功\n");
}

int a[10]={0,1,2,3,4,5,6,7,8,9};
fwrite(a,sizeof(int),sizeof(a)/sizeof(int),f);
 fclose(f);




//03 读文件
f = fopen("/fat/hello.txt","rb");
if(f==NULL)
{
    printf("读写失败\n");
}
else
{
    printf("读写成功\n");
}



int b[10];
 fread(b,sizeof(int),10,f);
  fclose(f);

  
for(int i=0;i<10;i++)
{
    printf("%d\n",b[i]);
}



2.4 卸载文件系统

//04 卸载文件系统

esp_vfs_fat_spiflash_unmount("/fat", s_wl_handle);



3. 总的程序


#include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
#include "esp_vfs.h"
#include "esp_vfs_fat.h"
 #include "esp_system.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"





 

extern "C" void app_main(void)
{


//01  fat系统的挂载
	
    static wl_handle_t s_wl_handle = WL_INVALID_HANDLE;  //负载均衡句柄

    esp_vfs_fat_mount_config_t mount_config;  //依托vfs管理fat文件系统
    mount_config.max_files = 4;    //同时打开的文件数量最大值是4个
    mount_config.format_if_mount_failed = true; //如果挂载失败,就把这块内存区域格式化为fatfs
   
    
   
  
    esp_err_t e;
   
    e=esp_vfs_fat_spiflash_mount("/fat","myfat",&mount_config,&s_wl_handle); //挂载fatfs文件系统

    

    if (e != ESP_OK)
    {
        printf("挂载失败\n");
    }
    else
    {

        printf("挂载成功\n");
        
    }

	
	

//02 建立文件
FILE* f = fopen("/fat/hello.txt","wb"); //写权限,以二进制的方式打开文件
if(f==nullptr)
{
    printf("打开文件失败\n");
}
else
{
    printf("打开文件成功\n");
}

int a[10]={0,1,2,3,4,5,6,7,8,9};
fwrite(a,sizeof(int),sizeof(a)/sizeof(int),f);
 fclose(f);




//03 读文件
f = fopen("/fat/hello.txt","rb");
if(f==NULL)
{
    printf("读写失败\n");
}
else
{
    printf("读写成功\n");
}



int b[10];
 fread(b,sizeof(int),10,f);
  fclose(f);

  
for(int i=0;i<10;i++)
{
    printf("%d\n",b[i]);
}




//04 卸载文件系统

esp_vfs_fat_spiflash_unmount("/fat", s_wl_handle);



}


  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值