Файловая система SPIFFS в ESP32
SPIFFS (serial peripheral interface flash file system) — это файловая система, предназначенная для флэш-устройств. Она поддерживает выравнивание износа, проверку целостности файловой системы и многое другое.
- Файловая система SPIFFS не поддерживает каталоги;
- Это не стек реального времени. Одна операция записи может занять гораздо больше времени, чем другая.
- На данный момент не обнаруживает и не обрабатывает плохие блоки.
- SPIFFS может надежно использовать только около 75% выделенного пространства раздела.
- Когда в файловой системе заканчивается место, сборщик мусора пытается найти свободное место, сканируя файловую систему несколько раз, что может занять до нескольких секунд на вызов функции записи, в зависимости от требуемого места.
- Удаление файла не всегда приводит к удалению всего файла, в результате чего в файловой системе остаются неиспользуемые разделы.
- Когда ESP32 испытывает потерю питания во время работы файловой системы, это может привести к повреждению SPIFFS. Однако файловая система по-прежнему может быть восстановлена с помощью
esp_spiffs_check
.
Для использования SPIFFS памяти нужно разметить ее в таблице разделов partitions.csv
:
# ESP-IDF Partition Table# Name, Type, SubType, Offset, Size, Flagsnvs, data, nvs, 0x9000, 24K,phy_init, data, phy, , 4K,spiffs, data, spiffs, , 500K,factory, app, factory, , 7600K,
Файл настройки PlatformIO:
[env:esp32dev]platform = espressif32board = esp32devframework = espidfmonitor_speed = 115200monitor_filters = esp32_exception_decodermonitor_port = /dev/cu.SLAB_USBtoUARTupload_port = /dev/cu.SLAB_USBtoUARTboard_upload.flash_size = 8MBboard_upload.maximum_size=8388608board_build.partitions = partitions.csv
В PlatformIO создаем каталог data
, все что в нем будет находиться можно будет достать на ESP32 как файл. Не забываем что SPIFFS не умеет работать с каталогами, каталоги внутри каталога data
создавать нельзя.

Для загрузки каталога его нужно сбилдить (Platform -> Build Filesystem Image) и загрузить в ESP32 (Platform -> Upload Filesystem Image).

Ниже приведен пример кода как можно считать содержимое файла из data/hello.txt
:
#include "freertos/FreeRTOS.h"#include "esp_log.h"#include "esp_spiffs.h"static const char *TAG = "NVS";void app_main(void){esp_vfs_spiffs_conf_t conf = {.base_path = "/spiffs",.partition_label = NULL,.max_files = 5,.format_if_mount_failed = true};ESP_ERROR_CHECK(esp_vfs_spiffs_register(&conf));FILE *f = fopen("/spiffs/hello.txt", "r");if (f == NULL){ESP_LOGE(TAG, "Failed to open file for reading");return;}char line[64];fgets(line, sizeof(line), f);fclose(f);ESP_LOGI(TAG, "Read from file: '%s'", line);// All done, unmount partition and disable SPIFFSesp_vfs_spiffs_unregister(conf.partition_label);}
Подробнее о SPIFFS можно прочитать в документации ESP-IDF.