#include "FLASH_SPIFS.h" #include "esp_spiffs.h" #include "esp_log.h" #define TAG "FLASH_SPIFS" #define MOUNT_POINT "/flash" static bool is_mounted = false; esp_err_t flash_spiffs_init(void) { ESP_LOGI(TAG, "正在初始化SPIFFS文件系统..."); esp_vfs_spiffs_conf_t conf = { .base_path = MOUNT_POINT, .partition_label = "storage", .max_files = 20, .format_if_mount_failed = true }; esp_err_t ret = esp_vfs_spiffs_register(&conf); if (ret != ESP_OK) { if (ret == ESP_FAIL) { ESP_LOGE(TAG, "无法挂载或格式化文件系统"); } else if (ret == ESP_ERR_NOT_FOUND) { ESP_LOGE(TAG, "找不到分区 'storage'"); } else { ESP_LOGE(TAG, "初始化失败 (%s)", esp_err_to_name(ret)); } return ret; } size_t total = 0, used = 0; ret = esp_spiffs_info(conf.partition_label, &total, &used); if (ret != ESP_OK) { ESP_LOGE(TAG, "获取文件系统信息失败: %s", esp_err_to_name(ret)); esp_vfs_spiffs_unregister(conf.partition_label); return ret; } is_mounted = true; ESP_LOGI(TAG, "SPIFFS文件系统挂载成功"); ESP_LOGI(TAG, "总空间: %u 字节", total); ESP_LOGI(TAG, "已用空间: %u 字节", used); ESP_LOGI(TAG, "可用空间: %u 字节", total - used); ESP_LOGI(TAG, "挂载点: %s", MOUNT_POINT); // 注意: 文件系统检查 (esp_spiffs_check) 在初始化阶段耗时过长,可能触发看门狗 // 如果需要检查文件系统完整性,可以在单独的任务中调用 flash_spiffs_format() 格式化 return ESP_OK; } bool flash_spiffs_is_mounted(void) { return is_mounted; } uint32_t flash_spiffs_get_total_size(void) { if (!is_mounted) { return 0; } size_t total = 0, used = 0; if (esp_spiffs_info("storage", &total, &used) == ESP_OK) { return total; } return 0; } uint32_t flash_spiffs_get_used_size(void) { if (!is_mounted) { return 0; } size_t total = 0, used = 0; if (esp_spiffs_info("storage", &total, &used) == ESP_OK) { return used; } return 0; } esp_err_t flash_spiffs_format(void) { if (!is_mounted) { ESP_LOGE(TAG, "文件系统未挂载"); return ESP_FAIL; } ESP_LOGW(TAG, "正在格式化文件系统,所有数据将被删除..."); // 先卸载 esp_vfs_spiffs_unregister("storage"); is_mounted = false; // 重新格式化并挂载 esp_vfs_spiffs_conf_t conf = { .base_path = MOUNT_POINT, .partition_label = "storage", .max_files = 20, .format_if_mount_failed = true }; esp_err_t ret = esp_vfs_spiffs_register(&conf); if (ret != ESP_OK) { ESP_LOGE(TAG, "格式化失败: %s", esp_err_to_name(ret)); return ret; } is_mounted = true; // 重新获取信息 size_t total = 0, used = 0; esp_spiffs_info("storage", &total, &used); ESP_LOGI(TAG, "文件系统格式化完成"); ESP_LOGI(TAG, "总空间: %u 字节", total); ESP_LOGI(TAG, "已用空间: %u 字节", used); return ESP_OK; } const char* flash_spiffs_get_mount_point(void) { return MOUNT_POINT; }