Найти тему
narod stream

ESP32 Урок 29. Файловая система SPIFFS

Продолжаем работу по программированию микроконтроллера ESP32 и на данном уроке мы познакомимся с возможностью использования файловой системы SPIFFS. Хотя познакомимся — громко сказано, мы с ней уже знакомы ещё со времён работы с семейством контроллеров ESP8266.

И по аналогии работы с вышеуказанной линейкой контроллеров мы столкнулись с аналогичным неудобством. Мы вполне можем передавать по протоколу HTTP документы с нашего сервера клиенту. Только мы столкнулись с проблемой их неудобного хранения на нашем сервере, а именно при помощи массива. Хотелось бы как-то хранить их в явном виде — в виде файлов. Помочь нам в этом сможет то, что у контроллера ESP32 (как впрочем и у ESP8266) есть своя файловая система SPIFFS (Serial Peripheral Interface Flash File System). Вернее даже будет сказать, что она есть не у контроллера, а содержится в комплекте IDF. Данная файловая система размещается в свободном пространстве FLASH-памяти, а так как у нас её 4 мегабайта, а для прошивки нам много места не нужно, мы до сих пор вполне умещаемся в 500 килобайтах в начале памяти, то мы вполне можем использовать некоторое пространство для файловой системы. На всякий случай мы для прошивки оставим полностью первый мегабайт, а дальше уже будем размещать файловую систему. 1-2 мегабайта нам вполне хватит для размещения служебных файлов сервера. Также в технической документации мы можем прочитать то, что на файловую систему SPIFFS наложен ряд ограничений, как то невозможность создавать директории, ограниченный размер имени файла и т.д. Но, так как хранить нам придётся немного, мы вполне в рамках данных ограничений уместимся.

Также существует утилита для добавления в образ файловой системы файлов mkspiffs, и причём, как я уже говорил в уроке по ESP8266, у меня она корректно работает только для контроллера ESP32. Поэтому мы данной утилитой сегодня тоже воспользуемся.

А схема наша, как и в прошлом занятии, будет состоять только из отладочной платы с контроллером ESP32, подключенной к USB-порту компьютера

А проект мы также с именем возьмём из давнего урока 4, в котором мы работали с кнопкой, с именем BUTTON01 и на его основе создадим проект с именем SPIFFS.

Откроем наш проект в ESPRESSIF IDE и из файла Kconfig.projbuild удалим пункт меню по работе с ножкой, к которой была подключена кнопка (BUTTON_GPIO). Также в данном файле ножку порта по умолчанию для светодиода выберем вторую

default 48 if IDF_TARGET_ESP32S3
default
2

В функции app_main файла main.c оставим только вот эти строки (заодно прибавим задержку, тем самым дадим нормально работать другим процессам)

Не забываем также в конфигураторе выбрать 4 мегабайта объёма памяти FLASH

-2

Попробуем собрать наш проект. Если всё нормально собирается, то ещё создадим заголовочный файл main.h, в который соберём все подключенные заголовочные файлы из main.c, а заодно и подключим заголовочные файлы для работы с файловой системой SPIFFS

Вернёмся в main.c и удалим подключение всех заголовочных файлов, а подключим только один

Объявим глобальный символьный массив для лога

Для того, чтобы работать с файловой системой SPIFFS, нужно объявить специальный раздел в области памяти FLASH, подключенной к контроллеру, так как если мы прошьём наш проект и запустим терминал, то при загрузке мы видим следующую таблицу разделов в FLASH-памяти

-3

Ни о каком разделе для SPIFFS здесь речь не идёт. В данном случае лучше всего объявить свою таблицу разделов. Для этого сначала идём в конфигуратор и в разделе Partition table выберем соответствующую опцию

-4

Предложенное имя файла можно не менять, мы такой и создадим в каталоге с нашим проектом (в архиве с исходником он будет) с именем partitions.csv следующего содержания

