Si vous ne parvenez pas à télécharger du code sur votre ESP32 et que vous obtenez le message d’erreur » Mauvais mode de démarrage « , alors ce tutoriel est fait pour vous.
A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0x13)! The chip needs to be in download mode.
Un ESP32 peut essentiellement être dans trois modes différents. Il peut « exécuter » un programme, être en mode « (deep-) sleep », ou être en mode « download/flash » pour être programmé.
Avant de pouvoir télécharger du code sur un ESP32, la puce doit être dans le §correct mode boot mode . Pour entrer manuellement en mode téléchargement ou flash du firmware, où vous pouvez programmer votre ESP32, vous devez généralement appuyer sur les boutons BOOT (ou GPIO0) et EN (ou RESET) de votre carte de développement (plus d’explications à ce sujet plus tard).

Comme cela peut être fastidieux, de nombreuses cartes supportent un bootloader automatique, où le logiciel de programmation (par exemple Arduino IDE , esptool ) contrôle le mode de démarrage via la puce convertisseur USB-série sur la carte de développement.
Cependant, le bootloader automatique dépend d’un circuit spécifique impliquant les broches GPIO0 et ENABLE de l’ESP32. Sur certaines cartes de développement, ce circuit est incorrect ou manquant, et le bootloader automatique ne fonctionne pas correctement, voire pas du tout. Ce qui conduit à l’erreur : » Wrong boot mode detected (0x13) « , lors de la tentative de téléchargement du code sur l’ESP32.
Les deux sections suivantes expliquent plus en détail la cause du problème de téléchargement. Mais vous pouvez les ignorer si vous êtes uniquement intéressé par les solutions possibles à ce problème.
Comment le bootloader automatique est câblé et activé
Une carte de développement ESP32 possède typiquement un connecteur USB, qui, en plus de l’alimentation, comporte deux lignes de données USB_DN et USB_DP comme montré dans le schéma du ESP32 Devkit-C ci-dessous :

Les lignes de données USB_DN et USB_DP sont connectées à une puce convertisseur USB-série/UART (par exemple CP2102N ) qui convertit les données USB en données série sur les lignes TXD et RXD . Plus important encore, elle génère aussi les signaux DTR et DSR , qui contrôlent le flux de données. Voir à nouveau le schéma autour du CP2102N du ESP32 Devkit-C ci-dessous :

Les signaux de contrôle DTR et DSR sont ensuite envoyés dans un circuit de « programmation » connecté aux broches EN(ABLE) et (GP)IO0 de l’ESP32 :

Voici la table de vérité qui décrit la fonction de ce circuit de « programmation » :

Mais pour que la programmation fonctionne réellement, la broche EN doit aussi être connectée à un circuit RC composé d’une résistance R (R11) et d’un condensateur C (C9), qui introduit un délai temporel sur le signal EN :

Et c’est là que réside le cœur du problème. Certaines cartes de développement n’ont pas ce circuit RC ou ont des valeurs incorrectes pour la résistance ou le condensateur. Plus d’explications dans la section suivante et pour plus de détails, lisez le ESP32 documentation on boot mode selection .
Pourquoi le bootloader automatique ne fonctionne pas
Pour passer un ESP32 en mode download mode , il faut changer d’un état où la broche ENABLE est haute et la broche GPIO0 est basse, à un état où ENABLE est basse et GPIO0 est basse. Si vous voulez tous les détails techniques, lisez ce très bon article : Understanding the automatic boot loader mechanism and truth table .
Le passage en mode téléchargement est sensible au timing et le Datasheet for the ESP32-WROVER-E board , par exemple, indique :
Pour assurer l’alimentation de la puce ESP32 lors de la mise sous tension, il est conseillé d’ajouter un circuit de délai RC sur la broche
EN. La configuration recommandée pour ce circuit RC est généralement R = 10 kΩ et C = 1 µF.
Cependant, les paramètres spécifiques doivent être ajustés en fonction du timing de mise sous tension du module et de la séquence de mise sous tension et de réinitialisation de la puce. Pour le diagramme de séquence de mise sous tension et de réinitialisation de l’ESP32, veuillez consulter la section Power Scheme dans ESP32 Datasheet .L’image suivante montre le circuit RC (encadré en jaune) pour la carte de développement ESP32-WROVER-E . Notez que les valeurs de R1 et C3 sont indiquées comme TBD (à décider) :

