Skip to Content

Wrong boot mode ESP32

Wrong boot mode ESP32

Wenn du keinen Code auf deinen ESP32 herunterladen kannst und die Fehlermeldung „Wrong boot mode“ erhältst, dann ist dieses Tutorial genau richtig für dich.

A fatal error occurred: Failed to connect to ESP32: 
Wrong boot mode detected (0x13)! 
The chip needs to be in download mode.

Ein ESP32 kann im Wesentlichen in drei verschiedenen Modi sein. Er kann ein Programm „ausführen“, im „(Deep-)Sleep“-Modus sein oder im „Download/Flash“-Modus, um programmiert zu werden.

Bevor du Code auf einen ESP32 herunterladen kannst, muss der Chip im richtigen boot mode sein. Um manuell in den Firmware-Download- oder Flash-Modus zu wechseln, in dem du deinen ESP32 programmieren kannst, musst du normalerweise die BOOT- (oder GPIO0) und EN- (oder RESET) Tasten auf deinem Entwicklungsboard drücken (dazu später mehr).

Code vom Computer auf den ESP32 herunterladen

Da das umständlich ist, unterstützen viele Boards einen automatischen Bootloader, bei dem die Programmier-Software (z.B. Arduino IDE, esptool) den Boot-Modus über den USB-zu-Seriell-Konverter-Chip auf dem Entwicklungsboard steuert.

Der automatische Bootloader basiert jedoch auf einer speziellen Schaltung, die die GPIO0 und ENABLE Pins des ESP32 einbezieht. Bei einigen Entwicklungsboards ist diese Schaltung fehlerhaft oder fehlt, sodass der automatische Bootloader nicht richtig oder gar nicht funktioniert. Das führt zu der Fehlermeldung: „Wrong boot mode detected (0x13)„, wenn versucht wird, Code auf den ESP32 zu laden.

Die nächsten zwei Abschnitte beschreiben genauer, was das Problem beim Download verursacht. Du kannst sie aber überspringen, wenn du nur an möglichen Lösungen interessiert bist.

Wie der automatische Bootloader verdrahtet und aktiviert wird

Ein ESP32-Entwicklungsboard hat typischerweise einen USB-Anschluss, der neben der Stromversorgung zwei Datenleitungen USB_DN und USB_DP besitzt, wie im Schaltplan des ESP32 Devkit-C unten gezeigt:

USB connector
USB-Anschluss (source)

Die USB_DN und USB_DP Datenleitungen sind mit einem USB-zu-Seriell/UART-Konverterchip (z.B. CP2102N) verbunden, der die USB-Daten in serielle Daten auf den TXD und RXD Leitungen umwandelt. Wichtig ist, dass er auch die Signale DTR und DSR erzeugt, die den Datenfluss steuern. Siehe dazu den Schaltplan rund um den CP2102N des ESP32 Devkit-C unten:

USB to UART converter
USB-zu-UART-Konverter (source)

Die Steuersignale DTR und DSR werden dann in eine „Programmier“-Schaltung eingespeist, die mit den EN(ABLE) und (GP)IO0 Pins des ESP32 verbunden ist:

"Programming" Circuit
„Programmier“-Schaltung (source)

Hier ist die Wahrheitstabelle, die die Funktion dieser „Programmier“-Schaltung beschreibt:

Truth table of "Programming" Circuit
Wahrheitstabelle der „Programmier“-Schaltung (source)

Damit das Programmieren tatsächlich funktioniert, muss der EN Pin auch mit einer RC Schaltung verbunden sein, die aus einem Resistor (R11) und einem Capacitor (C9) besteht und eine Zeitverzögerung des EN Signals einführt:

RC Circuit
RC-Schaltung (source)

Und hier liegt der Kern des Problems. Einige Entwicklungsboards haben diese RC-Schaltung entweder nicht oder die Werte für Widerstand oder Kondensator sind falsch. Mehr dazu im nächsten Abschnitt und für noch mehr Details lies das ESP32 documentation on boot mode selection.

Warum der automatische Bootloader nicht funktioniert

