Fix “esptool.py can not exit the download mode over USB” (ESP32-S3/C3)
The upload worked, but the native-USB board stays in the bootloader. Press RESET once — and set things up so you don't have to every time.
Community draft — report a mistake
What you see
Wrote 289712 bytes (160123 compressed) at 0x00010000 in 2.5 seconds (effective 925.4 kbit/s)...
Hash of data verified.
Leaving...
WARNING: ESP32-S3 (revision v0.2) chip was placed into download mode using GPIO0.
esptool.py can not exit the download mode over USB. To run the app, reset the chip manually.
To suppress this note, set --after option to 'no_reset'.Wrote 289712 bytes (160123 compressed) at 0x00010000 in 2.5 seconds (effective 925.4 kbit/s)... Hash of data verified. Leaving... WARNING: ESP32-S3 (revision v0.2) chip was placed into download mode using GPIO0. esptool.py can not exit the download mode over USB. To run the app, reset the chip manually. To suppress this note, set --after option to 'no_reset'.
On boards that use the chip’s own USB port, esptool cannot pull the reset and boot lines the way a CH340 or CP2102 does. When the chip was put into download mode with the BOOT button, it stays in the bootloader after flashing until something resets it.
This is a note, not a failure. Press RESET and your sketch runs. To skip the extra press, upload without holding BOOT whenever the board allows it.
Quick fix — try in order
- 1
Press RESET once
Your sketch is on the board. Pressing RESET (RST/EN) leaves download mode and runs it. Re-select the COM port afterwards — it may change number.
- 2
Next time, don't hold BOOT unless you have to
If the board uploads without holding BOOT, the USB-Serial/JTAG peripheral can reset the chip into the app automatically. Holding BOOT is what forces the manual reset.
- 3
Use Hardware CDC and JTAG mode
Tools → USB Mode → Hardware CDC and JTAG, USB CDC On Boot → Enabled. Then the IDE can reset the board itself on most uploads.
- 4
Keep GPIO0 (S3) or GPIO9 (C3) free
If a button, LED or module holds the boot pin low, every reset lands in download mode again.
Why it happens
Why can't esptool reset it?
On UART boards esptool toggles DTR/RTS wired to EN and GPIO0. Native USB has no such wires; when the chip was put into download mode with the BOOT button, only a real reset gets it out.
Is the upload broken?
No — “Hash of data verified” above the warning means the flash write succeeded.
Board-specific notes
ESP32-S2 (LOLIN S2 Mini): The S2 always needs a manual RST after uploading through its native USB.
XIAO ESP32C3: The RESET button is the tiny one marked R next to the USB-C socket.
Did this fix it?
Thanks — that helps us keep this page right.