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的主要内容,如果未能解决你的问题,请参考以下文章