ESP32-IDF04-3 存储-FATFS

Posted Ciaran-byte

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP32-IDF04-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);



}


以上是关于ESP32-IDF04-3 存储-FATFS的主要内容,如果未能解决你的问题,请参考以下文章

ESP32-IDF04-1 存储-分区表

ESP32-IDF04-2 存储-NVS

ESP32-IDF 02-5 外设-UART

ESP32-IDF 05-3 WIFI-esp32获取网络时间

ESP32-IDF05-1 WIFI-esp32联网

ESP32-IDF 05-2 WIFI-esp32获取温度和天气信息