Um einen ESP32 in den download mode Modus zu versetzen, muss man von einem Zustand wechseln, in dem der ENABLE Pin hoch und der GPIO0 Pin niedrig ist, zu einem Zustand, in dem ENABLE niedrig und GPIO0 ebenfalls niedrig ist. Wenn du alle Details wissen willst, lies diesen hervorragenden Beitrag: Understanding the automatic boot loader mechanism and truth table.

Der Wechsel in den Download-Modus ist zeitkritisch, und der Datasheet for the ESP32-WROVER-E board besagt zum Beispiel:

Um die Stromversorgung des ESP32-Chips beim Einschalten sicherzustellen, wird empfohlen, eine RC-Verzögerungsschaltung am EN Pin hinzuzufügen. Die empfohlene Einstellung für die RC-Verzögerungsschaltung ist üblicherweise R = 10 kΩ und C = 1 µF.
Die spezifischen Parameter sollten jedoch basierend auf dem Einschaltzeitpunkt des Moduls und der Einschalt- und Reset-Sequenz des Chips angepasst werden. Für das Timing-Diagramm der Einschalt- und Reset-Sequenz des ESP32 siehe Abschnitt Power Scheme in ESP32 Datasheet.

Das folgende Bild zeigt die RC-Schaltung (gelb markiert) für das ESP32-WROVER-E Entwicklungsboard. Beachte, dass die Werte für R1 und C3 mit TBD (To Be Decided) angegeben sind:

ESP32 RC delay circuit
ESP32 RC-Verzögerungsschaltung (source)

Bei einigen Entwicklungsboards fehlt diese RC-Schaltung oder die Werte für R1 und C3 sind unzureichend, weshalb der automatische Bootloader nicht funktioniert. In diesem Fall erhältst du die Fehlermeldung „Wrong boot mode detected (0x13)!„, wenn du versuchst, den Chip zu programmieren. Unten ein Beispiel für eine Fehlermeldung in der Arduino IDE beim Versuch, Code auf einen WEMOS Lolin 32D board zu laden:

Error in Arduino IDE: Wrong boot mode detected (0x13)!
Fehler in Arduino IDE: Falscher Boot-Modus erkannt (0x13)!

In den nächsten Abschnitten zeige ich dir zwei manuelle Methoden, um einen ESP32 in den Download-Modus zu versetzen, und zwei Hardware-Schaltungen, die du hinzufügen kannst, um den automatischen Bootloader zum Laufen zu bringen. Es hängt vom jeweiligen Entwicklungsboard ab, was funktioniert oder nicht.

Lösungen für „Wrong boot mode detected“

Lösung 1: BOOT drücken und dann RESET-Taste

Um manually switching an ESP32 board into download mode zu erreichen, musst du zuerst die [BOOT] (oder [IO0]) Taste gedrückt halten. Dann startest du den Download, z.B. in der Arduino IDE durch Drücken des Pfeil-Buttons. Warte, bis der Text „Connecting…“ erscheint. Drücke dann kurz die [RESET] (oder [EN]) Taste und lasse sie wieder los. Das folgende Diagramm zeigt dir das Timing:

Timing for EN and IO0 button to enter download mode
Timing für EN- und IO0-Taste zum Eintritt in den Download-Modus

Dieses Verfahren ist z.B. erforderlich, um program an ESP32-cam board. Es ist dasselbe oder ähnlich bei anderen Entwicklungsboards, die die RC-Schaltung nicht haben und den automatischen Bootloader gar nicht unterstützen.

Leider gibt es Variationen beim Timing. Offenbar gibt es Boards, bei denen du die [BOOT] Taste erst drücken musst, wenn du den Text „Connecting…“ siehst, aber nicht vorher.

Nachdem du das Board geflasht hast, bleibt es im Download-Modus, bis du [RESET] drückst, um es wieder normal booten zu lassen.

Je nach Board sind die beiden Tasten entweder mit Reset oder EN oder Enable, und Boot oder IO0 oder GPIO0 beschriftet. Das folgende Bild zeigt ein ESP-WROOM-32 Entwicklungsboard mit der [EN] und der [BOOT] Taste:

