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

Автосброс через 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сброс чипа
GPIO0DTRвыбор режима загрузки — вывод обвязки

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).

Источники

  1. 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
  2. AVRDUDE 8.3 manual page (src/avrdude.1) — платы Wiring (например, Arduino Mega 2560 Rev3) переводят в режим программирования простым переключением DTR/RTS; программатор arduino — для Arduino Uno Rev3 и любого AVR с загрузчиком Optiboot
  3. 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»

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