Abschnitt 6, „Interrupts und Exceptions“: Beispiel interrupt_demo

Beispiel des Buchs „Embedded Systems mit RISC-V“, dpunkt.verlag

Die Arbeitsweise ist in Kapitel 6 Interrupts und Exceptions beschrieben.

Die Systick-Funktionalität wurde mit einem General Purpose Timer implementiert.

Eine LED an GPIO4 wird bei Betätigung des Tasters an GPIO6 mit Interruptauslösung geschaltet. Zusätzlich wird über den General Purpose Timer ermittelte Zeit in der Konsole ausgegeben.

Über die Konfiguration kann eingestellt werden, ob das Beispiel den Tastendruck über eine globale Variable (CALLBACK_NONE), einen statischen Callback (CALLBACK_STATIC) oder einen dynamischen Callback (CALLBACK_DYNAMIC) verarbeiten soll.

Im Gegensatz zur Beschreibung im Buch wurde das Beispiel folgende Komponenten aufgeteilt:

  • systick: für die Systick-Funktionalität mit General Purpose Timer
  • led: zur Ansteuerung der LED
  • button: zur Ansteuerung des Tasters und Aufruf des Callbacks
  • main: mit der Hauptapplikation, die auf den Tastendruck reagiert

Das Beispiel verwendet die Funktionen des ESP-IDF für den Zugriff auf die Peripherie.

Siehe auch die Beispiele switch_led und leds_and_buttons für den Zugriff auf die Peripherie.

Verwendet ein beliebiges Board mit ESP32-C3 Mikrocontroller.

Abschnitt 5.5, „Taster anschließen“: Beispiel leds_and_button

Die Arbeitsweise ist in Abschnitt 5.5 Taster anschließen beschrieben.
Im Beispiel werden zwei LEDs an GPIO4 und GPIO5 bei Betätigung des Tasters an GPIO6 geschaltet.
Das Beispiel verwendet die Funktionen des ESP-IDF für den Zugriff auf die Peripherie.

Siehe auch das direkte Ansteuern der Peripherie in Beispiel switch_leds.

Abschnitt 5.4, „LED schalten“: Beispiel switch_led

Im Beispiel werden zwei LEDs an GPIO4 und GPIO5 zyklisch an- und ausgeschaltet. Das Beispiel greift direkt auf die Peripherie zu. In der Konfiguration kann festgelegt werden, ob dies über Bitmaskierung oder ein Bitfield erfolgt.

ESP32-C3 mit zwei LEDs auf der Steckplatine

Die LEDs werden in Beispiel leds_and_button über die Funktionen des ESP-IDF angesteuert. Zusätzlich wird dort auf einen Tastendruck reagiert.

Abschnitt 4, „Mikrocontroller“: Beispiel rng_test

Als Beispiel für die Ansteuerung eines Peripheriemoduls wird der Zufallszahlengenerator herangezogen. Die Arbeitsweise ist im Buch detailliert ausgeführt.

Die Konfiguration erlaubt das Einstellen der Anzahl m der Bins des Chi-Quadrat-Tests, die Anzahl der zu generierenden Zufallszahlen und den Berechnungsmodus, der bei Bin-Zuordnung verwendet wird:

rng_test Konfiguration

Abschnitt 4.2.4, „Linker“: Beispiel linkerdemo

Die im Abschnitt Linker beschriebenen Segmente .noinit und .rtc-noinit werden mit globalen Variablen belegt. Nach Ausgabe und Inkrement dieser Variablen wird ein Reset durchgeführt. So wird gezeigt, dass der Variablenwert über den Reset hinweg erhalten bleibt.

Die erwähnten Linker Scripts memory.ld und sections.ld befinden sich nach dem Build im Unterverzeichnis build/esp-idf/esp_system/ld/ des Projekts.

Der Zugriff auf die Linker-Adressen _rtc_noinit_start und _rtc_noinit_end wird im Beispiel ebenso gezeigt.

Beispielausgabe von linkerdemo

Abschnitt 3, „Der Mikroprozessor“: Beispiel sum_up_n

Die beiden Beispiele sum_up_n und sum_up_n_measurements untermauern die im Kapitel „Der Mikroprozessor“ erläuterten Konzepte. Es ist wichtig zu wissen, dass das Disassembly sich beim Nachvollziehen von dem im Buch abgedruckten unterscheiden kann. Dies liegt daran, dass der generierte Code von der Compilerversion abhängig ist.