Buttons on ESP-WROOM-32 board
Tasten auf ESP-WROOM-32 Board (source)

Aber auch hier gibt es Variationen. Zum Beispiel hat das WEMOS Lolin 32D board nur eine [RESET] Taste.

Lösung 2: RESET-Taste drücken

Für Entwicklungsboards wie das WEMOS Lolin 32 classic, das WEMOS Lolin 32D board oder das WEMOS Lolin 32D Pro, die nur eine [RESET] Taste haben (aber keine [BOOT]), reicht es aus, die [RESET] Taste zu drücken und loszulassen, wenn der Text „Connecting…“ erscheint.

[RESET] button on WEMOS Lolin 32D board (source)

Damit wird der WEMOS Lolin 32D und die anderen Lolin Boards in den Download-Modus versetzt und das Programm startet, sobald der Download abgeschlossen ist. Das ist zwar besser, als die [EN] und [BOOT] Tasten gleichzeitig zu bedienen, aber immer noch nicht ganz automatisch.

Lösung 3: 10kΩ Widerstand zwischen GPIO0 und GND

Für das WEMOS Lolin 32 classic, das WEMOS Lolin 32D board, das WEMOS Lolin 32D Pro, deren Klone und wahrscheinlich einige andere Boards kannst du den automatischen Bootloader mit einer einfachen Hardware-Änderung aktivieren. Füge einen 10kΩ Widerstand zwischen GPIO0 und GND hinzu, wie unten gezeigt:

10kΩ Resistor between GPIO0 and GND for WEMOS Lolin 32D
10kΩ Widerstand zwischen GPIO0 und GND für WEMOS Lolin 32D

Mit dieser Änderung musst du beim Programmieren des Boards über die Arduino IDE keine Tasten mehr drücken. Ich habe das mit dem WEMOS Lolin 32D getestet, aber es funktioniert wahrscheinlich auch mit anderen Lolin Boards und Klonen. Interessanterweise ist es für das WEMOS Lolin 32 lite und dessen Klone nicht nötig.

Der Nachteil dieser Lösung ist, dass GPIO0 dauerhaft auf Masse gezogen wird, sodass du ihn nicht mehr als IO nutzen kannst, und es kann bei manchen Boards nicht funktionieren. Eine bessere Lösung ist, einen Kondensator zwischen GPIO0 und Masse (EN) hinzuzufügen, wie im nächsten Abschnitt beschrieben.GND

Lösung 4: 1µF Kondensator zwischen RESET/ENABLE und GND

Das Datenblatt des ESP32 empfiehlt einen 1µF Kondensator für die RC-Schaltung. Bei manchen Entwicklungsboards fehlt dieser Kondensator oder er hat zu geringe Kapazität. Das Hinzufügen eines 1µF Kondensators zwischen dem EN/RESET-Pin und Masse behebt das und der automatische Bootloader funktioniert dann.

Ich habe das mit dem WEMOS Lolin 32 classic getestet und es sollte auch für das WEMOS Lolin 32D board und das WEMOS Lolin 32D Pro board funktionieren. Wie bereits erwähnt, ist es für das WEMOS Lolin 32D board und dessen Klone nicht nötig.

Achte beim Hinzufügen des Kondensators auf die richtige Polung. Siehe die unten gezeigte Schaltung.

1µF Capacitor between EN and GND for WEMOS Lolin 32D
1µF Kondensator zwischen EN und GND für WEMOS Lolin 32D

Wenn du das Board nur ein paar Mal programmieren musst, kannst du den Kondensator vorübergehend auf einem Breadboard hinzufügen und später entfernen, wenn das Board dauerhaft läuft:

1µF Capacitor between EN and GND for WEMOS Lolin 32D on breadboard
1µF Kondensator zwischen EN und GND für WEMOS Lolin 32D auf Breadboard

Wenn du das Board regelmäßig für die Entwicklung nutzen willst, kannst du den Kondensator dauerhaft zwischen EN und GND anlöten. Die Beine eines typischen 1µF Kondensators sind dafür gerade lang genug. Siehe das Bild unten:

