ESP-IDF 框架下的 FATFS,默认使用的文件名格式是8.3短文件名

8.3格式,即文件名为8个字节,.后的后缀为3个字节。

所以一旦文件名称超出长度限制,就会造成如下显示。

esp32启动分析 esp32 fat_文件io


配置IDF工程,以使FATFS支持长文件名


8个字节长度的文件名,用起来实在不够,起码命名起来不大方便。

IDF框架的文件系统,内嵌了开源的FATFSFatFs 是面向小型嵌入式系统的一种通用的 FAT 文件系统。其程序和工作区的资源占用都非常小,可以轻松被整合到资源有限的小型微控制器中。

我们知道,FATFS长文件名的支持,需要更改 _USE_LFN为 2/3。其被定义在 ffconf.h 文件内。

而万能的IDF框架早已考虑到了这些,其对 FATFS 的代码进行部分修改,以能够使用ESP32堆/栈,来支持长文件名。

想要FF_USE_LFN 的值为2,只需要在工程中定义CONFIG_FATFS_LFN_STACK即可。

esp32启动分析 esp32 fat_ESP32_02


IDF工程中,CONFIG_开头的宏定义,通常存在于sdkconfig配置文件中,其可通过SDK Configuration Editor (menuconfig)来进行图形化配置,而用不着拿手敲。

现在搜索整个工程,因为 CONFIG_FATFS_LFN_STACK是未定义的,所以编译的时候会按照FF_USE_LFN 为0来处理,自然不支持长文件名。

下面配置IDF工程,使CONFIG_FATFS_LFN_STACKsdkconfig中被定义。

  • 点击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);