Мы расположим раздел spiffs с адреса 0xF0000. Адрес мы можем не указывать, компилятор его вычислит, он будет 0x110000, так ка 0x10000 плюс 1 мегабайт будет именно такое число.

Сохраним конфигуратор, пересоберём и перепрошьём наш код.

Теперь мы видим следующую таблицу разделов

-5

Теперь мы видим наш раздел storage. Думаю, что данная работа с таблицей разделов пойдёт нам на пользу, так как мы можем теперь распределять пространство по своему усмотрению не только для работы с SPIFFS.

Ну теперь займёмся непосредственно самой файловой системой. Для начала попробуем что-нибудь создать. Для этого мы сначала объявим и проинициализируем переменную типа структуры для нашей файловой системы и в функции app_main применим специальную функцию для регистрации файловой системы

Если обнаружатся какие-то ошибки, то выйдем из функции с соответствующим сообщением в терминале

Определим и выведем в терминал общий размер нашей файловой системы и размер, занятый файлами, а если не удастся, то выведем ошибку

Попробуем открыть файл, а если такого нет, то создадим его

Запишем в него текст и закроем

Соберём код, прошьём контроллер и посмотрим результат в терминале

-6

Отлично! Всё создалось и записалось.

А вот дальше мы поступим необычно и читать из файла будем не здесь. Мы попробуем с помощью утилиты mkspiffs прочитать образ файловой системы, получить файл и прочитать его в обычном блокноте, а в коде мы ещё начитаемся. Утилиту с небольшим файлом readme я прикрепил внизу страницы.

Итак открываем командную строку и в каталоге с утилитой сначала вытащим образ с помощью старого доброго esptool (не забываем отключать терминал)

-7

Понятно, что у вас будет свой номер порта.

У меня почему-то esptool не увиделся и я его закинул в каталог с программой

после выполнения команды у нас появится файлик с образом

-8

И теперь с помощью следующей команды извлечём из него все файлы (в нашем случае там должен быть только один) в нужный каталог, который также заранее создавать не надо. Если его нет, то он создастся

-9

Прочитаем наш файл в блокноте

-10

Теперь попробуем создать образ и записать его во FLASH-память. Для этого в каталог files скопируем ещё два файла, которые нам, возможно, в будущем пригодятся. Это файл со страничкой и иконку

-11

Теперь дадим следующую команду

-12

У нас появится ещё один файл с образом файловой системы

-13

Запишем образ в память FLASH с помощью следующей команды

-14

Можно, конечно, попробовать заново прочитать образ из памяти и вытащить оттуда файлы, но я это уже несколько раз проделывал, всё работает.

Вернёмся в наш проект, закомментируем создание файла и запись в него

Вместо этого попробуем открыть файл index.html и прочитать в терминал его содержимое

Чтобы закончить нулём строку, мы узнали размер файла, иначе потом читалка в лог будет читать и дальше до первого нуля.

Соберём код, прошьём контроллер, включим терминал и посмотрим результат работы кода

-15

Всё прекрасно прочиталось и отобразилось.

Итак, на данном уроке мы познакомились с файловой системой SPIFFS, научились открывать файлы, читать из них информацию, а также писать.

Всем спасибо за внимание!

Оригинал статьи находится здесь.

<<Предыдущий урок | Следующий урок>>

Исходный код

Утилита для работы с файловой системой SPIFFS: mkspiffs

Недорогие отладочные платы ESP32 можно купить здесь
Недорогие отладочные платы ESP32/ESP32-C3/ESP32-S3 можно купить
здесь
Логический анализатор 16 каналов можно приобрести
здесь
Многофункциональный переходник CJMCU FT232H USB к JTAG UART FIFO SPI I2C можно купить
здесь

Видео в Rutube

Программирование МК ESP32. Урок 29. Файловая система SPIFFS

Видео в Дзен

Видео в Youtube