Si no puedes descargar código a tu ESP32 y recibes el mensaje de error » Wrong boot mode «, entonces este tutorial es para ti.
A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0x13)! The chip needs to be in download mode.
Un ESP32 puede estar básicamente en tres modos diferentes. Puede «ejecutar» un programa, estar en modo «(deep-) sleep» o en modo «download/flash» para ser programado.
Antes de poder descargar código a un ESP32, el chip debe estar en el modo correcto boot mode . Para entrar manualmente en el modo de descarga de firmware o flash, donde puedes programar tu ESP32, normalmente tienes que pulsar los botones BOOT (o GPIO0) y EN (o RESET) en tu placa de desarrollo (más sobre esto más adelante).

Como esto es un poco engorroso, muchas placas soportan un bootloader automático, donde el software de programación (por ejemplo, Arduino IDE , esptool ) controla el modo de arranque a través del chip convertidor USB a serie en la placa de desarrollo.
Sin embargo, el bootloader automático depende de un circuito específico que involucra los pines GPIO0 y ENABLE del ESP32. En algunas placas de desarrollo este circuito es incorrecto o falta, y el bootloader automático no funciona correctamente o no funciona en absoluto. Esto lleva al error: » Wrong boot mode detected (0x13) «, al intentar descargar código al ESP32.
Las dos siguientes secciones describen con más detalle qué está causando el problema de descarga. Pero puedes saltarlas si solo te interesan las posibles soluciones a este problema.
Cómo está cableado y se activa el bootloader automático
Una placa de desarrollo ESP32 normalmente tiene un conector USB, que además de la alimentación tiene dos líneas de datos USB_DN y USB_DP como se muestra en el esquema del ESP32 Devkit-C a continuación:

Las líneas de datos USB_DN y USB_DP están conectadas a un chip convertidor USB a serie/UART (por ejemplo, CP2102N ) que convierte los datos USB en datos serie en las líneas TXD y RXD . Lo más importante es que también genera las señales DTR y DSR , que controlan el flujo de datos. De nuevo, mira el esquema alrededor del CP2102N del ESP32 Devkit-C a continuación:

Las señales de control DTR y DSR se envían a un circuito de «programación» que está conectado a los pines EN(ABLE) y (GP)IO0 del ESP32:

Aquí tienes la tabla de verdad que describe la función de este circuito de «programación»:

Pero para que la programación funcione realmente, el pin EN también debe estar conectado a un circuito RC compuesto por una R esistencia (R11) y un C apacitor (C9), que introduce un retardo de tiempo en la señal EN :

Y aquí es donde está el núcleo del problema. Algunas placas de desarrollo no tienen este circuito RC o tienen valores incorrectos para la resistencia o el condensador. Más sobre esto en la siguiente sección y para aún más detalles lee el ESP32 documentation on boot mode selection .
Por qué no funciona el bootloader automático
Para cambiar un ESP32 a download mode tienes que pasar de un estado donde el pin ENABLE está alto y el pin GPIO0 está bajo, a un estado donde ENABLE está bajo y GPIO0 está bajo. Si quieres conocer todos los detalles técnicos, lee este excelente post: Understanding the automatic boot loader mechanism and truth table .
El cambio al modo de descarga es sensible al tiempo y el Datasheet for the ESP32-WROVER-E board , por ejemplo, dice:
Para asegurar la alimentación al chip ESP32 durante el encendido, se recomienda añadir un circuito de retardo RC en el pin
EN. El valor recomendado para el circuito RC suele ser R = 10 kΩ y C = 1 µF.
Sin embargo, los parámetros específicos deben ajustarse según el tiempo de encendido del módulo y la secuencia de encendido y reinicio del chip. Para el diagrama de tiempos de encendido y reinicio del ESP32, consulta la sección Power Scheme en ESP32 Datasheet .La siguiente imagen muestra el circuito RC (marcado con un rectángulo amarillo) para la placa de desarrollo ESP32-WROVER-E . Ten en cuenta que los valores de R1 y C3 aparecen como TBD (To Be Decided):

En algunas placas de desarrollo este circuito RC falta o los valores de R1 y C3 no son adecuados, y por eso el bootloader automático no funciona. En este caso, recibirás el mensaje de error » Wrong boot mode detected (0x13)! «, al intentar programar el chip. Abajo tienes un ejemplo de mensaje de error usando Arduino IDE al intentar descargar código a una WEMOS Lolin 32D board :

En las siguientes secciones te muestro dos métodos manuales para poner un ESP32 en modo de descarga y dos circuitos de hardware que puedes añadir para que funcione el bootloader automático. Dependerá de la placa de desarrollo concreta qué método funciona.
Soluciones para Wrong boot mode detected
Solución 1: Pulsa BOOT y luego RESET
Para manually switching an ESP32 board into download mode tienes que primero mantener pulsado el botón [BOOT] (o [IO0] ). Luego inicia la descarga, por ejemplo en Arduino IDE pulsando el botón de la flecha. Espera hasta que aparezca el texto » Connecting… «. Finalmente, pulsa y suelta el botón [RESET] (o [EN] ). El diagrama de abajo muestra el tiempo de pulsación:

Este procedimiento, por ejemplo, es necesario para program an ESP32-cam board . Será igual o similar en otras placas de desarrollo que no tienen el circuito RC y no soportan el modo automático.
Desafortunadamente, hay variaciones en esta temporización. Al parecer, hay placas donde tienes que pulsar el botón [BOOT] cuando veas el texto » Connecting… » pero no antes.
Una vez que hayas terminado de flashear tu placa, permanecerá en modo de descarga hasta que pulses [RESET] para que arranque normalmente de nuevo.
Por último, según la placa, los dos botones pueden estar etiquetados como Reset o EN o Enable , y Boot o IO0 o GPIO0 . La siguiente imagen muestra una placa de desarrollo ESP-WROOM-32 con el botón [EN] y el botón [BOOT] :

Pero de nuevo, hay variaciones. Por ejemplo, la WEMOS Lolin 32D board solo tiene un botón [RESET] .
Solución 2: Pulsa el botón RESET
Para placas de desarrollo como la WEMOS Lolin 32 classic , la WEMOS Lolin 32D board o la WEMOS Lolin 32D Pro que solo tienen un botón [RESET] (pero no [BOOT] ), basta con pulsar y soltar el botón [RESET] cuando aparezca el texto » Connecting… «.

Esto pondrá la WEMOS Lolin 32D y las demás placas Lolin en modo de descarga y el programa empezará a ejecutarse una vez finalizada la descarga. Aunque esto es mucho mejor que tener que coordinar el botón [EN] y el botón [BOOT] , sigue sin ser totalmente automático.
Solución 3: Resistencia de 10kΩ entre GPIO0 y GND
Para la WEMOS Lolin 32 classic , la WEMOS Lolin 32D board , la WEMOS Lolin 32D Pro, sus clones y probablemente otras placas, puedes habilitar el bootloader automático con un simple cambio de hardware. Añade una resistencia de 10kΩ entre GPIO0 y GND como se muestra a continuación:

Con este cambio ya no tendrás que pulsar ningún botón al programar la placa desde Arduino IDE. Probé esto con la WEMOS Lolin 32D pero probablemente funcione también con otras placas Lolin y clones. Curiosamente, no es necesario para la WEMOS Lolin 32 lite ni para sus clones.
La desventaja de esta solución es que deja GPIO0 permanentemente a tierra, así que ya no puedes usarlo como IO, y puede que no funcione en algunas placas. Una mejor solución es añadir un condensador entre EN y tierra ( GND ) como se describe en la siguiente sección.
Solución 4: Condensador de 1µF entre RESET/ENABLE y GND
La hoja de datos del ESP32 recomienda un condensador de 1µF para el circuito RC. En algunas placas de desarrollo este condensador falta o tiene una capacidad insuficiente. Añadir un condensador de 1µF entre el pin EN/RESET y tierra soluciona esto y el bootloader automático funcionará.
Probé esto con la WEMOS Lolin 32 classic , la WEMOS Lolin 32D y debería funcionar también para la WEMOS Lolin 32D Pro. Como se mencionó antes, no es necesario para la WEMOS Lolin 32 lite ni sus clones.
Al añadir el condensador, asegúrate de respetar la polaridad correcta. Mira el circuito mostrado abajo.

Si solo necesitas programar la placa unas pocas veces, puedes añadir el condensador temporalmente en una breadboard y luego quitarlo cuando la placa funcione de forma permanente:

Sin embargo, si vas a usar la placa regularmente para desarrollo, puedes soldar el condensador permanentemente entre los pines EN y GND. Las patas de un condensador típico de 1µF son lo suficientemente largas para esto. Mira la foto de abajo:

Finalmente, también tuve una DOIT DEVIT V1 ESP32-WROOM-32 board , donde el bootloader automático tampoco funcionaba. Añadir el condensador de 1µF soldado entre EN y GND también lo solucionó:

Solución 5: Quitar la tarjeta SD del ESP32-CAM
Si tienes una placa ESP32-CAM , descubrí que quitar la tarjeta SD del lector también puede resolver el error Wrong boot mode . Esto puede ocurrir solo si hay un programa en el ESP32-CAM que interactúa con la tarjeta SD.

La razón parece ser que el lector de tarjetas SD normalmente se comunica por SPI, que usa GPIO2. Sin embargo, GPIO2 debe estar en LOW para el arranque correcto en muchas configuraciones de ESP32. Si la tarjeta SD o el lector pone GPIO2 en alto durante el arranque (por ejemplo, por los pull-ups internos de la tarjeta o del módulo SD), el ESP32 puede entrar en un modo de arranque inválido, resultando en el error Wrong boot mode .
Otras razones por las que falla la descarga
Puede haber muchas otras razones por las que tu ordenador no puede descargar código al ESP32. El Troubleshooting Guide for the ESP32 enumera las siguientes cosas que puedes probar:
- Comprueba que estás usando el puerto serie correcto en la línea de comandos.
- Comprueba que tienes permisos para acceder al puerto serie, y que ningún otro software (como modem-manager en Linux) está intentando usarlo. Un error común es dejar un terminal serie abierto en otra ventana y olvidarse de él.
- Comprueba que el chip recibe 3.3V de una fuente de alimentación estable (ver Insufficient Power para más detalles.)
- Comprueba que todos los pines están conectados como se describe en Boot Mode Selection . Comprueba los voltajes en cada pin con un multímetro; los pines «altos» deben estar cerca de 3.3V y los «bajos» cerca de 0V.
- Si has conectado otros dispositivos a los pines GPIO, prueba a quitarlos y ver si esptool empieza a funcionar.
- Prueba a usar una velocidad de baudios más baja (
-b 9600es un valor muy bajo que puedes usar para comprobar si el problema es la velocidad de baudios).
Conclusiones
Este tutorial te ha mostrado cómo poner un ESP32 en modo de descarga, lo que permite programar el ESP32. Dependiendo de la placa de desarrollo, esto puede ser un proceso totalmente automático o requerir algunos cambios de hardware para habilitar el bootloader automático.
Sin el esquema de la placa de desarrollo concreta, no sabrás qué condensador o resistencia necesitas para arreglar el circuito RC. Pero un condensador de 1µF o una resistencia de 10kΩ deberían funcionar en la mayoría de los casos. Si no, prueba con otros valores. Es poco probable que dañes la placa.
Si tienes cualquier pregunta, no dudes en dejarla en los comentarios.
Enlaces
- ESP32 Flashing Problems
- Boot Mode Selection
- Understanding the automatic boot loader mechanism and truth table
- Trouble using the esptool with Lolin D32 Pro and Lolin D32 boards
- ESP32 Troubleshooting Flashing
- ESP32-WROVER-E Datasheet
- ESP32 Technical Documents
- How to flash an ESP32 on production

