ESP-IDF
框架下的 FATFS
,默认使用的文件名格式是8.3短文件名
。
8.3格式,即文件名为8个字节,.后的后缀为3个字节。
所以一旦文件名称超出长度限制,就会造成如下显示。
配置IDF工程,以使FATFS支持长文件名
8个字节长度的文件名,用起来实在不够,起码命名起来不大方便。
IDF
框架的文件系统,内嵌了开源的FATFS
。FatFs
是面向小型嵌入式系统的一种通用的 FAT 文件系统。其程序和工作区的资源占用都非常小,可以轻松被整合到资源有限的小型微控制器中。
我们知道,FATFS
对长文件名
的支持,需要更改 _USE_LFN
为 2/3。其被定义在 ffconf.h
文件内。
而万能的IDF
框架早已考虑到了这些,其对 FATFS
的代码进行部分修改,以能够使用ESP32
的堆/栈
,来支持长文件名。
想要FF_USE_LFN
的值为2,只需要在工程中定义CONFIG_FATFS_LFN_STACK
即可。
IDF
工程中,CONFIG_
开头的宏定义,通常存在于sdkconfig
配置文件中,其可通过SDK Configuration Editor (menuconfig)
来进行图形化配置,而用不着拿手敲。
现在搜索整个工程,因为 CONFIG_FATFS_LFN_STACK
是未定义的,所以编译的时候会按照FF_USE_LFN
为0来处理,自然不支持长文件名。
下面配置IDF工程,使CONFIG_FATFS_LFN_STACK
在sdkconfig
中被定义。
- 点击Vscode左下角的图标,
SDK Configuration Editor (menuconfig)
。 - 搜索
CONFIG_FATFS_LFN_STACK
,将匹配到的设置项勾选,最后点击保存。 - 进行编译。等待编译完成。
- 编译完成后搜索
CONFIG_FATFS_LFN_STACK
,可以看到其已经存在。长文件名
已被支持。 - 下载、运行。现在看到的就是完整的
长文件名
。
测试代码
完整工程*:Easyio 开源库工程的 Demo - 37_JPG_LCD_DMA_SD_PHOTO_ALBUM
。
Demo 功能为:制作一个用SD卡存储照片的电子相册,它会读取SD卡/pic目录下的所有jpg图片,依次进行解码并显示在320x240
分辨率的液晶屏上。
因为使用了IDF
的虚拟文件系统 (VFS)
,所以其接口格式与标准c文件IO几乎一样,使用起来更为方便。
第三方IDF
工程如何使用 Easyio
:ESP32开源驱动库Easyio的使用
主要功能片段:
#include "easyio.h"
// SD卡初始化、FATFS文件系统挂载。总线使用SPI模式,20MHz。
sdmmc_card_t* card = sd_card_fatfs_spi_init();
while (!card) { // 验证错误,如果返回值为0,则SD卡初始化及FATFS挂载失败,重试
ESP_LOGE(TAG, "Failed !! %d Retry!!", false);
vTaskDelay(200 / portTICK_PERIOD_MS);
card = sd_card_fatfs_spi_init();
}
DIR *dir;
struct dirent *ptr;
// 列表显示 /pic目录下所有文件的文件名
// 如需>8.3的长文件名,需要设置SDK Configuration中的CONFIG_FATFS_LFN_STACK
dir = opendir(MOUNT_POINT"/pic");
printf("file list:\n");
while((ptr = readdir(dir)) != NULL) {
printf("\t%s\n", ptr->d_name);
}
closedir(dir);