Die Messungen wurden mit dem Projekt sum_up_n_measurements durchgeführt. Verschiedene Einstellungen in der Konfiguration ermöglichen die unterschiedlichen Messungen:

  • Use CSR Macros: wählt aus, ob die Funktionen des ESP-IDF oder inline Assembler zur Messung verwendet werden soll.
  • Calculate in function: gibt an, ob die Berechnung in einer C-Funktion oder inline durchgeführt werden soll.
  • Use constant test value: kann auf den gewünschten Eingabewert gesetzt werden, über den die Gauß’sche Summe berechnet werden soll. In einer Schleife kann er auf 0 gesetzt werden, dann werden die Eingabewerte 1, 1, 10, 100, 1000, 10000, 100000, 1000000 nacheinander verwendet.
  • Calculate in a loop: Führe mehrere (true) oder nur eine (false) Berechnung durch.
  • Type of formula: wählt die Art der Berechnung aus.

Abschnitt 2.3, „Die erste Applikation“

Stellen Sie zuerst sicher, dass Sie das ESP-IDF installiert haben (ist im Beitrag ESP-IDF Installation (Windows) | Ein erstes Projekt erstellen beschrieben) und starten Sie die integrierte Entwicklungsumgebung Espressif IDE.

Wählen Sie File – New – ESP IDF Project:

Es wird ein Wizard geöffnet, in dem Sie einen beliebigen Projektnamen eingeben können. Dieser Name wird im Anschluss durch den Namen der Demoapplikation ersetzt.

Drücken Sie „Next“ und wählen Sie das Beispiel hello_world aus. Dafür muss „Create a project using one of the templates“ angehakt und das Projekt angeklickt werden.

„Finish“ erzeugt das Projekt.

Führen Sie nun einen Build des Projekts aus und starten Sie die Applikation, wie im Beitrag ESP-IDF Installation (Windows) | Ein erstes Projekt erstellen beschrieben.

Abschnitt 8.2, FlexiPlot für die Darstellung von Daten verwenden

FlexiPlot ist ein angenehmes Werkzeug zur Darstellung von Daten. Im Entwicklungsprozess ist es, wie auch in Kapitel 8.2, oft notwendig, sich ein Bild der Daten zu machen, um Trends festzustellen oder die Arbeitsweise der Datenverarbeitung mit Filtern zu visualisieren.

Besonders die einfache Verwendung machen FlexiPlot interessant. Nach dem Start erhält man eine Oberfläche, auf der man mit „Add Line Graph“ oder „Add Bar Graph“ Fenster für die beiden Graphentypen öffnen kann. Im „Settings“-Tab eines Graphen stellt man das visuelle Erscheinungsbild sowie den Namen der zugehörigen Daten ein.

Für Abb. 8.4 des Buchs wurde ein Liniengraph mit der ID P0 hinzugefügt. Als „Title“ wurde „ADC Voltage“, als „Name of X Axis“ „Zeit“, als „Name of Y Axis“ „mV“ gesetzt. Der Typ ist ein „Time Plot“. Wird das Tool mit dem seriellen Port des ESP32-C3 verbunden, wird dessen Ausgabe direkt im Graph angezeigt.

Das Beispiel servocontrol schreibt in der Codezeile

printf("{P0|RAW|0,255,0|%d|FIR2|0,0,255|%0.1f|FIR10|200,0,0|%0.1f|IIR|130,130,0|%0.1f}\n", voltage_mV, firValue_2, firValue_10, iirValue);

in den Graphen P0 die drei Einträge für voltage_mv, firValue_2, firValue_10 und iirValue (im Buch aus Übersichtlichkeitsgründen nicht iirValue). Ein Eintrag besteht aus einem Namen, beispielweise RAW, einer RGB-Farbe für die Darstellungen und dem Wert.

Im Beispiel Servocontrol werden zusätzlich die Graphen P1 und P2 verwendet, um den berechneten Widerstandswert und die berechnete Helligkeit anzuzeigen. Die Einstellungen für FlexiPlot sind dem Code des Beispiels im Verzeichnis flexiplot (servocontrol.dash) angefügt.

Über weitere Möglichkeiten des Werkzeugs gibt dessen Webseite Auskunft.

Buchprojekt Pulsoximeter

Poxi und Poxi2

Poxi

Poxi misst den Puls live

esp-dsp-Bibltiothek

Damit die esp-dsp-Bibliothek kompiliert werden kann, muss die in der Datei idf_component.yml im Verzeichnis main als dependency angegeben werden:

espressif/esp-dsp: "^1.2.0"

Außerdem kompiliert die Bibliothek in V 5.0 des ESP-IDF nicht mehr direkt. Zur Behebung kann der Compiler-Fehler in der Datei CMakeLists.txt im Projektverzeichnis abgeschaltet werden:

idf_component_get_property(lib espressif__esp-dsp COMPONENT_LIB)
target_compile_options(${lib} PRIVATE -Wno-error=format)

http://10.0.0.86/pulse

Poxi2

Poxi2 misst Puls und Sauerstoffstättigung mittels „Biometric Hub“