Der übliche Weg
Viele Maker nutzen den ESP32 in Verbindung mit der Arduino IDE. In diesem Fall wird der ESP32 über den eingebauten UART Bootloader geflasht. Ein rudimentäres Debuggen findet dann üblicherweise über eine Ausgabe per Serial.write() in ein Terminalfenster statt, oder man nutzt z.B. LEDs um interne Zustände der Software zu prüfen.
JTAG
Mit nur wenig mehr Aufwand kann man den ESP32 aber auch über seine JTAG-Schnittstelle programmieren und debuggen. Ich nutze hierfür den J-Link Debugger in der EDU Version der Firma Segger.
In diesem Beitrag wird auf die JTAG Hardwareverbindung zwischen dem ESP32 und dem J-Link Debugger eingegangen. In einem zukünftigen Beitrag wird die Softwareseite mit Microsoft VisualStudio und VisualGDB betrachtet. Dieser zeigt dann auch den Vorteil dieser Debug-Methode per JTAG-Schnittstelle auf.
Das USB Kabel wird auch bei dieser Lösung weiterhin verwendet. Zum einen dient es der Stromversorgung für den ESP32, sofern diese nicht extern erfolgt. Zum anderen können auch weiterhin über UART Daten aus- bzw. eingegeben werden.
Übertragungsqualität
Um die JTAG-Schnittstelle problemlos nutzen zu können, sollten die Verbindungen möglichst kurz und elektrisch sauber hergestellt werden. Die mögliche Verbindungsgeschwindigkeit hängt maßgeblich von der Länge und Qualität der Hardwareverbindung ab.
ESP32 JTAG Pfostenleiste
Für Bastelaufbauten habe ich auf dem von mir üblicherweise verwendeten ESP32 NodeMCU Modulen von AZ-Delivery einen Pfostenstecker angebracht:
Hierzu ist die 10-polige Pfostenleiste am Abschirmblech angelötet. Dies ist natürlich nicht ganz die feine Art, aber für Bastelzwecke einfach und zielführend. Die GND-Pins stellen auf diese Weise sowohl die elektrische- als auch die mechanische Verbindung her. Für nachhaltige Projekte ist es natürlich ratsam die Pfostenleiste auf einer sauber gefertigten Projektplatine direkt neben dem ESP32 Modul zu platzieren.
Ein paar Bilder der Montage und Verdrahtung der Pfostenleiste:
Vermutlich ist auch die WLAN-Performance durch die über die Antenne führende Leitungen negativ beeinflusst. Für WLAN-Verbindungen in der Nähe des Routers ist die Performance aber ausreichend.
JTAG Verbindungskabel
Die Verbindung zwischen dem ESP32 und dem J-Link Debugger ist durch ein Flachbandkabel hergestellt. Um die mechanische Stabilität zu erhöhen kommt etwas Heißkleber zum Einsatz. Dieser sorgt außerdem für eine elektrische Isolierung.
Der Heißkleber ist mit einem Edding Stift schwarz eingefärbt und eine Beschriftung sorgt für eine richtige Positionierung beim Einstecken. Am Kabel selbst gibt eine weitere Beschriftung Auskunft über die elektrische Verbindung.
Das Flachbandkabel stellt folgende Verbindungen her:
ESP32 Signal | ESP 32 10pin | Farbe | J-Link 20pin | J-Link Signal |
3V3 | 1 | grün | 1 | VTref |
EN | 2 | orange | 3 | nTRST |
GND | 3 | rot | 4 | GND |
G12 | 4 | braun | 5 | TDI |
GND | 5 | schwarz | 6 | GND |
G14 | 6 | weiß | 7 | TMS |
GND | 7 | grau | 8 | GND |
G13 | 8 | lila | 9 | TCK |
GND | 9 | blau | 10 | GND |
G15 | 10 | orange | 13 | TDO |
Die Pinnummern der Pfostenleisten am ESP32 und am J-Link sind in den folgenden Bildern dargestellt:
Eine detailierte Beschreibung der Pins des J-Link Debuggers findet man hier:
https://www.segger.com/products/debug-probes/j-link/technology/interface-description/
Ergebnis
Mit der nun vorhandenen JTAG-Verbindung und dem J-Link Debugger stehen in Verbindung mit VisualGDB (oder auch PlatformIO) folgende komfortable Möglichkeiten zur Verfügung:
- Breakpoints setzen und den Programmablauf damit gezielt unterbrechen
- Schrittweises Ausführen des Codes
- Codeabschnitte überspringen
- Werte globaler und lokaler Variablen anzeigen und verändern
- Inhalte von Hardware Registern anzeigen und verändern