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

Strapping-выводы ESP32, S3, C3, C6 и других: какие GPIO влияют на загрузку

Несколько GPIO каждого чипа ESP32 при сбросе работают как перемычки настройки: по их уровням выбирается запуск программы или режим загрузки прошивки, напряжение питания флеш-памяти, вывод сообщений загрузчика. Здесь — эти выводы для всех чипов Espressif по их даташитам: уровни по умолчанию, режимы и чего не подключать к ним при проектировании платы.

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

Strapping-выводы (выводы обвязки, «бутстрап») — GPIO, уровень которых чип считывает в момент сброса и запоминает до выключения питания. По ним выбирается режим загрузки — запуск программы из флеш-памяти или ожидание прошивки по UART или USB, — а у некоторых чипов ещё и напряжение флеш-памяти, вывод сообщений загрузчика и источник сигналов JTAG. После сброса эти выводы работают как обычные GPIO.

Коротко

  • Когда читаются: при включении питания, по сигналу CHIP_PU (CHIP_EN) и при аппаратном сбросе; значения хранятся в защёлках до выключения питания.
  • Уровень по умолчанию задают внутренние слабые подтяжки, если вывод никуда не подключён или подключён к высокоомной цепи.
  • Время удержания: после того как CHIP_PU (CHIP_EN) стал единицей, уровни должны держаться не меньше 1 мс у ESP32 и 3 мс у S2, S3, C2, C3, C5, C6, H2 и P4.
  • Главное правило: внешняя схема — кнопка, светодиод, подтяжка шины, выход датчика — не должна перебивать нужный уровень во время сброса.

Выводы обвязки по чипам

В таблице — выводы, которые выбирают режим загрузки, и их состояние по умолчанию по таблицам 3-1 и 3-3 даташитов (у ESP32-C2 — таблицы 10 и 12 даташита ESP8684). «Свободен» значит, что внутренней подтяжки нет и уровень задаёт внешняя схема.

ЧипВыводы обвязкиПо умолчаниюЗапуск программыЗагрузка прошивки
ESP32GPIO0, GPIO2, GPIO5, GPIO12 (MTDI), GPIO15 (MTDO)GPIO0, GPIO5, GPIO15 — подтяжка вверх; GPIO2, GPIO12 — внизGPIO0 = 1GPIO0 = 0, GPIO2 = 0
ESP32-S2GPIO0, GPIO45, GPIO46GPIO0 — вверх; GPIO45, GPIO46 — внизGPIO0 = 1GPIO0 = 0, GPIO46 = 0
ESP32-S3GPIO0, GPIO3, GPIO45, GPIO46GPIO0 — вверх; GPIO45, GPIO46 — вниз; GPIO3 свободенGPIO0 = 1GPIO0 = 0, GPIO46 = 0
ESP32-C2GPIO8, GPIO9GPIO9 — вверх; GPIO8 свободенGPIO9 = 1GPIO9 = 0, GPIO8 = 1
ESP32-C3GPIO2, GPIO8, GPIO9GPIO9 — вверх; GPIO2, GPIO8 свободныGPIO9 = 1GPIO9 = 0, GPIO8 = 1
ESP32-C5GPIO7, GPIO25–GPIO28, MTMS, MTDIGPIO27, GPIO28 — вверх; остальные свободныGPIO28 = 1GPIO28 = 0, GPIO27 = 1
ESP32-C6GPIO8, GPIO9, GPIO15, MTMS, MTDIGPIO9 — вверх; остальные свободныGPIO9 = 1GPIO9 = 0, GPIO8 = 1
ESP32-H2GPIO8, GPIO9, GPIO25GPIO9 — вверх; GPIO8, GPIO25 свободныGPIO9 = 1GPIO9 = 0, GPIO8 = 1
ESP32-P4GPIO34–GPIO38GPIO35 — вверх; остальные свободныGPIO35 = 1GPIO35 = 0, GPIO36 = 1

Уровни по умолчанию подобраны так, что чип без внешней обвязки запускает программу из флеш-памяти. У ESP32-C3 вывод GPIO2 режим загрузки не выбирает, но даташит советует подтянуть его вверх из-за возможных помех. У ESP32-C5 есть второй режим загрузки прошивки — все три вывода GPIO26, GPIO27 и GPIO28 в нуле: тогда прошивка принимается по UART или SDIO.

Режим загрузки прошивки (Joint Download Boot) принимает прошивку по UART0 у всех чипов, по USB — у чипов с контроллером USB Serial/JTAG или USB OTG (S2, S3, C3, C5, C6, H2, P4), а у ESP32, C5 и C6 — ещё по SDIO. Прошивку можно записать во флеш-память или загрузить в ОЗУ и сразу выполнить (даташиты, разд. 3.1).