Pour certaines cartes de développement, ce circuit RC est absent ou les valeurs de R1 et C3 sont inadéquates, et donc le bootloader automatique ne fonctionne pas. Dans ce cas, vous obtiendrez le message d’erreur » Wrong boot mode detected (0x13)! » lors de la programmation de la puce. Voici un exemple de message d’erreur avec l’IDE Arduino en essayant de télécharger du code sur un WEMOS Lolin 32D board :

Dans les sections suivantes, je vous montre deux méthodes manuelles pour passer un ESP32 en mode téléchargement et deux circuits matériels que vous pouvez ajouter pour faire fonctionner le bootloader automatique. Cela dépendra de la carte de développement spécifique, ce qui fonctionne ou pas.
Solutions pour Mauvais mode de démarrage détecté
Solution 1 : Appuyez sur BOOT puis sur RESET
Pour manually switching an ESP32 board into download mode , vous devez d’abord appuyer et maintenir le bouton [BOOT] (ou [IO0] ). Ensuite, lancez le téléchargement, par exemple dans l’IDE Arduino en appuyant sur le bouton flèche. Attendez que le texte » Connecting… » apparaisse. Enfin, appuyez et relâchez le bouton [RESET] (ou [EN] ). Le diagramme ci-dessous montre le timing :

Cette procédure est, par exemple, nécessaire pour program an ESP32-cam board . Ce sera la même chose ou similaire pour d’autres cartes de développement qui n’ont pas le circuit RC et ne supportent pas du tout l’automatique.
Malheureusement, il existe des variations sur ce timing. Apparemment, certaines cartes nécessitent d’appuyer sur le bouton [BOOT] lorsque vous voyez le texte » Connecting… » mais pas avant.
Une fois le flashage terminé, la carte restera en mode téléchargement jusqu’à ce que vous appuyiez sur [RESET] pour qu’elle démarre normalement à nouveau.
Enfin, selon la carte, les deux boutons sont soit étiquetés Reset ou EN ou Enable , et Boot ou IO0 ou GPIO0 . L’image suivante montre une carte de développement ESP-WROOM-32 avec les boutons [EN] et [BOOT] :

Mais encore une fois, il y a des variations. Par exemple, la WEMOS Lolin 32D board n’a qu’un seul bouton [RESET] .
Solution 2 : Appuyez sur le bouton RESET
Pour des cartes de développement comme la WEMOS Lolin 32 classic , la WEMOS Lolin 32D board ou la WEMOS Lolin 32D Pro qui n’ont qu’un bouton [RESET] (mais pas de [BOOT] ), il suffit d’appuyer et de relâcher le bouton [RESET] lorsque le texte » Connecting… » apparaît.

Cela mettra la WEMOS Lolin 32D et les autres cartes Lolin en mode téléchargement et le programme démarrera une fois le téléchargement terminé. Bien que ce soit bien mieux que de jongler avec le bouton [EN] et le bouton [BOOT] , ce n’est toujours pas entièrement automatique.
Solution 3 : Résistance 10kΩ entre GPIO0 et GND
Pour la WEMOS Lolin 32 classic , la WEMOS Lolin 32D board , la WEMOS Lolin 32D Pro, leurs clones et probablement d’autres cartes, vous pouvez activer le bootloader automatique avec un simple changement matériel. Ajoutez une résistance de 10kΩ entre GPIO0 et GND comme montré ci-dessous :

Avec ce changement, vous n’aurez plus besoin d’appuyer sur aucun bouton lors de la programmation via l’IDE Arduino. J’ai testé cela avec la WEMOS Lolin 32D mais cela devrait aussi fonctionner avec d’autres cartes Lolin et clones. Fait intéressant, ce n’est pas nécessaire pour la WEMOS Lolin 32 lite et ses clones.
L’inconvénient de cette solution est qu’elle tire en permanence GPIO0 vers la masse, donc vous ne pouvez plus l’utiliser comme IO, et cela peut ne pas fonctionner avec certaines cartes. Une meilleure solution est d’ajouter un condensateur entre EN et la masse ( GND ) comme décrit dans la section suivante.
Solution 4 : Condensateur 1µF entre RESET/ENABLE et GND
La fiche technique de l’ESP32 recommande un condensateur de 1µF pour le circuit RC. Sur certaines cartes de développement, ce condensateur est absent ou de capacité insuffisante. Ajouter un condensateur de 1µF entre la broche EN/RESET et la masse résout ce problème et le bootloader automatique fonctionnera alors.
J’ai testé cela avec la WEMOS Lolin 32 classic , la WEMOS Lolin 32D et cela devrait aussi fonctionner pour la WEMOS Lolin 32D Pro. Comme mentionné précédemment, ce n’est pas nécessaire pour la WEMOS Lolin 32 lite et ses clones.
Lors de l’ajout du condensateur, faites attention à la polarité correcte. Voir le circuit ci-dessous.

