Почему после прошивки пропал COM-порт ESP32-C3 и как его вернуть?
Обновлено Редакция GAW
Речь о платах, где разъём USB подключён прямо к выводам GPIO18 и GPIO19 чипа: там COM-порт создаёт сам ESP32-C3, его контроллер USB Serial/JTAG. На платах с мостом USB–UART, как ESP32-C3-DevKitM-1 с CP2102N, порт принадлежит мосту и так не пропадает. Поэтому порт существует, только пока работает программа, которая не мешает этому контроллеру. Если она мешает, компьютер просто перестаёт видеть устройство, и привычная автоматическая прошивка не начинается.
Почему порт пропадает
| Что сделала программа | Что видит компьютер (по ESP-IDF) |
|---|---|
Использует GPIO18 или GPIO19 как обычные выводы — в том числе через Serial1.begin() без указания выводов: в arduino-esp32 3.3.12 по умолчанию у ESP32-C3 RX1 — GPIO18, TX1 — GPIO19 | устройство исчезает |
| Выключила контроллер USB Serial/JTAG | устройство исчезает |
| Уходит в глубокий сон | устройство отключается и снова появляется после пробуждения |
| Уходит в лёгкий сон | порт может «зависнуть», иногда помогает только переподключить кабель |
Как вернуть
- Войти в режим загрузки. По ESP-IDF нужно притянуть GPIO9 к земле и сбросить чип. На большинстве плат это кнопки: удерживать Boot, нажать и отпустить Reset, затем отпустить Boot. Выводы, которые читаются при сбросе, разобраны на странице «Выводы обвязки загрузки ESP32».
- Найти порт снова. В режиме загрузки чип не выполняет программу, и порт USB Serial/JTAG появляется; в Windows это новый COM-порт.
- Залить исправленную прошивку: без кода, который занимает GPIO18 и GPIO19, или с паузой перед уходом в сон.
Наш совет для программ со сном: в начале setup() поставьте паузу на несколько секунд — за это время успеет начаться прошивка, даже если дальше чип засыпает. Как правильно организовать сон — в статье «Глубокий сон ESP32», выводы чипа и их ограничения — на странице ESP32-C3.
Похожие вопросы
Почему порт то появляется, то исчезает?
Так ведёт себя программа с циклом сна: по ESP-IDF в глубоком сне контроллер USB и его PHY обесточены, и компьютер видит отключение, а после пробуждения устройство подключается снова. Для отладки на время отключите сон или выводите журнал через UART0.
Плата не входит в режим загрузки кнопкой. Что ещё проверить?
По даташиту для режима загрузки при сбросе нужны GPIO9 = 0 и GPIO8 = 1. Если к GPIO8 подключён датчик или светодиод, который тянет его вниз, или кнопку отпустили раньше сброса, чип запустит старую программу. Держите Boot нажатой, пока отпускаете Reset, и проверьте, что ничего не тянет GPIO8 к земле.
Можно ли использовать GPIO18 и GPIO19 и не терять прошивку через USB?
Нет: пока выводы работают как обычные GPIO, контроллер USB Serial/JTAG от них отключён. Прошивать тогда придётся через режим загрузки по GPIO9 или через UART0 на GPIO20 и GPIO21 с отдельным переходником USB–UART.
Источники
- Espressif. ESP-IDF v6.1 Programming Guide (ESP32-C3): USB Serial/JTAG Controller Console — Limitations: если приложение переназначило выводы USB или отключило контроллер, устройство исчезает из системы, и после исправления нужно вручную войти в режим загрузки — GPIO9 к земле и сброс; в Deep-sleep устройство исчезает; Sleep Mode Considerations: в Deep-sleep контроллер и PHY обесточены, D+ не подтянута, после пробуждения устройство подключается снова; в Light-sleep хост может считать устройство отключённым и не переподключить его без переподключения кабеля; при автоматическом сне опция CONFIG_USJ_NO_AUTO_LS_ON_CONNECTION; порт — COM* в Windows, /dev/ttyACM* в Linux; контроллер сам переводит чип в режим загрузки при прошивке
- Espressif. ESP32-C3 Series Datasheet v2.4 — табл. 3-3 Chip Boot Mode Control: GPIO9 = 0 при сбросе — режим загрузки (Joint Download Boot через USB Serial/JTAG или UART0), GPIO8 должен быть 1; USB_D− — GPIO18, USB_D+ — GPIO19
- Espressif. arduino-esp32 3.3.12: cores/esp32/HardwareSerial.h (GitHub, LGPL-2.1) — выводы Serial1 по умолчанию для CONFIG_IDF_TARGET_ESP32C3: RX1 — GPIO18, TX1 — GPIO19
Нашли ошибку?
Смотрите также
- USB Serial/JTAGВстроенный в ESP32 контроллер USB: COM-порт и JTAG без внешних микросхем
- Strapping-выводы ESP32Какие GPIO читаются при сбросе: загрузка, напряжение флеш-памяти, JTAG — для ESP32, S2, S3, C2, C3, C5, C6, H2, P4
- Глубокий сон ESP32Режимы сна, токи, пробуждение по таймеру и выводам, RTC-память, расчёт батареи
- ESP32-C3: выводы и GPIO22 GPIO: функции, свободные и занятые выводы, флеш-память, strapping, USB, JTAG, токи