Motivation

Der ESP32 ist sehr leistungsfähig und kann mit der Arduino Bibliothek programmiert werden. Mit der Version 3.0.x gibt es ein neues API. Viele Methoden wurden angepasst, andere sind verschwunden. Es gibt auch neue Funktionen.

Gleiches gilt für das zugrunde liegende ESP-IDF. Viele Funktionen sind in die vorkompilierten Bibliotheken "verschwunden" und damit ist der Source-Code nicht mehr einfach zugänglich. Man ist auf die Dokumentation angewiesen, um zu erfahren, was genau in diesen Funktionen passiert. Leider ist diese nicht immer sehr aussagekräftig und im Code nachschauen geht nicht mehr so einfach. Das ESP-IDF und und auch das Arduino-API unterstützt nun noch mehr Prozessortypen. Deren besondere Eigenschaften müssen im Code berücksichtigt werden. Das verschlechtert die Lesbarkeit des Codes beträchtlich.

Auf dieser Seite finden sich viele Erkenntnisse, die im Laufe von Projektentwicklungen gewonnen wurden.

Die von mir bevorzugt benutzte Entwicklungsumgebung Visual Studio (Community Edition) mit der Erweiterung Visual Micro, besitzt z.B. ein Kontext-Menü, mit dem dem auf einfache Weise möglich ist, zum Source-Code einer Funktion zu springen. Dies gilt auch für sämtliche Bibliotheksfunktionen, die im Quellcode vorliegen. Bei vorkompilierten Funktionen, die nur noch im Binärcode vorhanden sind, klappt das natürlich nicht mehr.


Hinweis: Alle Angaben beziehen sich auf die Version 3.0.x (konkret 3.0.4) der Arduino-Board-Library für den ESP32 und dem ESP-IDF Version 5.1.4.

In­halts­ver­zeich­nis

Links

ESP-IDF

Arduino

Debugging

Ergänzende Dokumentationen

Timer-API

Links

ESP-IDF

Espressif ESP-IDF Dokumentation: https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/index.html

ESP-IDF API Reference: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/index.html

Quellcode, Tools und Beispiele auf GitHub: https://github.com/espressif/esp-idf. Quellen im Verzeichnis components.

Migration Guide: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/migration-guides/index.html

Hardware Referenz für die verschiedenen ESP32-Typen: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/index.html Hier findet man auch die Technischen Referenzhandbücher.

Arduino

Arduino API Dokumentation: https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/index.html

Quellen zur Arduino API: hhttps://github.com/espressif/arduino-esp32/tree/master

Migration von Version 2.0.x auf 3.0.x: https://docs.espressif.com/projects/arduino-esp32/en/latest/migration_guides/2.x_to_3.0.html

Debugging

Beim Entwickeln von Programmen empfiehlt es sich, die Ausgabe von Debug-Informationen zu aktivieren. Diese Informationen werden dann mit den eigenen Ausgaben über die serielle Schnittstelle ausgegeben.

Zumindest sollte man die Ausgabe von internen Fehlern einschalten. Dies geschieht über die Board-Einstellungen:

Debug-Level

Wenn es nicht zu viele Meldungen gibt, sollte man sogar den Level Warn oder Debug wählen.

Im folgenden Programm wird versucht, fünf Timer anzufordern. Die Anforderung des ersten Timers ist korrekt implementiert, bei den folgenden habe ich vergessen, den Rückgabewert abzufragen. Der Debug-Level steht auf warn.

void setup() {
   Serial.begin(115200);
   Serial.println(F("\nESP32-3.0.x-TimerTest"));

   hw_timer_t* timer1 = timerBegin(1'000'000); // Init the timer. Frequency 1 MHz
   if (timer1)
      Serial.println(F("Timer 1 frequency is 1 MHz."));
   else {
      Serial.println(F("Cannot initialize the timer.\nProgram stops."));
      Serial.flush(); // Das while(1) blockiert die Ausgabe
      while (1);
   }

   hw_timer_t* timer2 = timerBegin(1'000'000); // Init the timer. Frequency 1 MHz

   hw_timer_t* timer3 = timerBegin(1'000'000); // Init the timer. Frequency 1 MHz

   hw_timer_t* timer4 = timerBegin(1'000'000); // Init the timer. Frequency 1 MHz

   hw_timer_t* timer5 = timerBegin(1'000'000); // Init the timer. Frequency 1 MHz
...

Das Programm erzeugt diese Ausgabe:

Debug-Output

Nicht vergessen, diese Optionen wieder abzuschalten, wenn das Projekt in Praxis geht.

Ergänzende Dokumentationen

Timer-API