Si vous devez juste programmer la carte quelques fois, vous pouvez ajouter temporairement le condensateur sur une breadboard et le retirer ensuite, lorsque la carte fonctionne en permanence :

Cependant, si vous souhaitez utiliser régulièrement la carte pour le développement, vous pouvez souder le condensateur en permanence entre les broches EN et GND. Les pattes d’un condensateur 1µF typique sont juste assez longues pour cela. Voir la photo ci-dessous :

Enfin, j’ai aussi eu un DOIT DEVIT V1 ESP32-WROOM-32 board où le bootloader automatique ne fonctionnait pas non plus. Ajouter le condensateur 1µF soudé entre EN et GND a aussi résolu ce problème :

Solution 5 : Retirer la carte SD de l’ESP32-CAM
Si vous avez une carte ESP32-CAM , j’ai constaté que retirer la carte SD du slot peut aussi résoudre l’erreur Mauvais mode de démarrage . Cela peut n’être vrai que si un programme sur l’ESP32-CAM interagit avec la carte SD.

La raison semble être que le lecteur de carte SD communique généralement via SPI qui utilise GPIO2. Cependant, GPIO2 doit être à LOW pour un démarrage correct dans de nombreuses configurations ESP32. Si la carte SD ou le lecteur de carte SD tire GPIO2 vers le haut au démarrage (par exemple via des résistances de tirage internes sur la carte ou le module SD), l’ESP32 peut entrer dans un mode de démarrage invalide, entraînant l’erreur Mauvais mode de démarrage .
Autres raisons d’échec de téléchargement
Il peut y avoir de nombreuses autres raisons pour lesquelles votre ordinateur ne peut pas télécharger du code sur votre ESP32. Le Troubleshooting Guide for the ESP32 liste les points suivants que vous pouvez essayer :
- Vérifiez que vous utilisez le bon port série en ligne de commande.
- Vérifiez que vous avez les permissions d’accès au port série, et qu’aucun autre logiciel (comme modem-manager sous Linux) n’interagit avec. Un piège courant est de laisser un terminal série ouvert sur ce port dans une autre fenêtre sans s’en souvenir.
- Vérifiez que la puce reçoit bien du 3.3V d’une source d’alimentation stable (voir Insufficient Power pour plus de détails.)
- Vérifiez que toutes les broches sont connectées comme décrit dans Boot Mode Selection . Mesurez les tensions à chaque broche avec un multimètre, les broches « hautes » doivent être proches de 3.3V et les broches « basses » proches de 0V.
- Si vous avez connecté d’autres dispositifs aux broches GPIO, essayez de les déconnecter et voyez si esptool fonctionne.
- Essayez d’utiliser un débit en bauds plus lent (
-b 9600est une valeur très lente que vous pouvez utiliser pour vérifier que ce n’est pas un problème de débit).
Conclusions
Ce tutoriel vous a montré comment passer un ESP32 en mode téléchargement, ce qui permet de programmer l’ESP32. Selon la carte de développement, cela peut être un processus entièrement automatique, ou nécessiter des modifications matérielles pour activer le bootloader automatique.
Sans schéma de la carte spécifique, vous ne saurez pas quel condensateur ou résistance spécifique est nécessaire pour corriger le circuit RC. Mais un condensateur de 1µF ou une résistance de 10kΩ fonctionnera dans la plupart des cas. Sinon, essayez différentes valeurs. Il est peu probable que vous endommagiez la carte.
Si vous avez des questions, n’hésitez pas à les poser dans la section commentaires.
Liens
- 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

