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

 

 

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

 

 

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

 

 

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

 

 

 

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

 

 

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

 

 

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

 

 

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

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

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

 

 

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

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

 

 

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

 

 

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

 

 

 

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

 

 

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

 

 

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

 

 

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

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

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

 

 

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

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

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

 

 

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

 

 

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

 

 

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

 

 

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

 

 

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

 

 

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

 

 

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

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

 

 

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

 

 

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

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

 

 

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

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

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

 

Данная статья в Дзен.

 

 

Предыдущий урок Программирование МК ESP32 Следующий урок

 

Исходный код

 

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

 

 

Недорогие отладочные платы ESP32 можно купить здесь:

На AliExpress Недорогие отладочные платы ESP32

На Яндекс.Маркет Недорогие отладочные платы ESP32

Логический анализатор 16 каналов можно приобрести (AliExpress) здесь

 

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

ESP32 Name

 

Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)

ESP32 Name

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*