ESP32: GPIO12 и напряжение флеш-памяти

У классического ESP32 вывод GPIO12 (MTDI) при сбросе выбирает, откуда питается вывод VDD_SDIO, а от него — флеш-память и PSRAM:

  • MTDI = 0 (по умолчанию, внутренняя подтяжка вниз) — VDD_SDIO подключён к VDD3P3_RTC, обычно 3,3 В;
  • MTDI = 1 — VDD_SDIO питается от внутреннего стабилизатора на 1,8 В.

Напряжение VDD_SDIO должно совпадать с напряжением флеш-памяти (даташит ESP32, табл. 1-1 и разд. 2.5). Поэтому если на плате флеш-память рассчитана на 3,3 В, а GPIO12 при сбросе оказывается в единице (внешняя подтяжка, выход датчика, шина), флеш-память получает 1,8 В — и ESP32 может перестать запускаться после того, как к GPIO12 что-то подключили.

Выбор можно закрепить eFuse-битами: если прожечь EFUSE_SDIO_FORCE = 1, напряжение задаёт EFUSE_SDIO_TIEH (0 — 1,8 В, 1 — 3,3 В), а уровень MTDI больше не учитывается (разд. 3.2). Прожиг необратим: eFuse-бит нельзя вернуть в ноль.

Остальные выводы обвязки ESP32: GPIO15 (MTDO) в нуле при сбросе отключает вывод сообщений загрузчика в U0TXD, а вместе с GPIO5 задаёт фронты выборки и выдачи данных в режиме ведомого SDIO (табл. 3-4 и 3-5). Кроме того, у ESP32 выводы GPIO6–GPIO11 обычно заняты флеш-памятью, а GPIO34–GPIO39 работают только на вход, без подтяжек (табл. 2-1).

Другие функции выводов обвязки

ЧипНапряжение флеш-памятиСообщения загрузчикаИсточник JTAGФронты SDIO
ESP32GPIO12 (MTDI)GPIO15 (MTDO)только eFuseGPIO15 и GPIO5
ESP32-S2GPIO45GPIO46——
ESP32-S3GPIO45GPIO46GPIO3—
ESP32-C2—GPIO8——
ESP32-C3—GPIO8——
ESP32-C5—GPIO27GPIO7GPIO25 и MTDI
ESP32-C6—GPIO8GPIO15MTMS и MTDI
ESP32-H2—GPIO8GPIO25—
ESP32-P4eFuse (3,3 В или 1,8 В)GPIO36GPIO34—

У ESP32-S2 и S3 вывод GPIO45 выбирает напряжение VDD_SPI так же, как GPIO12 у ESP32: ноль — 3,3 В, единица — 1,8 В от стабилизатора флеш-памяти, если не прожжён EFUSE_VDD_SPI_FORCE. Вывод сообщений загрузчика у большинства чипов зависит от сочетания вывода и eFuse-поля EFUSE_UART_PRINT_CONTROL: пока поле не прожжено, сообщения выводятся при любом уровне. Выводы выбора JTAG учитываются только при определённых eFuse-битах; у ESP32-S3 даташит отдельно предупреждает, что у GPIO3 нет внутренней подтяжки и его уровень должна задавать внешняя схема.

ESP8266

У ESP8266 загрузку выбирают GPIO0, GPIO2 и GPIO15 (MTDO) (даташит ESP8266EX, табл. 2-1). Схема платы NodeMCU указывает уровни: при каждом включении, сбросе и пробуждении GPIO15 должен быть в нуле, GPIO2 — в единице, а GPIO0 в единице запускает программу, в нуле — режим загрузки прошивки. Как это разведено на платах, показано на страницах NodeMCU и WeMos D1 mini.

Как не мешать загрузке

  1. Не подключайте к выводам обвязки то, что меняет их уровень при сбросе: подтяжки шин I²C и 1-Wire, кнопки на землю или питание, входы с собственной подтяжкой, выходы других микросхем, которые включаются раньше ESP32.
  2. Если вывод всё же нужен, используйте его как выход, нагрузка которого во время сброса не меняет уровень, а при необходимости поставьте внешний резистор в ту же сторону, что и подтяжка по умолчанию.
  3. Учитывайте время: уровень должен держаться не меньше 1 мс (ESP32) или 3 мс (остальные чипы) после того, как CHIP_PU или CHIP_EN перешёл в единицу.
  4. Для своей платы выведите кнопку BOOT на вывод выбора режима (GPIO0, GPIO9, GPIO28 или GPIO35 — в зависимости от чипа) и кнопку сброса на CHIP_PU или CHIP_EN — так прошивку всегда можно будет записать заново.

