Invalid image block, can't boot.
The ESP32-S3 ROM bootloader fails to boot and continuously resets when the software bootloader is missing, corrupted, or flashed to an incorrect offset such as 0x1000.
When an ESP32-S3 microcontroller is powered on or reset, its internal hardware ROM bootloader searches the external SPI flash memory for a valid software bootloader header. For this specific chip architecture, the ROM enforces a strict requirement that the software bootloader reside exactly at flash memory offset 0x0. If the bootloader magic bytes and headers are missing, corrupted, or replaced by arbitrary data at that address, the ROM bootloader cannot proceed. Consequently, it emits a fatal invalid-header warning over the UART serial console and triggers a watchdog or software reset, resulting in an endless cycle of restarts characterized by the `Invalid image block, can't boot.` signature.
The most frequent trigger for this boot failure is manually flashing the software bootloader to the wrong memory address using `esptool.py`. Users migrating from the older ESP32 architecture often reuse legacy flashing scripts that write the bootloader to offset 0x1000. Because the ESP32-S3 requires the bootloader at 0x0, writing it to 0x1000 leaves the critical 0x0 address empty, causing the ROM bootloader to fail. Other common causes include omitting the bootloader partition during manual flashing, experiencing physical hardware faults with the SPI flash chip connections or power supply, or having mismatched flash encryption configurations. For instance, flashing a plaintext bootloader image onto an ESP32-S3 that has eFuse flash encryption enabled will result in the ROM bootloader reading unintelligible ciphertexts during early boot.
idf.py set-target esp32s3 idf.py build # Deliberately flash to 0x1000 (correct for ESP32, fatal for ESP32-S3) esptool.py --chip esp32s3 write_flash 0x1000 build/bootloader/bootloader.bin
Flash the software bootloader to offset 0x0 for the ESP32-S3, or rely on idf.py to automatically deduce the correct offsets. ```Bash idf.py set-target esp32s3 idf.py build # Correct manual esptool command for ESP32-S3 esptool.py --chip esp32s3 write_flash 0x0 build/bootloader/bootloader.bin # Or automatically handle offsets via the ESP-IDF build system idf.py flash ```
ESP32-S3 keep rebooting invalid image block, can't boot. (IDFGH-11109) #12281