Startseite>STM32-Mikrocontroller und OpenSTM32-IDE
Aus Raspberry Pi Geek 08/2019

STM32-Mikrocontroller und OpenSTM32-IDE (Seite 2)

Abbildung 7: Projekt erstellen, Schritt 4: Zusätzliche Bibliotheken und Firmware auswählen.

Abbildung 7: Projekt erstellen, Schritt 4: Zusätzliche Bibliotheken und Firmware auswählen.

Das Programm

Um nun mit dem Programmieren zu starten, öffnen Sie die Datei main.c, die Sie im Ordner scr/ des Projekts finden. Als Inhalt übertragen Sie den Code aus Listing 2 in den Code-Bereich. C-typisch importiert es zunächst alle nötigen Bibliotheken, im konkreten Fall jene mit den Basisfunktionen für STM32-Mikrocontroller.

Bei den meisten Mikrocontrollern programmiert man direkt die Hardware, im aktuellen Fall haben Sie beim Erstellen des Projekts jedoch die Verwendung der Hardware Abstraction Layer (kurz HAL) aktiviert. Mithilfe dieser Abstraktionsschicht fällt es leichter, Programme von einem Controller zu einem anderen zu transferieren. Auch die Unterstützung des HAL steckt in den zwei Bibliotheken.

Listing 2

#include "stm32f4xx.h"
#include "stm32f4xx_nucleo.h"
int main(void) {
  int i = 0 ;
  GPIO_InitTypeDef GPIO_InitStruct;
  __GPIOA_CLK_ENABLE();
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  HAL_Init();
  for(;;) {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    HAL_Delay(500);
    i++;
  }
}

Die Funktion main() definiert das erste richtige Kommando. Sie kennen vermutlich von anderen Umgebungen, etwa dem Arduino, die Funktion setup() oder loop(). Im Prinzip gleicht sich das Vorgehen: Der erste Teil von main() führt die für das Setup nötigen Schritte aus (ab Zeile 4). Anschließend folgt eine Endlosschleife (for(;;), Zeile 12). Sie entspricht der loop()-Funktion, wie man sie von anderen IDEs her kennt.

Bleiben wir erst einmal in der For-Schleife. Das Kommando HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); bewirkt das Umschalten des digitalen Ausgangs PA5 von 0 zu 1 und umgekehrt. Der hier verwendete Ausgang ist mit der Leuchtdiode LD2 auf dem Nucleo-Board verbunden. Das folgende Kommando HAL_Delay(500); initiiert eine Wartezeit. Beide Kommandos zusammen lassen also die LED in einem vordefinierten Intervall aufblinken.

Beim Betrachten des Codes fragen Sie sich sicher, wozu die Variable i dient. Sie erfüllt in der Tat erst einmal keine Funktion. Sie können aber später, wenn Sie sich mit dem Debugger beschäftigen, sehen, wie sich der Wert von i erhöht. Es fällt außerdem auf, dass die Namen aller Befehle mit HAL_ beginnen. Das zeigt, dass Sie hier nicht direkt auf der Hardware operieren, sondern auf dem Abstraction Layer.

Kommen wir nun zum Setup zurück: Es wirkt recht umfangreich, um nur einen Pin als digitalen Output zu verwenden. Einer der Gründe dafür liegt darin, dass wir hier den HAL verwenden. Damit er arbeiten kann, muss man ihn immer erst einmal initialisieren. Außerdem besitzen die Mikrocontroller der STM32-Serie schlichtweg eine Menge Konfigurationsmöglichkeiten.

TIPP

Ein regelmäßiger Blick auf das Pinout des Mikrocontrollers hilft dabei, nicht den Überblick über die Belegung der I/O-Pins zu verlieren. Am besten drucken Sie die Belegungspläne dazu aus.

