Автосброс через DTR и RTS
Чтобы прошить ESP32 или Arduino, не нужно нажимать кнопки: программа прошивки сама сбрасывает микроконтроллер и переводит его в загрузчик. Делает она это линиями DTR и RTS моста USB–UART, а на плате для этого стоит небольшая схема автосброса.
Обновлено Редакция GAW
Автосброс (auto-reset) — схема на плате, через которую программа прошивки сама перезагружает микроконтроллер и переводит его в загрузчик, управляя линиями модема DTR и RTS моста USB–UART. Эти линии доступны программе через виртуальный COM-порт, поэтому кнопки на плате для прошивки не нужны.
ESP32
esptool сбрасывает ESP32, управляя DTR и RTS моста — FTDI, CP210x или CH340 (документация esptool, Automatic Bootloader):
| Вывод ESP32 | Линия моста | Роль |
|---|---|---|
| EN (CHIP_PU) | RTS | сброс чипа |
| GPIO0 | DTR | выбор режима загрузки — вывод обвязки |
DTR и RTS активны низким уровнем. На отладочных платах Espressif между мостом и ESP32 стоят два транзистора: если программа выставит обе линии одновременно, чип не сбросится. С такой схемой обязателен конденсатор 1–10 мкФ между EN и землёй — без него, по Espressif, автосброс ненадёжен, особенно в Windows. Последовательность прошивки и режимы загрузки разобраны в статье «Прошивка ESP32», сама программа — на странице esptool.
Arduino
На платах Arduino с AVR принцип тот же — сброс в загрузчик линией модема. AVRDUDE описывает это для плат Wiring вроде Arduino Mega 2560 Rev3 — «простое переключение DTR/RTS» переводит плату в режим программирования, — а для Arduino Uno Rev3 и любых AVR с загрузчиком Optiboot у него есть отдельный программатор arduino (руководство AVRDUDE 8.3).
Мосты с особыми режимами DTR
У CH340X вывод 6 по умолчанию — TNOW, но резистор 4,7 кОм превращает его в DTR#: резистор на землю включает режим, который WCH называет «open source», — вывод либо выдаёт высокий уровень, либо отключается, а низкий уровень по умолчанию держит сам внешний резистор; резистор между выводами 6 и 5 включает двухтактный DTR# с высоким уровнем по умолчанию. У CH340C так можно только с выводом 8 (по умолчанию — выход модема OUT#) и только в партиях, номер которых начинается с 4, а последние три знака больше B40: резистор на землю делает его вторым DTR# в том же режиме «open source». WCH предназначает это для загрузки многорежимных микроконтроллеров (CH340 V3C, разд. 5.3).
Не путать
С аппаратным управлением потоком RTS/CTS: там те же линии используются для паузы передачи. Если RTS соединён с EN напрямую, управление потоком в терминале надо выключить, иначе он будет держать ESP32 в сбросе (esptool).
Частые вопросы
Почему ESP32 не входит в режим прошивки автоматически?
Возможные причины по документации esptool: на плате нет схемы автосброса или линии DTR и RTS не подведены к GPIO0 и EN; линии подключены иначе; у моста их вообще нет; или нет конденсатора на EN — Espressif рекомендует 1–10 мкФ между EN и землёй, без него сброс ненадёжен, особенно в Windows. Временный выход — держать кнопку Boot (GPIO0) во время запуска esptool.
Зачем в схеме автосброса два транзистора?
Некоторые программы при открытии порта выставляют DTR и RTS одновременно. Если бы RTS был соединён с EN напрямую, такая программа держала бы ESP32 в сбросе. Схема на двух транзисторах устроена так, что одновременная активность обеих линий чип не сбрасывает (esptool, Automatic Bootloader).
Почему ESP32 перезагружается при открытии монитора порта в Linux?
Linux по умолчанию выставляет RTS при открытии последовательного порта, а RTS через схему автосброса связан с EN. Espressif советует отключить это командой stty с флагом -hupcl для нужного порта (esptool, Automatic Bootloader).
Источники
- Espressif. esptool documentation (ESP32), Advanced Topics: Boot Mode Selection — Automatic Bootloader — esptool сбрасывает ESP32, управляя линиями DTR и RTS моста USB–UART (FTDI, CP210x, CH340x), подключёнными к GPIO0 и EN (CHIP_PU); DTR и RTS активны низким уровнем; пример — схема DevKitC с двумя транзисторами: одновременная активность DTR и RTS не сбрасывает чип; с такой схемой нужен конденсатор между EN и землёй 1–10 мкФ; соединения EN — RTS, GPIO0 — DTR; Linux по умолчанию выставляет RTS при открытии порта (отключается -hupcl); без DTR и RTS автосброс невозможен — кнопки Boot и EN
- AVRDUDE 8.3 manual page (src/avrdude.1) — платы Wiring (например, Arduino Mega 2560 Rev3) переводят в режим программирования простым переключением DTR/RTS; программатор arduino — для Arduino Uno Rev3 и любого AVR с загрузчиком Optiboot
- WCH. CH340 Datasheet, Version 3C — разд. 5.3: у CH340X вывод 6 (TNOW) резистором 4,7 кОм на землю переводят в DTR# в режиме «open source» (выдаёт высокий уровень или отключается, низкий держит внешний резистор), резистором к выводу 5 — в двухтактный DTR#; у CH340C из партий, номер которых начинается с 4, а последние три знака больше B40, вывод 8 (OUT#) резистором на землю становится вторым DTR# в режиме «open source»
Нашли ошибку?
Смотрите также
- Прошивка ESP32Загрузчик ПЗУ, GPIO0 и автосброс, write-flash и адреса, ошибки esptool и питание
- esptoolПрошивка ESP32 и ESP8266: команды, адреса загрузчика, режим загрузки, ошибки
- Виртуальный COM-порт (VCP)Драйвер, показывающий USB-устройство как последовательный порт
- Вывод обвязки загрузкиGPIO, уровень которого при сбросе задаёт режим загрузки
- Загрузчик (bootloader)Прошивка МК без программатора через UART или USB
- Терминал COM-портаWeb Serial: текст и HEX, отправка с \r\n, DTR и RTS, журнал