Fix ESP32 “invalid header: 0xffffffff” boot loop
The flash is empty or erased where the bootloader should be. Re-upload, or flash the bootloader, partitions and app together.
Community draft — report a mistake
What you see
ets Jul 29 2019 12:21:46
rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
invalid header: 0xffffffff
invalid header: 0xffffffff
invalid header: 0xffffffffets Jul 29 2019 12:21:46 rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) invalid header: 0xffffffff invalid header: 0xffffffff invalid header: 0xffffffff
The board is fine — there is just no valid firmware where the ESP32 expects to find it. Uploading a complete image (bootloader + partitions + app) fixes it.
Quick fix — try in order
- 1
Upload any sketch from Arduino IDE
The IDE writes the bootloader, partition table and app together, which fixes an erased chip.
- 2
If you flashed only an app .bin, flash all parts
A raw app image must go to 0x10000 with the bootloader at 0x1000 and partitions at 0x8000. Our browser flasher writes all parts at the right offsets.
- 3
Check the flash mode
Try DIO if the chip was flashed with QIO and does not boot.
Why it happens
What is 0xffffffff?
Erased flash reads as all 1s (0xFF bytes). The ROM expected a bootloader header at the start of flash and found blank flash instead.
Flashed to the wrong address
Writing an app binary at 0x0 instead of 0x10000 overwrites the bootloader area with something the ROM cannot parse.
A full erase without a re-flash
After “Erase all flash” the chip has no firmware until you upload again.
Board-specific notes
ESP32-C3 / S3: On these chips the bootloader lives at 0x0, not 0x1000. Use the offsets your build reports.
Did this fix it?
Thanks — that helps us keep this page right.