如何在Arduino框架下将SDMMC主机模式ESP32连接的SD卡格式化为FAT32?
在Arduino框架下实现ESP32 SDMMC主机模式SD卡FAT32格式化
已通过SDMMC主机模式实现ESP32与SD卡的连接,可正常进行文件创建、读写、删除操作,但无法完成FAT32格式化。由于Arduino for ESP32底层基于ESP-IDF,因此可以直接调用ESP-IDF的SDMMC和VFS FAT相关API实现格式化,无需切换到纯ESP-IDF开发环境。
方案1:挂载时自动格式化(挂载失败触发)
以下是适配Arduino框架的代码,核心是通过esp_vfs_fat_sdmmc_mount配置自动格式化逻辑:
#include "esp_vfs_fat.h" #include "driver/sdmmc_host.h" #include "sdmmc_cmd.h" #include "SD.h" void setup() { Serial.begin(115200); delay(1000); // 初始化SDMMC主机配置 sdmmc_host_t host = SDMMC_HOST_DEFAULT(); // 配置SDMMC插槽(默认使用SDMMC1总线,对应GPIO 2/4/12/13/14/15) sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT(); // 挂载配置:开启挂载失败时自动格式化 esp_vfs_fat_sdmmc_mount_config_t mount_config = { .format_if_mount_failed = true, // 关键:挂载失败则自动格式化 .max_files = 5, // 允许同时打开的最大文件数 .allocation_unit_size = 16 * 1024 // 分配单元大小,优化大文件读写效率 }; sdmmc_card_t* card = nullptr; esp_err_t err = esp_vfs_fat_sdmmc_mount("/sdcard", &host, &slot_config, &mount_config, &card); if (err != ESP_OK) { Serial.printf("SD卡操作失败:%s\n", esp_err_to_name(err)); return; } Serial.println("SD卡挂载成功(若之前挂载失败已自动执行格式化)"); // 列出根目录文件验证状态 File root = SD.open("/sdcard"); if (root) { File file = root.openNextFile(); while (file) { Serial.println(file.name()); file = root.openNextFile(); } root.close(); } else { Serial.println("无法打开SD卡根目录"); } } void loop() { // 空循环 }
方案2:主动格式化(无论挂载状态)
如果需要主动触发格式化(而非仅挂载失败时),可先卸载已挂载的SD卡,再调用格式化API:
#include "esp_vfs_fat.h" #include "driver/sdmmc_host.h" #include "sdmmc_cmd.h" #include "SD.h" void setup() { Serial.begin(115200); delay(1000); sdmmc_host_t host = SDMMC_HOST_DEFAULT(); sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT(); sdmmc_card_t* card = nullptr; // 先卸载已挂载的SD卡(若存在) esp_vfs_fat_sdmmc_unmount(); // 直接执行格式化操作 esp_err_t err = esp_vfs_fat_sdmmc_format("/sdcard", &host, &slot_config, 16 * 1024); if (err != ESP_OK) { Serial.printf("格式化失败:%s\n", esp_err_to_name(err)); return; } // 格式化完成后重新挂载SD卡 esp_vfs_fat_sdmmc_mount_config_t mount_config = { .format_if_mount_failed = false, .max_files = 5, .allocation_unit_size = 16 * 1024 }; err = esp_vfs_fat_sdmmc_mount("/sdcard", &host, &slot_config, &mount_config, &card); if (err != ESP_OK) { Serial.printf("挂载失败:%s\n", esp_err_to_name(err)); return; } Serial.println("SD卡格式化并挂载成功"); } void loop() { }
关键说明
SDMMC_SLOT_CONFIG_DEFAULT()默认使用SDMMC1总线,对应GPIO引脚:CLK(14)、CMD(15)、D0(2)、D1(4)、D2(12)、D3(13),若硬件接线不同,需修改slot_config中的引脚配置。- 分配单元大小(
allocation_unit_size)建议根据SD卡容量调整:16KB适合4GB及以上卡,4KB适合小容量卡。 - 代码中引入
SD.h是为了使用Arduino风格的文件操作API,若仅需格式化和底层操作,可移除该头文件。
内容的提问来源于stack exchange,提问作者manno
相关产品推荐
相关产品推荐

