Прошивка ESP32: esptool, режим загрузки и частые ошибки
ESP32 прошивается через встроенный в ПЗУ загрузчик по UART, и почти все проблемы с прошивкой сводятся к трём вещам: чип не вошёл в режим загрузки, связь по последовательному порту сбоит или не хватает питания. Разбираем по документации esptool, как это устроено, какие файлы и по каким адресам пишутся и что означают типичные сообщения об ошибках.
Обновлено Редакция GAW
У ESP32 два загрузчика. Первый зашит в ПЗУ чипа: при сбросе он смотрит на strapping-выводы и либо запускает программу из флеш-памяти, либо ждёт прошивку по UART. С ним и работает утилита esptool — её по документации Espressif используют под капотом ESP-IDF, Arduino и PlatformIO. Второй загрузчик — программа из флеш-памяти, которую ПЗУ загружает и запускает, а она уже стартует приложение.
Вход в режим загрузки
По документации esptool ESP32 входит в загрузчик ПЗУ, если во время сброса на GPIO0 низкий уровень; при высоком — запускает программу из флеш. Влияют и другие выводы:
| Вывод | Требование для прошивки | Что будет иначе |
|---|---|---|
| GPIO0 | ноль во время сброса | высокий — запуск программы; внутри подтяжка вверх, свободный вывод — единица |
| GPIO2 | свободен или ноль | при высоком уровне вход в загрузчик не сработает |
| GPIO12 (MTDI) | ноль или свободен (внутри подтяжка вниз) | единица переключает питание флеш на 1,8 В: флеш на 3,3 В проседает, прошивка и запуск сбоят |
| GPIO15 (MTDO) | любой | ноль отключает журнал загрузки ПЗУ |
Подробнее о каждом выводе и о других чипах Espressif — в статье о strapping-выводах.
Кнопка BOOT. Внутренние подтяжки ESP32 — около 45 кОм, поэтому esptool требует, чтобы кнопка тянула GPIO0 к земле сильно, например через 10 кОм. На платах Espressif это кнопка BOOT, рядом — EN для сброса. Ручной вход: держать BOOT и нажать EN.
Автосброс. На отладочных платах esptool сбрасывает чип сам линиями DTR и RTS преобразователя USB–UART: DTR управляет GPIO0, RTS — выводом EN. Чтобы терминал, открывающий порт, не держал чип в сбросе, на платах Espressif стоит схема из двух транзисторов: одновременно активные DTR и RTS сброса не вызывают. Для надёжной работы этой схемы нужен конденсатор 1–10 мкФ от EN к земле. Документация отмечает, что на некоторых сторонних платах его нет, и автосброс работает ненадёжно, особенно в Windows, — помогает конденсатор 1 мкФ или больше.
Как проверить режим. После сброса загрузчик ПЗУ печатает на скорости 115200 бит/с вторую строку журнала: boot:0x3 (DOWNLOAD_BOOT(...)) — чип ждёт прошивку, SPI_FAST_FLASH_BOOT — обычный запуск из флеш.
Что и куда записывается
Проект ESP-IDF для ESP32 по документации esptool состоит из трёх файлов:
| Адрес | Файл | Назначение |
|---|---|---|
| 0x1000 | bootloader.bin | загрузчик второй ступени |
| 0x8000 | partition-table.bin | таблица разделов флеш |
| 0x10000 | приложение .bin | программа |
Пример команды из документации:
python -m esptool --chip esp32 -p COM4 -b 460800 write-flash --flash-mode dio --flash-size detect --flash-freq 40m 0x1000 bootloader.bin 0x8000 partition-table.bin 0x10000 app.bin
Готовую команду с путями ко всем файлам показывают сами среды: ESP-IDF — после сборки, Arduino IDE — при включённом подробном выводе во время загрузки, PlatformIO — по pio run -v -t upload. Другие полезные команды:
erase-flash— стереть всю флеш;erase-regionстирает участок, адрес и длина кратны 4096 байт;read-flash 0 ALL dump.bin— сохранить содержимое флеш в файл;merge-bin— собрать загрузчик, таблицу разделов и приложение в один файл, который пишут с адреса 0x0. Документация советует формат--format hex: обычный двоичный файл заполняет промежутки байтами 0xFF, и прошивка идёт медленнее.
Частые ошибки
| Сообщение | Что означает по документации esptool | Что делать |
|---|---|---|
| Failed to connect | чип не вошёл в загрузчик | проверить порт и что он не занят монитором, питание 3,3 В, GPIO0 и EN; снизить скорость до 9600 для проверки |
| No serial data received | от чипа не пришло ни байта | проверить линии RX и TX, питание и вход в режим загрузки |
| Wrong boot mode detected | связь есть, но чип не в режиме загрузки | проверить схему автосброса или войти вручную кнопками BOOT и EN |
| getting no sync reply: The serial TX path seems to be down | чип в режиме загрузки, но не слышит компьютер | проверить линию TX от компьютера к чипу |
| Invalid head of packet | шум или искажение на линии | заменить кабель USB, снять плату с макетной платы, проверить питание |
| Обрыв посреди записи | сбои связи или питания | снизить скорость, проверить питание |
Прошивка прошла, но программа не работает. Документация называет три частые причины:
- Режим флеш. Некоторые модули поддерживают только dio. Запись в режиме qio проходит, но чип не может прочитать флеш при запуске. Решение —
--flash-mode dio. - Нет загрузчика. Для ESP-IDF загрузчик должен лежать по адресу 0x1000.
- Выводы флеш-памяти. GPIO6–GPIO11 заняты внешней флеш: в режиме qio — GPIO7–10, в dio — GPIO7 и 8, плюс GPIO6 и 11 в любом режиме. К ним ничего не подключают.
Журнал запуска смотрят в мониторе порта на 115200 бит/с: если программа падает на старте, это будет видно.
Питание
По документации esptool ESP32 потребляет до 70 мА постоянно и 200–300 мА в пиках, и питание 3,3 В должно это выдерживать с запасом по ёмкости. Выход 3,3 В преобразователей FT232R и плат Arduino для этого недостаточен — работа будет ненадёжной. Голым модулям вроде ESP-WROOM-32 нужен внешний накопительный конденсатор на плате. Бывает и так, что питания хватает для прошивки, но не хватает для работы программы: прошивка проходит, а программа сбоит. Тогда меняют источник 3,3 В на более мощный, добавляют конденсаторы и укорачивают провода питания — так советует Espressif. Сбросы при просадке питания ловит детектор провала напряжения.
Распиновка и схема автосброса типовой платы — в статье ESP32-DevKitC, остальные чипы Espressif — в разделе ESP32.
Частые вопросы
Как перевести ESP32 в режим прошивки вручную?
Удерживать кнопку BOOT, которая тянет GPIO0 к земле, и нажать и отпустить EN (сброс). По документации esptool чип при низком GPIO0 в момент сброса входит в загрузчик ПЗУ. Если esptool сбрасывает плату сам, но вход не срабатывает, держите BOOT нажатой всё время, пока esptool пытается подключиться.
Что значит ошибка «Failed to connect to ESP32»?
Что чип не вошёл в загрузчик или порт недоступен. Espressif советует проверить: правильный ли порт указан, не занят ли он монитором порта в другом окне, стабильно ли питание 3,3 В, верно ли подключены GPIO0 и EN, не мешают ли устройства на выводах. Для проверки можно снизить скорость до 9600 бит/с. На платах без автосброса помогает кнопка BOOT.
По каким адресам прошивать файлы ESP32?
Для проекта ESP-IDF на ESP32 по документации esptool: загрузчик bootloader.bin — по адресу 0x1000, таблица разделов — 0x8000, приложение — 0x10000. Точную команду со всеми файлами и адресами выводят сами среды: ESP-IDF после сборки, Arduino IDE при включённом подробном выводе загрузки, PlatformIO по команде pio run -v -t upload.
Прошивка проходит, но ESP32 не запускается — почему?
По документации esptool чаще всего виноваты режим флеш, питание или загрузчик. Некоторые модули работают только в режиме dio: запись в режиме qio проходит, но чип не может прочитать флеш — пишите с параметром --flash-mode dio. Питанию нужно выдерживать до 200–300 мА в пиках. Наконец, загрузчик ESP-IDF должен лежать по адресу 0x1000.
Источники
- Espressif. esptool Documentation (latest), ESP32: Boot Mode Selection — загрузчик ПЗУ при низком GPIO0 во время сброса, иначе запуск из флеш; у GPIO0 внутренняя подтяжка 45 кОм, для кнопки нужна сильная подтяжка вниз, например 10 кОм; GPIO2 — свободен или в нуле; GPIO12 в единице — флеш на 1,8 В вместо 3,3 В, возможен провал питания флеш; GPIO15 в нуле — ROM не печатает журнал; автосброс: DTR → GPIO0, RTS → EN через схему на двух транзисторах, конденсатор 1–10 мкФ от EN к земле; ручной вход — держать BOOT и нажать EN; журнал загрузки на 115200 бит/с: DOWNLOAD_BOOT или SPI_FAST_FLASH_BOOT
- Espressif. esptool Documentation (latest), ESP32: Troubleshooting — Failed to connect — чип не вошёл в загрузчик: порт, права, занятый порт, питание 3,3 В, выводы, скорость 9600 для проверки; сбои посреди записи — снизить скорость, проверить питание; qio против dio; питание до 70 мА постоянно и 200–300 мА в пиках, выход 3,3 В FT232R и Arduino недостаточен, модулям нужен внешний конденсатор; загрузчик ESP-IDF по адресу 0x1000; выводы флеш GPIO6–11; ошибки No serial data received, Wrong boot mode detected, no sync reply, Invalid head of packet и их причины
- Espressif. esptool Documentation (latest), ESP32: Basic Commands и Flashing Firmware — write-flash с парами адрес–файл, read-flash, erase-flash и erase-region кратно 4096 байт, merge-bin в один файл для записи с адреса 0x0; пример ESP-IDF: --chip esp32 -b 460800 write-flash --flash-mode dio 0x1000 bootloader.bin 0x8000 partition-table.bin 0x10000 приложение; Arduino показывает команду при включённом подробном выводе загрузки, PlatformIO — по pio run -v -t upload
Нашли ошибку?
Смотрите также
- ESP32ESP32, S2, S3, C2, C3, C5, C6, H2, P4: ядра, радио, USB, GPIO — сравнение и выбор
- Strapping-выводы ESP32Какие GPIO читаются при сбросе: загрузка, напряжение флеш-памяти, JTAG — для ESP32, S2, S3, C2, C3, C5, C6, H2, P4
- ESP32-DevKitC V438 контактов, АЦП, сенсоры, обвязка загрузки, питание, прошивка
- UARTКадр 8N1, скорость и допуск, TX и RX, уровни, USB–UART, AVR и STM32
- Загрузчик (bootloader)Прошивка МК без программатора через UART или USB
- Детектор пониженного питанияBrown-out detector: сброс МК при просадке питания