В этой статье (перевод руководства [1]) объясняется, как правильно выбрать режим загрузки ESP32-C3, и описаны его сообщения лога загрузки.
Предупреждение: в кристалл ESP32-C3 встроен внутренний pull-up резистор подтяжки на ножке GPIO9 (и на других выводах) номиналом около 45 кОм. Если вы хотите подключить кнопку переключателя для входа в режим загрузки, то для этого необходим более мощный нижний (pull-down) подтягивающий резистор. Например, это должен быть резистор 10 кОм, соединенный с землей GND.
Более подробную информацию по выводам ESP32-C3, управляющим загрузкой (strapping pins) можно найти во врезке ниже.
Все у ESP32-C3 есть 3 внешних вывода корпуса, управляющих выбором режима загрузки (strapping pins):
• GPIO2 • GPIO8 • GPIO9
Программа может прочитать уровни на ножках GPIO2, GPIO8 и GPIO9 из поля бит GPIO_STRAPPING регистра GPIO_STRAP_REG (описание этого и других регистров см. в разделе "GPIO Matrix Register Summary" документа ESP32-C3 Technical Reference Manual [3]).
Во время системного сброса (system reset) кристалла логические уровни на выводах управления загрузкой защелкиваются, превращаясь в биты 0 или 1, и сохраняются в поле бит GPIO_STRAPPING, пока не будет отключено питание или не будет выполнено программное выключение (shut down).
Типы системного сброса включают:
• Power-On Reset (POR), сброс из-за подачи питания. • RTC watchdog reset, сброс от истечения задержки сторожевого таймера. • brownout reset, сброс из-за аварийного падения уровня напряжения питания. • analog super watchdog reset. • crystal clock glitch detection reset, сброс из-за помех на сигнале тактов.
По умолчанию ножка порта GPIO9 подключена к внутреннему верхнему резистору подтяжки (weak pull-up). Если GPIO9 никуда не подключен, или подключен к схеме с высоким сопротивлением, то защелкнутое значение бита, соответствующее GPIO9, будет равно 1.
Чтобы поменять значения strapping-бит, вы можете подключить к выводам управления загрузкой внешние резисторы подтяжки вниз или вверх (pull-down/pull-up), использовать кнопки или перемычки, или же подключить внешний MCU хоста, который будет управлять уровнями логики на этих выводах в момент включения ESP32-C3.
После завершения сброса выводы управления загрузкой работают как обычные выводы GPIO или выводы аппаратных устройств (в зависимости от их настройки кодом firmware). В таблице 4 перечислены конфигурации загрузки, управляемые strapping pins.
Таблица 4. Работа выводов управления загрузкой (Strapping Pins).
Режим загрузки(1)
Pin
По умолчанию
SPI Boot
Download Boot
GPIO2
Недоступно
1
1
GPIO8
Недоступно
Не имеет значения
1
GPIO9
Внутренняя слабая подтяжка pull-up
1
0
Разрешение/запрет печати сообщений ROM Messages в SPI Boot Mode
Pin
По умолчанию
Функциональность
GPIO8
Недоступно
Когда значение поля eFuse-бит EFUSE_UART_PRINT_CONTROL равно 0 (по умолчанию), вывод сообщений разрешен, и не управляется ножкой GPIO8.
Другие значения этого поля:
1: если GPIO8 в лог. 0, то вывод сообщений разрешен; если GPIO8 в лог. 1, то вывод запрещен. 2: если GPIO8 в лог. 0, то вывод сообщений запрещен; если GPIO8 в лог. 1, то вывод сообщений разрешен. 3: вывод сообщений запрещен и не управляется GPIO8.
Примечание (1): strapping-комбинация уровней GPIO8=0 и GPIO9=0 недопустима, и приведет к неопределенному поведению.
Рис. 7 показаны интервалы установки уровня (Setup) и удержания уровня (Hold) для strapping pins до и после достижения уровня лог. 1 сигнала сброса CHIP_EN. Эти параметры времени приведены в таблице 5.
Рис. 7. Интервалы времени Setup (t0) и Hold (t1) для Strapping Pins.
Таблица 5: Длительность интервалов времени Setup и Hold Times для выводов управления загрузкой.
Параметр
Описание
min (мс)
t0
Время установки уровня перед тем, как сигнал CHIP_EN перейдет от лог. 0 к лог. 1.
0
t1
Время удержания уровня после того, как CHIP_EN перейдет в лог. 1.
3
На многих платах разработки со встроенным портом USB/Serial утилита прошивки esptool.py (входит в состав системы программирования ESP-IDF [2]) может автоматически сбросить плату и перевести её в режим загрузки. Для этого на плате имеется простая схема из двух биполярных транзисторов NPN, управляемая дополнительными сигналами RTS и DTR виртуального последовательного порта USB - UART (часто собранного на микросхеме CH340C или FT232RL). Для других конфигураций или вашего собственного спроектированного железа вам необходимо проверить ориентацию некоторых выводов загрузки, чтобы они позволили войти в правильный режим загрузчика (Bootloader Mode).
[Выбор Bootloader Mode]
GPIO9. Кристалл ESP32-C3 автоматически запустит внутренний код ROM-загрузчика в режиме последовательного порта (serial bootloader), когда уровень GPIO9 удерживается при сбросе в лог. 0. Иначе загрузчик запустит программу, записанную в память flash.
Вход GPIO9
Режим
Low/GND (лог. 0)
ROM serial bootloader для утилиты esptool [2].
High/VCC (лог. 1)
Нормальный режим запуска приложения пользователя или вторичного загрузчика ESP-IDF.
Как уже упоминалось, у ножки порта GPIO9 есть встроенный внутренний резистор верхней подтяжки, поэтому если оставить этот вывод не подключенным, то на нем при сбросе будет уровень лог. 1.
На многих готовых отладочных платах имеется кнопка, которая помечена шелкографией как "Flash" (или "BOOT", как на некоторых платах разработчика от компании Espressif). Будучи нажатой, эта кнопка подтягивает уровень GPIO9 к лог. 0.
GPIO8. Ножка GPIO8 должна также быть подтянута к лог. 1, чтобы загрузчик надежно запустился в режим загрузки кода через последовательный интерфейс. Внимание: комбинация уровней GPIO8=0 и GPIO9=0 в момент сброса недопустима, и может привести к неожиданному поведению.
В нормальном режиме загрузки (GPIO9=1) уровень на GPIO8 игнорируется.
GPIO2. Также, как и уже упомянутые выводы управления загрузкой, есть еще ножка GPIO2, которая тоже управляет загрузкой. Более подробно см. секцию "Strapping Pins" даташита ESP32-C3 (или см. выше врезку "Strapping Pins").
[Автоматическая активация загрузчика]
Утилита esptool.py автоматически сбросит ESP32-C3, управляя линиями DTR и RTS чипа преобразователя USB - UART (это может быть чип компании FTDI, либо чипы CP210x или CH340x). Сигналы управления DTR и RTS порта UART соответственно управляют уровнями GPIO9 (вывод 15 корпуса QFN32) и CHIP_EN (вывод 7 корпуса QFN32) микроконтроллера ESP32-C3, обеспечивая тем самым автоматический запуск загрузчика в режиме прошивки (Firmware Download mode).
Примечание: когда пользуетесь утилитой esptool.py или разрабатываете свою утилиту прогаммирования, имейте в виду, что у сигналов DTR и RTS активный уровень лог. 0, логические уровни инвертированы (как собственно и уровни сигналов приема/передачи RXD/TXD), т. е. True соответствует уровню 0V, а False уровню напряжения питания VCC.
Для примера схемы автосброса с входом в режим загрузки см. схему платы разработчика ESP32 DevKitC [4]:
• Секция "Micro USB 5V & USB-UART" схемы [4] показывает сигналы управления DTR и RTS чипа преобразователя интерфейсов USB-UART, подключенные к выводам IO0 (GPIO0) и EN модуля ESP-WROOM-32 (этот модуль содержит другой микроконтроллер ESP32-D0WDQ6, поэтому вместо ножки GPIO9 используется другой сигнал GPIO0 с таким же функционалом).
• Некоторые операционные системы или драйверы могут активировать сигналы RTS или DTR автоматически, когда открывают подключение к последовательному порту (это верно для некоторых программ последовательного терминала, но не относится к скрипту утилиты esptool.py), подтягивая их одновременно к лог. 0, удерживая тем самым чип микроконтроллера ESP в состоянии сброса. Если RTS напрямую заведен на EN, то для избежания этой ситуации функцию аппаратного управления потоком через RTS/CTS (опция "hardware flow control") должна быть запрещена в настройках, управляющих последовательным портом. Реализована дополнительная схема на транзисторах, позволяющая решить эту проблему - если оба сигнала RTS и DTR активированы (переведены в уровень физического лог. 0), то это состояние не сбросит чип микроконтроллера ESP. На схеме также приведена таблица истинности логических уровней для схемы на транзисторах, управляющей уровнями IO0 и EN от сигналов RTS и DTR.
• Если подобная схема реализована (а она есть на всех платах от Espressif), то для надежной работы сброса необходимо добавить конденсатор (емкостью в диапазоне от 1 мкФ до 10 мкФ) между выводом EN и землей GND. Однако почему-то на схеме [4] на сигал EN подключены два конденсатора суммарной емкостью 0.2 мкФ (конденсаторы C9 и C14 номиналом 0.1 мкФ).
• Секция "Switch Button" схемы [4] показывает кнопки, которые нужны для активации загрузчика вручную.
Для чипа ESP32-С3 выполните следующие соединения (например с помощью схемы, аналогичной схеме [4]), чтобы утилита esptool обеспечивала автоматическую активацию режима загрузки:
Ножка ESP
Служебные сигналы UART
EN
RTS
GPIO9
DTR
Последовательные порты на Linux по умолчанию активируют сигнал RTS, когда к нему ничего не подключено. Это при использовании некоторых адаптеров преобразователя USB-UART может привести к удержанию ESP32-C3 в состоянии сброса. Такое поведение можно запретить путем запрета HUPCL (например командой sudo stty -F /dev/ttyUSB0 -hupcl).
Примечание: некоторые платы для ESP32-C3 от сторонних разработчиков используют схему автосброса для выводов EN и GPIO9, но не добавляют конденсатор на выводе EN. Это приводит к ненадежному сбросу, особенно на операционной системе Windows. Добавление конденсатора емкостью 1 мкФ (или большей емкости) между выводом EN и GND может сделать сброс более надежным.
У вас скорее всего не должно быть проблем с официальными платами разработчика от компании Espressif. Однако утилита esptool.py не сможет сбросить автоматически вашу аппаратную систему в следующих случаях:
• Сигналы DTR и RTS не соединены с выводами GPIO9 и EN (CHIP_PU) ESP32-C3. • Сигналы DTR и RTS конфигурируются по-разному, не соответствующим образом. • Сигналы DTR и RTS никак не управляются.
[Активация загрузчика вручную]
Зависимости от реализованной вами схемы аппаратуры на плате может быть реализован запуск режима Firmware Download вручную.
Для плат, которые производит Espressif, соответствующую информацию можно найти в руководствах быстрого старта (getting started guide) или руководстве пользователя платы (user guide). Например, чтобы вручную сбросить плату разработчика и перевести микроконтроллер ESP в режим загрузки кода, удерживайте нажатой кнопку Boot (она подтягивает уровень GPIO9 к лог. 0), затем коротко нажмите кнопку сброса EN (она подтягивает уровень CHIP_PU к лог. 0), после чего отпустите кнопку Boot.
Для других типов реализации схемы для активации загрузчика обеспечьте удержание уровня лог. 0 на выводе GPIO9 в момент сброса или в момент включения питания.
[Примеры сообщений ROM-загрузчика]
Сообщение загрузчика, когда память чистая (во flash не записано ни приложения пользователя, ни загрузчика второго уровня OTA). Чип был сброшен от сторожевого таймера: