Перейти к содержанию

Таблица разделов ESP32 (partition table)

Флеш-память ESP32 хранит не только программу: в ней лежат настройки Wi-Fi, калибровка радио, файловая система и запасная копия прошивки для обновления. Где что лежит, описывает таблица разделов — небольшой блок по адресу 0x8000.

Обновлено Редакция GAW

Таблица разделов (partition table) — блок во флеш-памяти ESP32, который делит её на именованные разделы: приложения, хранилище настроек NVS, данные калибровки радио, файловые системы, слоты обновления. По умолчанию она лежит по смещению 0x8000, занимает 0xC00 байт (до 95 записей) и заканчивается контрольной суммой MD5; вместе с ней это ровно один сектор 4 КБ (ESP-IDF, Partition Tables). Загрузчик второй ступени читает таблицу и по ней находит приложение для запуска.

Таблица по умолчанию

Вариант «Single factory app, no OTA»:

ИмяТипПодтипСмещениеРазмер
nvsdatanvs0x90000x6000
phy_initdataphy0xF0000x1000
factoryappfactory0x100001 МБ

Вариант «Factory app, two OTA definitions» добавляет раздел otadata (0xD000, 0x2000) и два слота ota_0 и ota_1 по 1 МБ с адресов 0x110000 и 0x210000; раздел nvs в нём сокращён до 0x4000. Так флеш-память ESP32 выглядит после прошивки: загрузчик с 0x1000, таблица с 0x8000, приложение с 0x10000. Адрес 0x1000 — для исходного ESP32; в документации esptool адрес загрузчика задан подстановкой IDF_TARGET_BOOTLOADER_OFFSET и у других чипов свой. Эти адреса использует esptool, см. статью «Прошивка ESP32».

Свои таблицы

Таблицу описывают файлом CSV в проекте: строка на раздел, поля — имя (до 16 байт), тип, подтип, смещение, размер, флаги. Основные правила ESP-IDF:

  • Типы. app (0x00) и data (0x01); загрузчик учитывает только их. Коды 0x40–0xFE — для своих типов.
  • Подтипы app: factory, ota_0…ota_15, test. Подтипы data: ota, phy, nvs, nvs_keys, coredump, efuse, fat, spiffs, littlefs.
  • Выравнивание. Смещения кратны 4 КБ, разделы приложений — 64 КБ. Пустое смещение — раздел встанет сразу за предыдущим.
  • NVS — не меньше 0x3000 байт.
  • Флаги encrypted (шифровать при включённом шифровании флеш-памяти) и readonly.

CSV превращает в двоичную таблицу утилита gen_esp32part.py при сборке; она же проверяет, что образ приложения помещается в раздел. Для обновления по воздуху нужны раздел otadata и минимум два слота — подробнее в статье об обновлении OTA.

Частые вопросы

Почему прошивка не помещается, хотя флеш-память 4 МБ?

Размер приложения ограничивает раздел, а не флеш-память. В стандартной таблице «Single factory app, no OTA» раздел factory занимает 1 МБ, и если образ больше, сборка ESP-IDF остановится с ошибкой — она проверяет, что приложение помещается хотя бы в один раздел app. Выход — своя таблица в формате CSV с большим разделом приложения.

Как добавить раздел под файловую систему?

Выбрать в menuconfig вариант «Custom partition table CSV» и дописать строку с типом data и подтипом spiffs, fat или littlefs. Смещение можно не указывать: gen_esp32part.py поставит раздел сразу за предыдущим, кратно 4 КБ. Разделы приложений при этом выравниваются по 64 КБ (ESP-IDF, Partition Tables).

Что будет, если изменить таблицу на уже работающем устройстве?

Таблица — обычные данные во флеш-памяти, и при смене разметки старые разделы могут оказаться на новых местах. ESP-IDF предупреждает: если раздел NVS обрезан, например после изменения таблицы, его содержимое нужно стереть. Поэтому при смене таблицы обычно стирают флеш-память целиком (idf.py erase-flash) и записывают всё заново.

Источники

  1. Espressif. ESP-IDF Programming Guide v6.1: Partition Tables (ESP32) — таблица по умолчанию по смещению 0x8000, длина 0xC00 байт, до 95 записей, MD5 в конце, занимает сектор 0x1000; запись: имя, тип, подтип, смещение, размер, флаги; готовые таблицы «Single factory app, no OTA» (nvs 0x9000/0x6000, phy_init 0xf000/0x1000, factory 0x10000/1M) и «Factory app, two OTA definitions» (nvs 0x4000, otadata 0xd000/0x2000, ota_0 0x110000, ota_1 0x210000); имя до 16 байт; типы app 0x00, data 0x01, bootloader 0x02, partition_table 0x03, 0x40–0xFE — свои; загрузчик игнорирует типы кроме app и data; подтипы app: factory 0x00, ota_0…ota_15 0x10–0x1F, test 0x20; data: ota 0x00, phy 0x01, nvs 0x02, coredump 0x03, nvs_keys 0x04, efuse 0x05, fat 0x81, spiffs 0x82, littlefs 0x83; смещение кратно 4 КБ, приложения выровнены на 0x10000; NVS не меньше 0x3000; флаги encrypted и readonly; gen_esp32part.py, проверка размера образа при сборке
  2. Espressif. esptool v5.5.0 documentation: Flashing Firmware — пример write-flash: partition-table.bin по адресу 0x8000, приложение по 0x10000, загрузчик по адресу IDF_TARGET_BOOTLOADER_OFFSET — у ESP32 это 0x1000 (Partition Tables, подтип bootloader primary)

Нашли ошибку?