Die I/O-Pins werden immer über die Struktur GPIO_InitTypeDef definiert; bestimmte GPIO-Pins fasst das System zu Ports zusammen (A, B, C, D). Da es so viele Möglichkeiten gibt und die Controller-Familie nicht gerade klein ist, stellt STMicroelectronics mit STM32CubeMX ein Tool bereit, um die Konfiguration der einzelnen Ports grafisch zu erledigen (siehe Kasten “STM32CubeMX”).

Nun ist der Zeitpunkt gekommen, das Programm zu kompilieren. Dazu klicken Sie in der IDE auf das Build-Icon (den kleinen Hammer). Läuft der Build-Vorgang ohne schwerwiegende Fehler durch, lässt sich das Programm in den Controller laden. Das erledigen Sie über das Run-Icon (Pfeil nach rechts). Nach dem Hochladen startet das Programm auf dem Controller automatisch. Die Leuchtdiode LD2 sollte jetzt blinken.

STM32CubeMX

Mit STM32CubeMX [5] bietet STMicroelectronics ein kostenloses Programm an, mit dem sich die Mikrocontroller aus der STM32-Familie grafisch konfigurieren lassen (Abbildung 8). Nach der Auswahl des gewünschten Controllers zeigt STM32CubeMX eine Grafik des Boards an, in der Sie nun die einzelnen GPIO-Ports auswählen und deren Funktion festlegen. Nach dem Einrichten aller GPIOs lässt sich der entsprechende C-Code per Mausklick erzeugen und dann in ein STM32-Projekt einbinden. Das spart nicht nur Zeit, sondern stellt auch sicher, dass der eingebundene Code fehlerfrei ist.

Abbildung 8: Die mit STM32CubeMX zusammengebaute Konfiguration für den STM32-Mikrocontroller.

Abbildung 8: Die mit STM32CubeMX zusammengebaute Konfiguration für den STM32-Mikrocontroller.

Debugger

Ein Debugger ist ein Programm, das Software-Entwicklern hilft, Fehler in anderen Programmen zu finden. Um ein Programm debuggen zu können, muss man es in einem speziellen Modus kompilieren: Dabei entsteht zusätzlicher Programmcode, der es dem Debugger ermöglicht, das eigentliche Programm während der Laufzeit zu analysieren.

Durch den zusätzlichen Programmcode verlangsamt sich die Ausführungsgeschwindigkeit der analysierten Anwendung erheblich. Man sollte Programme daher nur im Debug-Modus kompilieren, wenn man sie auch wirklich debuggen möchte. Um den Debug-Modus zu starten, klicken Sie einfach auf das Icon mit dem Käfer (entsprechend der Suche nach einem Bug).

Der Debugger braucht einige Zeit, um zu starten. Im Debug-Modus (Abbildung 9) erschlägt die Entwicklungsumgebung Einsteiger dann mit ziemlich ausführlichen Informationen; in der Mitte finden Sie den Programmcode in einem kleinen Fenster. Hier sehen Sie grün hinterlegt, welches Kommando der Debugger gerade ausführt.

Abbildung 9: Der Debugger wirkt anfangs etwas unübersichtlich.

Abbildung 9: Der Debugger wirkt anfangs etwas unübersichtlich.

Starten Sie den Debugger das erste Mal, setzt die Anwendung automatisch einen Breakpoint auf die erste Zeile des Programmcodes. Ein solcher Breakpoint unterbricht die Ausführung des Programms, ähnlich wie die Pause-Taste an einem Mediaplayer. Die Werte aller Variablen bleiben dabei erhalten, was erlaubt, den Programmcode und die aktuellen Variablen während der Ausführung zu analysieren. Um einen weiteren Breakpoint zu setzen, müssen Sie vor der Zeilennummer doppelt in den roten Bereich klicken.

Setzen Sie nun einen neuen Breakpoint auf das Kommando i++;. Momentan sollte das Programm immer noch in der ersten Zeile angehalten sein. Um es weiterlaufen zu lassen, drücken Sie die Taste [F8] oder das Play-Icon in der Werkzeugleiste. Das Programm läuft nun bis zum neuen Breakpoint auf der Zeile i++; weiter.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 7 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland