ESP32 Manual Boot Mode
Learn how to manually enter bootloader mode on ESP32 boards using the BOOT button when automatic upload fails. Step-by-step guidance for resolving "Failed to connect" errors, especially on ESP32-CAM and custom boards without auto-reset circuitry.
Common Causes
- ⏱️
Auto-Boot Failure During Upload
Some ESP32 boards fail to automatically enter bootloader mode due to missing DTR/RTS circuitry or timing mismatches during upload.
- 🧰
Board Design Lacks Auto-Reset Circuit
Minimal ESP32 modules or custom designs may omit the auto-reset transistor pair that triggers boot mode during code upload.
Symptoms
Upload Fails with Timeout
IDE outputs errors like
Failed to connect to ESP32: Timed out waiting for packet header
especially at the start of the upload process.
Upload fails with "Failed to Connect"
IDE outputs errors like
A fatal error occurred: Failed to connect to ESP32: No serial data received
especially at the start of the upload process.
Upload Succeeds Only with Manual Button Press
Upload only works when the BOOT button is held down and released at a precise moment.
Solutions
Manually Enter Boot Mode Using BOOT Button
Hold down the BOOT button on your ESP32 board, click the upload button in your IDE, and release BOOT when you see
Connecting…
in the console output.
Use a Known-Good USB Cable and Power Source
Ensure that poor connections or low voltage are not interfering with reset or bootloader detection during upload. Check more details.
Modify Hardware to Support Auto-Boot (Optional)
Add a transistor circuit between DTR/RTS and EN/IO0 to mimic the auto-reset functionality on boards that lack it. Check more at Randomnerdtutorials.
More Details
ESP32 Manual Boot Mode #
If you're getting “Failed to connect” errors while uploading code to your ESP32 — especially with minimal or clone boards — you might need to manually put the board into bootloader mode.
This involves pressing the BOOT button at just the right time so the ESP32 is ready to receive firmware via USB.
Why You Might Need to Do This #
Most ESP32 dev boards include auto-reset circuitry that toggles the EN and IO0 pins automatically during upload. But some:
- Don’t have this circuit at all (common in ESP32-CAM, DIY boards)
- Use clone USB-to-serial chips that don’t drive DTR/RTS properly
- Have timing quirks that make auto-reset unreliable
In these cases, you’ll need to manually trigger boot mode using the BOOT button.
When You See This Problem #
You try to upload a sketch and get this in the IDE:
Connecting...
Failed to connect to ESP32: Timed out waiting for packet header
or
A fatal error occurred: Failed to connect to ESP32: No serial data received
And the board doesn’t react — no LED blink, no reset flicker.
How to Manually Enter Boot Mode #
Follow these steps:
- Hold the BOOT button on your ESP32
- Click Upload in your IDE (Arduino IDE or PlatformIO)
- Wait until you see
Connecting...
in the output - Release the BOOT button when you see the upload begin
Timing matters — release the BOOT button only after upload starts (but not too early).
If you're using PlatformIO or esptool, the timing window may be longer, but the process is the same.
Board-Specific Notes #
- ESP32-CAM often requires this due to missing reset circuitry
- ESP32-WROOM-32 modules on custom PCBs typically need manual boot
- Some boards add a separate EN (reset) button — don’t press it unless instructed
Optional: Modify Hardware to Auto-Boot #
If you're using a board regularly that requires manual boot:
- You can add a capacitor and transistor circuit to connect the USB-to-serial DTR/RTS lines to the EN and IO0 pins
- Or use an FTDI module that supports auto-reset, wired appropriately
Helpful Tip #
If you see no feedback during upload, double-check your USB cable too.
→ See: ESP32 Wrong USB Cable

Quick Navigation
Additional Resources
Still Stuck with an ESP32 Issue? Let's solve it together.
Our interactive troubleshooting wizard will guide you through common ESP32 problems and their solutions, step by step.