Распиновка платы ESP32-DevKitC с отмеченными выводами обвязки — на странице ESP32-DevKitC; обзор чипов Espressif — в разделе ESP32.

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

Почему ESP32 не запускается, если к GPIO12 что-то подключено?

GPIO12 (MTDI) при сбросе выбирает напряжение питания флеш-памяти VDD_SDIO: при нуле — 3,3 В от VDD3P3_RTC, при единице — 1,8 В от внутреннего стабилизатора. Внутри он подтянут к нулю. Если внешняя схема при включении выставляет на нём единицу, а флеш-память модуля рассчитана на 3,3 В, она получает 1,8 В. Решения два: не держать GPIO12 в единице во время сброса или прожечь eFuse-биты EFUSE_SDIO_FORCE = 1 и EFUSE_SDIO_TIEH = 1 — тогда VDD_SDIO всегда 3,3 В и уровень GPIO12 больше не важен (ESP32 Series Datasheet, разд. 3.2).

Как перевести ESP32 в режим загрузки прошивки?

У ESP32, S2 и S3 при сбросе должен быть низкий уровень на GPIO0, у ESP32 — ещё и на GPIO2, у S2 и S3 — на GPIO46. У ESP32-C2, C3, C6 и H2 низкий уровень подают на GPIO9, а GPIO8 держат в единице; у ESP32-C5 — ноль на GPIO28 и единица на GPIO27, у ESP32-P4 — ноль на GPIO35 и единица на GPIO36. Платы разработчика делают это сами: кнопка BOOT и схема автозагрузки на линиях DTR и RTS моста USB-UART.

Какие GPIO ESP32 лучше не занимать?

У классического ESP32 — пять выводов обвязки (GPIO0, GPIO2, GPIO5, GPIO12, GPIO15): их можно использовать, но внешняя схема не должна менять их уровень при сбросе. GPIO6–GPIO11 заняты флеш-памятью модуля, а GPIO34–GPIO39 работают только на вход и не имеют внутренних подтяжек. Остальные GPIO свободны.

Можно ли использовать strapping-выводы после загрузки?

Да. Уровни защёлкиваются при сбросе и хранятся до выключения питания, а сами выводы после этого работают как обычные GPIO (ESP32 Series Datasheet, разд. 3). Важно только, что на них во время сброса: внешняя цепь должна оставлять уровень по умолчанию или выставлять нужный — и держать его не меньше 1 мс у ESP32 и 3 мс у остальных чипов после включения сигнала CHIP_PU (CHIP_EN).

Источники

  1. Espressif. ESP32 Series Datasheet, v5.3 — разд. 3 — табл. 3-1 (уровни по умолчанию), 3-2 (время установки и удержания), 3-3 (режим загрузки), 3.2 (MTDI и напряжение VDD_SDIO), 3-4 и 3-5 (MTDO и GPIO5); табл. 1-1 и разд. 2.5 — питание флеш-памяти; табл. 2-1 — выводы GPIO34–39 только на вход
  2. Espressif. ESP32-WROOM-32E & ESP32-WROOM-32UE Datasheet, v2.1 — разд. 4 — те же выводы обвязки на уровне модуля
  3. Espressif. ESP32-S2 Series Datasheet, v1.9 — разд. 3 — табл. 3-1…3-5
  4. Espressif. ESP32-S3 Series Datasheet, v2.2 — разд. 3 — табл. 3-1…3-5, в том числе GPIO3 и источник сигналов JTAG
  5. Espressif. ESP8684 Series Datasheet (группа ESP32-C2), v2.3 — разд. 3 — табл. 10–13
  6. Espressif. ESP32-C3 Series Datasheet, v2.4 — разд. 3 — табл. 3-1…3-5
  7. Espressif. ESP32-C5 Series Datasheet, v1.5 — разд. 3 — табл. 3-1 и 3-3, два режима загрузки
  8. Espressif. ESP32-C6 Series Datasheet, v1.5 — разд. 3 — табл. 3-1, 3-3, 3-4
  9. Espressif. ESP32-H2 Series Datasheet, v1.3 — разд. 3 — табл. 3-1 и 3-3
  10. Espressif. ESP32-P4 Series Datasheet, Pre-release v0.7 — разд. 3 — табл. 3-1, 3-3, 3-4; документ предварительный
  11. NodeMCU. nodemcu-devkit-v1.0: схема платы — примечание на схеме: уровни GPIO0, GPIO2 и GPIO15 при включении, сбросе и пробуждении ESP8266

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