1µF Kondensator zwischen EN und GND für

1µF Capacitor soldered between EN and GND for WEMOS Lolin 32D
1µF Kondensator zwischen EN und GND für WEMOS Lolin 32D angelötet

Schließlich hatte ich auch ein DOIT DEVIT V1 ESP32-WROOM-32 board, bei dem der automatische Bootloader ebenfalls nicht funktionierte. Das Hinzufügen des 1µF Kondensators zwischen EN und GND löste das Problem ebenfalls:

1µF Capacitor between EN and GND for DOIT ESP32-WROOM-32 board
1µF Kondensator zwischen EN und GND für DOIT ESP32-WROOM-32 board

Lösung 5: SD-Karte aus ESP32-CAM entfernen

Wenn du ein ESP32-CAM Board hast, habe ich festgestellt, dass das Entfernen der SD-Karte aus dem SD-Karten-Slot ebenfalls den Wrong boot mode Fehler beheben kann. Das gilt möglicherweise nur, wenn ein Programm auf dem ESP32-CAM läuft, das mit der SD-Karte interagiert.

SD-Karte aus ESP32-CAM entfernen

Der Grund scheint zu sein, dass der SD-Kartenleser normalerweise über SPI kommuniziert, das GPIO2 verwendet. GPIO2 muss für den korrekten Boot bei vielen ESP32-Konfigurationen LOW sein. Wenn die SD-Karte oder der SD-Kartenleser GPIO2 beim Booten auf HIGH zieht (z.B. durch interne Pull-ups auf der Karte oder dem SD-Kartenmodul), könnte der ESP32 in einen ungültigen Boot-Modus wechseln, was den Falscher Boot-Modus Fehler verursacht.

Andere Gründe für fehlgeschlagenen Download

Es kann viele weitere Gründe geben, warum dein Computer keinen Code auf deinen ESP32 herunterladen kann. Das Troubleshooting Guide for the ESP32 listet folgende Dinge auf, die du versuchen kannst:

  • Überprüfe, ob du den richtigen seriellen Port in der Kommandozeile angibst.
  • Überprüfe, ob du die Berechtigungen hast, auf den seriellen Port zuzugreifen, und ob keine andere Software (wie modem-manager unter Linux) versucht, darauf zuzugreifen. Ein häufiger Fehler ist, ein Terminalfenster offen zu lassen, das den Port nutzt, und es zu vergessen.
  • Überprüfe, ob der Chip 3,3 V von einer stabilen Stromquelle erhält (siehe Insufficient Power für mehr Details).
  • Überprüfe, ob alle Pins wie in Boot Mode Selection beschrieben verbunden sind. Messe die Spannungen an jedem Pin mit einem Multimeter, „hohe“ Pins sollten nahe 3,3 V und „niedrige“ Pins nahe 0 V liegen.
  • Wenn du andere Geräte an GPIO-Pins angeschlossen hast, versuche sie zu entfernen und prüfe, ob es mit esptool funktioniert.
  • Versuche eine langsamere Baudrate (-b 9600 ist ein sehr langsamer Wert, den du verwenden kannst, um auszuschließen, dass es ein Baudratenproblem ist).

Fazit

Dieses Tutorial hat dir gezeigt, wie du einen ESP32 in den Download-Modus versetzt, der das Programmieren des ESP32 ermöglicht. Je nach Entwicklungsboard kann das ein vollautomatischer Prozess sein oder erfordert einige Hardware-Änderungen, um den automatischen Bootloader zu aktivieren.

Ohne Schaltplan des spezifischen Entwicklungsboards weißt du nicht, welcher Kondensator oder Widerstand nötig ist, um die RC-Schaltung zu reparieren. Aber ein 1µF Kondensator oder 10kΩ Widerstand sollte in den meisten Fällen funktionieren. Wenn nicht, probiere verschiedene Werte aus. Es ist unwahrscheinlich, dass du das Board beschädigst.

Wenn du Fragen hast, kannst du sie gerne im Kommentarbereich stellen.

Links