Aus Raspberry Pi Geek 06/2016

STM32-Entwicklung mit CubeMX und Eclipse (Seite 4)

Abbildung 3: Einstellung des Importieren-Dialogs in Eclipse.

Abbildung 3: Einstellung des Importieren-Dialogs in Eclipse.

Eclipse legt daraufhin ein C/C++-Projekt an, dessen main.c sich im Unterordner Src/ befindet. Die darin enthaltene Funktion main() beginnt mit Funktionsaufrufen zur Initialisierung des Controllers und endet mit einer leeren Endlosschleife. Die nötigen Informationen, um die Initialisierungen nachzuvollziehen, finden Sie in einem Tutorial von Diller Technologies [7] oder einem englischsprachigen Online-Buch von Geoffrey Brown [8].

Im Projekt fallen auf den ersten Blick die vielen Kommentare auf – sie untergliedern die gesamte Datei in Sektionen. Diese Kommentare sollten möglichst erhalten bleiben, um CubeMX spätere Änderungen zu ermöglichen. Daher sollten Ihre Änderungen nur in den mit USER CODE markierten Bereichen erfolgen. Zum Testen greifen Sie auf das Programmfragment aus Listing 8 zurück: Sie fügen es in der main.c zwischen den Kommentaren USER CODE BEGIN WHILE und USER CODE END 3 ein, wo es die dortige Endlosschleife ersetzt.

Listing 8

 

/* USER CODE BEGIN 3 */
unsigned int delayInMilliSeconds;
while (1) {
  // Taster an PA0 auslesen
  delayInMilliSeconds=HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) ? 500 : 100;
  // PC8 (gruene LED) umschalten
  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8);
  HAL_Delay(delayInMilliSeconds);
}
/* USER CODE END 3 */

Im Test mussten wir noch die Einstellung für make korrigieren. Rufen Sie dazu das Kontextmenü des Projekts mit der rechten Maustaste im Project Explorer auf und wählen Sie den Eintrag Properties. Dort wechseln Sie in die Rubrik C/C++ Build und entfernen im Dialog den Haken bei use default build command. Tragen Sie danach bei build command entweder den Pfad zum Make-Programm ein (Windows) oder einfach nur make.

Übersetzen Sie nun das Programm, indem Sie auf das Hammer-Symbol klicken oder Project | Build All aufrufen, und markieren Sie das Projekt im Project Explorer erneut. Wählen Sie aus dem Menü den Punkt Run | Debug Configurations. Im daraufhin erscheinenden Dialog markieren Sie in der Liste links GDB OpenOCD debugging. Nun erzeugen Sie mit einem Klick auf das Symbol New eine neue Konfiguration.

Wählen Sie rechts den Reiter Debugger und geben Sie unter Config options: die Parameter ein, die Sie in OpenOCD beim Test angegeben haben (Abbildung 4). Achten Sie auch darauf, dass im GDB client Setup unter Executable: der korrekte GDB-Aufruf erscheint. Bestätigen Sie den Dialog mit Debug, dann wechselt Eclipse in die Debug-Perspektive und wartet mit der Ausführung des Programms bei HALInit().

Abbildung 4: Über den Debugger erhalten Sie Informationen zum Ablauf des Programms.

Abbildung 4: Über den Debugger erhalten Sie Informationen zum Ablauf des Programms.

Das Programm lässt sich nun Schritt für Schritt ausführen. Sobald die Ausführung die bedingte Zuweisung der Variablen delayInMilliSeconds erreicht, halten Sie den Mauszeiger eine Weile über den Variablennamen. Im sich öffnenden Kontextmenü sehen Sie dann unter anderem den aktuellen Wert der Variablen.

Lassen Sie das Programm nun mit dem grünen Rechtspfeil in der Werkzeugleiste frei laufen und betätigen Sie den (beim Discovery-Board blauen) Taster an PA0. Die Blinkfrequenz sollte sich daraufhin verlangsamen. Die im Programm verwendeten HAL-Bibliotheksfunktionen erklärt die API-Dokumentation der HAL-Bibliothek [9].

Komplexere Programme

Im nächsten Schritt sollten Sie ein komplexeres Beispiel mit A/D-Wandlung und Ausgabe auf der seriellen Schnittstelle evaluieren. Hilfe beim Ansteuern der seriellen Schnittstelle liefert dabei das STM32F0-UART-Tutorial [10] sowie eine Anleitung zum STM32-ADC [11]. Informationen zum Nutzen des A/D-Wandlers finden Sie im VisualGDB-Tutorium zum UART [12].

Zunächst gilt es, die Brücke zwischen den HAL-Funktionen zum Steuern der seriellen Schnittstelle – hier im einfachen Polling-Modus – und der C-Standardbibliothek zu schlagen. Für Ein- und Ausgabe von Zeichen müssen Sie dazu entsprechend dem VisualGDB-Tutorial zu A/D zumindest die Funktionen _read und _write implementieren.

Fügen Sie dazu den Quelltext aus Listing 9 im entsprechenden Kommentarbereich ein. Danach übernehmen Sie das eigentliche Programm entsprechend Listing 10. Es fragt mit einfachem Polling einen A/D-Wandlerwert ab und gibt diesen (zusammen mit der Durchlaufnummer) direkt in einen Spannungswert konvertiert aus.

Zum Testen dieses Programms muss die serielle Schnittstelle wenigstens mit Masse und dem RxD-Anschluss an PA9 angeschlossen sein. Starten Sie ein Terminalprogramm und stellen Sie die konfigurierte Baudrate ein. Zur Variation der Eingangsspannung des A/D-Wandlers verbinden Sie beispielsweise ein Potenziometer mit dem Mittenabgriff mit PA1; dabei müssen Sie allerdings darauf achten, dass dieses nur 3,3 V und Masse verbindet.

Listing 9

 

/* USER CODE BEGIN PFP */
/* Private function prototypes -------------------------------*/
int _write(int file, char *ptr, int len) {
  if(HAL_UART_Transmit(&huart1,(uint8_t *) ptr,len,1000)==HAL_OK) {
    return len;
  }
  else {
    return -1;
  }
}
int _read(int file, char *ptr, int len) {
  if(HAL_UART_Receive_IT(&huart1,(uint8_t *) ptr,len)==HAL_OK) {
    return len;
  }
  else {
    return -1;
  }
}
/* USER CODE END PFP */

Listing 10

 

/* USER CODE BEGIN 3 */
unsigned int zaehler=0;
const unsigned int Nbit=12;
unsigned int quantIndex;
unsigned int spannungInMilliVolt;
if(HAL_ADC_Start(&hadc1) != HAL_OK) {
  puts("ADC: Initialisierungsfehler!");
  while(1) {}
}
while (1) {
  if(HAL_ADC_PollForConversion(&hadc1,100000) != HAL_OK) {
    puts("ADC: Konvertierungsfehler!\r\n");
  }
  else {
    quantIndex=HAL_ADC_GetValue(&hadc1);
    spannungInMilliVolt=(quantIndex*3300) >> Nbit;
    printf("Durchlauf %u: Index %u -> %d.%03d V\r\n", ++zaehler, quantIndex, spannungInMilliVolt / 1000, spannungInMilliVolt % 1000);
  }
}
/* USER CODE END 3 */

Ausblick

Mit diesem Artikel haben Sie einen ersten Einblick in die faszinierende Welt der STM32-Mikrocontroller erhalten. Haben wir damit Ihr Interesse an diesem Feld geweckt, dann können Sie Ihre Studien anhand der genannten Beispiele und Dokumentationen fortsetzen. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 7 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben