Se non riesci a caricare il codice sul tuo ESP32 e ricevi il messaggio di errore ” Modalità di avvio errata “, allora questo tutorial fa per te.
A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0x13)! The chip needs to be in download mode.
Un ESP32 può trovarsi essenzialmente in tre modalità diverse. Può “eseguire” un programma, può essere in modalità “(deep-) sleep”, oppure può essere in modalità “download/flash” per essere programmato.
Prima di poter caricare il codice su un ESP32, il chip deve essere nella corretta boot mode . Per entrare manualmente nella modalità di download firmware o flash, dove puoi programmare il tuo ESP32, di solito devi premere i pulsanti BOOT (o GPIO0) e EN (o RESET) sulla tua scheda di sviluppo (ne parleremo meglio più avanti).

Poiché questa procedura è scomoda, molte schede supportano un bootloader automatico, dove il software di programmazione (ad esempio Arduino IDE , esptool ) controlla la modalità di avvio tramite il chip convertitore USB-seriale presente sulla scheda di sviluppo.
Tuttavia, il bootloader automatico si basa su un circuito specifico che coinvolge i pin GPIO0 e ENABLE dell’ESP32. Su alcune schede di sviluppo questo circuito è errato o mancante e il bootloader automatico non funziona correttamente o per niente. Questo porta all’errore: ” Wrong boot mode detected (0x13) “, quando si tenta di caricare il codice sull’ESP32.
Le prossime due sezioni descrivono più in dettaglio cosa causa il problema di caricamento. Ma puoi saltarle se ti interessano solo le possibili soluzioni a questo problema.
Come è collegato e attivato il bootloader automatico
Una scheda di sviluppo ESP32 di solito ha un connettore USB che, oltre all’alimentazione, ha due linee dati USB_DN e USB_DP come mostrato nello schema della ESP32 Devkit-C qui sotto:

Le linee dati USB_DN e USB_DP sono collegate a un chip convertitore USB-seriale/UART (ad esempio CP2102N ) che converte i dati USB in dati seriali sulle linee TXD e RXD . Ancora più importante, genera anche i segnali DTR e DSR , che controllano il flusso dei dati. Consulta di nuovo lo schema attorno al CP2102N della ESP32 Devkit-C qui sotto:

I segnali di controllo DTR e DSR vengono poi inviati a un circuito di “programmazione” collegato ai pin EN(ABLE) e (GP)IO0 dell’ESP32:

Ecco la tabella della verità che descrive la funzione di questo circuito di “programmazione”:

Ma per far funzionare effettivamente la programmazione, il pin EN deve anche essere collegato a un circuito RC composto da una R esistenza (R11) e un C ondensatore (C9), che introduce un ritardo temporale sul segnale EN :

Ed è proprio qui che si trova il cuore del problema. Alcune schede di sviluppo non hanno questo circuito RC oppure hanno valori errati per la resistenza o il condensatore. Maggiori dettagli nella prossima sezione e per ulteriori approfondimenti leggi il ESP32 documentation on boot mode selection .
Perché il bootloader automatico non funziona
Per mettere un ESP32 in modalità download mode devi passare da uno stato in cui il pin ENABLE è alto e il pin GPIO0 è basso, a uno stato in cui ENABLE è basso e GPIO0 è basso. Se vuoi conoscere tutti i dettagli tecnici, leggi questo ottimo post: Understanding the automatic boot loader mechanism and truth table .
Il passaggio alla modalità download è sensibile al tempo e, ad esempio, il Datasheet for the ESP32-WROVER-E board afferma:
Per garantire l’alimentazione al chip ESP32 durante l’accensione, si consiglia di aggiungere un circuito RC di ritardo al pin
EN. L’impostazione raccomandata per il circuito RC è solitamente R = 10 kΩ e C = 1 µF.
Tuttavia, i parametri specifici dovrebbero essere regolati in base ai tempi di accensione del modulo e alle sequenze di accensione e reset del chip. Per il diagramma temporale di accensione e reset dell’ESP32, consulta la sezione Power Scheme in ESP32 Datasheet .La seguente immagine mostra il circuito RC (evidenziato con un rettangolo giallo) per la scheda di sviluppo ESP32-WROVER-E . Nota che i valori di R1 e C3 sono indicati come TBD (To Be Decided):

Su alcune schede di sviluppo questo circuito RC manca o i valori di R1 e C3 non sono adeguati, e quindi il bootloader automatico non funziona. In questo caso, otterrai il messaggio di errore ” Wrong boot mode detected (0x13)! “, quando provi a programmare il chip. Qui sotto un esempio di errore usando l’Arduino IDE e tentando di caricare il codice su una WEMOS Lolin 32D board :

Nelle prossime sezioni ti mostro due metodi manuali per mettere un ESP32 in modalità download e due circuiti hardware che puoi aggiungere per far funzionare il bootloader automatico. Dipenderà dalla specifica scheda di sviluppo quale soluzione funzionerà.
Soluzioni per Wrong boot mode detected
Soluzione 1: Premi BOOT e poi il pulsante RESET
Per manually switching an ESP32 board into download mode devi prima premere e tenere premuto il pulsante [BOOT] (o [IO0] ). Poi avvia il download, ad esempio nell’Arduino IDE premendo il pulsante con la freccia. Attendi finché non appare il testo ” Connecting… “. Infine, premi e rilascia il pulsante [RESET] (o [EN] ). Il diagramma qui sotto mostra la tempistica:

Questa procedura, ad esempio, è richiesta per program an ESP32-cam board . Sarà la stessa o simile anche per altre schede di sviluppo che non hanno il circuito RC e non supportano il bootloader automatico.
Purtroppo ci sono variazioni su questa tempistica. A quanto pare, ci sono schede in cui devi premere il pulsante [BOOT] quando vedi il testo ” Connecting… ” ma non prima.
Una volta terminato il flashing della scheda, questa rimarrà in modalità download finché non premi [RESET] per farla avviare normalmente di nuovo.
Infine, a seconda della scheda, i due pulsanti possono essere etichettati come Reset o EN o Enable , e Boot o IO0 o GPIO0 . L’immagine seguente mostra una scheda di sviluppo ESP-WROOM-32 con il pulsante [EN] e il pulsante [BOOT] :

Ma di nuovo, ci sono variazioni. Ad esempio, la WEMOS Lolin 32D board ha solo un pulsante [RESET] .
Soluzione 2: Premi il pulsante RESET
Per schede di sviluppo come la WEMOS Lolin 32 classic , la WEMOS Lolin 32D board o la WEMOS Lolin 32D Pro che hanno solo un pulsante [RESET] (ma nessun [BOOT] ), è sufficiente premere e rilasciare il pulsante [RESET] quando appare il testo ” Connecting… “.

Questo farà entrare la WEMOS Lolin 32D e le altre schede Lolin in modalità download e il programma inizierà a funzionare una volta terminato il download. Anche se è molto meglio che dover gestire i pulsanti [EN] e [BOOT] , non è ancora completamente automatico.
Soluzione 3: Resistenza da 10kΩ tra GPIO0 e GND
Per la WEMOS Lolin 32 classic , la WEMOS Lolin 32D board , la WEMOS Lolin 32D Pro, i loro cloni e probabilmente altre schede, puoi abilitare il bootloader automatico con una semplice modifica hardware. Aggiungi una resistenza da 10kΩ tra GPIO0 e GND come mostrato qui sotto:

Con questa modifica non dovrai più premere alcun pulsante quando programmi la scheda tramite Arduino IDE. Ho testato questa soluzione con la WEMOS Lolin 32D ma probabilmente funziona anche con altre schede Lolin e cloni. Curiosamente, non è necessaria per la WEMOS Lolin 32 lite e i suoi cloni.
Lo svantaggio di questa soluzione è che tira permanentemente GPIO0 a massa, quindi non puoi più usarlo come IO, e potrebbe non funzionare con alcune schede. Una soluzione migliore è aggiungere un condensatore tra EN e massa ( GND ) come descritto nella prossima sezione.
Soluzione 4: Condensatore da 1µF tra RESET/ENABLE e GND
Il datasheet dell’ESP32 raccomanda un condensatore da 1µF per il circuito RC. Su alcune schede di sviluppo questo condensatore manca o ha una capacità insufficiente. Aggiungendo un condensatore da 1µF tra il pin EN/RESET e massa si risolve il problema e il bootloader automatico funzionerà.
Ho testato questa soluzione con la WEMOS Lolin 32 classic , la WEMOS Lolin 32D e dovrebbe funzionare anche per la WEMOS Lolin 32D Pro. Come già detto, non è necessaria per la WEMOS Lolin 32 lite e i suoi cloni.
Quando aggiungi il condensatore, fai attenzione alla polarità corretta. Vedi il circuito mostrato qui sotto.

Se devi solo programmare la scheda poche volte puoi aggiungere temporaneamente il condensatore su una breadboard e poi rimuoverlo quando la scheda sarà in funzione in modo permanente:

Tuttavia, se vuoi usare regolarmente la scheda per lo sviluppo puoi saldare il condensatore in modo permanente tra i pin EN e GND. I terminali di un tipico condensatore da 1µF sono abbastanza lunghi per questo. Vedi la foto qui sotto:

Infine, ho avuto anche una DOIT DEVIT V1 ESP32-WROOM-32 board , dove il bootloader automatico non funzionava. Aggiungendo il condensatore da 1µF saldato tra EN e GND si è risolto anche questo caso:

Soluzione 5: Rimuovi la SD Card da ESP32-CAM
Se hai una scheda ESP32-CAM , ho scoperto che rimuovere la SD Card dallo slot SD può risolvere anche l’errore Modalità di avvio errata . Questo può succedere solo se c’è un programma in esecuzione sull’ESP32-CAM che interagisce con la SD Card.

Il motivo sembra essere che il lettore SD Card di solito comunica tramite SPI che usa GPIO2. Tuttavia, GPIO2 deve essere LOW per un avvio corretto in molte configurazioni ESP32. Se la SD card o il lettore SD porta GPIO2 alto durante l’avvio (ad esempio, tramite pull-up interni sulla scheda o sul modulo SD), l’ESP32 potrebbe entrare in una modalità di avvio non valida, causando l’errore Modalità di avvio errata .
Altri motivi per cui il download fallisce
Ci possono essere molte altre ragioni per cui il tuo computer non riesce a caricare il codice sul tuo ESP32. Il Troubleshooting Guide for the ESP32 elenca le seguenti cose che puoi provare:
- Controlla di passare la porta seriale corretta nella riga di comando.
- Verifica di avere i permessi per accedere alla porta seriale e che altri software (come modem-manager su Linux) non stiano cercando di interagire con essa. Un errore comune è lasciare un terminale seriale aperto su quella porta in un’altra finestra e dimenticarsene.
- Controlla che il chip riceva 3.3V da una fonte di alimentazione stabile (vedi Insufficient Power per maggiori dettagli.)
- Verifica che tutti i pin siano collegati come descritto in Boot Mode Selection . Controlla le tensioni su ogni pin con un multimetro: i pin “high” dovrebbero essere vicini a 3.3V e i pin “low” vicini a 0V.
- Se hai collegato altri dispositivi ai pin GPIO, prova a rimuoverli e vedi se esptool inizia a funzionare.
- Prova a usare un baud rate più lento (
-b 9600è un valore molto lento che puoi usare per verificare che non sia un problema di baud rate).
Conclusioni
Questo tutorial ti ha mostrato come mettere un ESP32 in modalità download, che permette di programmare l’ESP32. A seconda della scheda di sviluppo, questo può essere un processo completamente automatico, oppure richiedere alcune modifiche hardware per abilitare il bootloader automatico.
Senza uno schema della specifica scheda di sviluppo non saprai quale condensatore o resistenza serve per sistemare il circuito RC. Ma un condensatore da 1µF o una resistenza da 10kΩ dovrebbero funzionare nella maggior parte dei casi. In caso contrario, prova valori diversi. È improbabile che tu possa danneggiare la scheda.
Se hai domande, sentiti libero di lasciarle nella sezione commenti.
Link
- 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

