STM32 Anleitungen

Hinweise zur STM32 Cube IDE

Als Ergänzung zu meiner STM32 Anleitung gebe ich hier Tipps zum Umgang mit der "STM32 Cube IDE". Das ist eine Entwicklungsumgebung für STM32 Mikrocontroller.

ST kaufte das Atollic TrueStudio auf, reduzierte es auf STM32 Controller und machte daraus dann die Cube IDE, indem Funktionen von CubeMX integriert wurden. Wer das Atollic Truestudio bereits kennt, wird sich daher in der Cube IDE sofort zurecht finden.

So sieht ein neues 'leeres' Projekt aus

Download: STM32 Cube IDE

Die Cube IDE kann Projekte von der System Workbench importieren, umgekehrt geht es nicht.

Hinweise für Linux

Bei Linux wird das Paket libncurses5 benötigt. Wenn man ein neues Projekt startet und der Dialog "Target Selection" komplett leer bleibt, muss man die IDE mit folgendem Befehl starten: /usr/bin/env GDK_BACKEND=x11 ./stm32cubeide

Projekt erzeugen

Ich empfehle für den Anfang ohne Cube HAL (nur mit den CMSIS Headern) zu arbeiten. Das geht so:

Programm übertragen

Klicke mit der rechten Maustaste auf den Projektnamen, dann auf "Run as..." und dann auf "STM32 Cortex-M C/C++ Application". Änderungen am Programm werden ggf. automatisch auf den Mikrocontroller übertragen. Dabei verwendet die IDE die gleichen Verbindungsoptionen, wie beim Debuggen.

Bei Verbindungsproblemen kann es hilfreich sein, den Bootloader mittels Boot0=High und Reset-Impuls zu starten, da dieser auch die SWJ Schnittstelle eingeschaltet lässt.

Verbindungsoptionen

Die Cube IDE unterstützt folgende Optionen zum Verbindungsaufbau:

Modus Beschreibung Einschränkung
Connect Under Reset (Vorgabe) Der Programmieradapter löst einen Hardware-Reset aus und verbindet sich während dessen. Wenn die NRST Leitung nicht verbunden ist, muss man manuell den Reset Knopf gedrückt halten und beim Verbinden loslassen.
Software System Reset Über die SWJ Schnittstelle wird ein Reset-Kommando abgesetzt, danach verbindet er sich. Funktioniert nicht, wenn das Programm die SWJ Schnittstelle deaktiviert hat oder in einen Schlafmodus gegangen ist.
Hardware Reset Der Programmieradapter löst einen Hardware-Reset aus, danach verbindet er sich. Benötigt eine Reset-Leitung zwischen Programmieradapter und dem NRST Pin des Mikrocontrollers. Funktioniert nicht, wenn das Programm direkt nach dem Start in einen Schlafmodus geht oder die SWJ Schnittstelle deaktiviert.
Core Reset Über die SWJ Schnittstelle wird ein Reset-Kommando nur an den ARM Kern (nicht an die Peripherie) abgesetzt. Danach verbindet er sich. Funktioniert nicht, wenn das Programm die SWJ Schnittstelle deaktiviert hat oder in einen Schlafmodus gegangen ist.
None Der Debugger verbindet sich ohne Reset mit dem laufenden Programm. Setzt voraus, dass auf dem Mikrocontroller bereits genau das Programm läuft, das gerade im Editor geöffnet ist. Funktioniert nicht, wenn das Programm die SWJ Schnittstelle deaktiviert hat oder in einen Schlafmodus gegangen ist.

Zum Ändern, klicke mit der rechten Maustaste auf den kleinen Pfeil neben dem grünen Käfer, dann auf "Debug Configurations...". Gehe in dem folgenden Dialog in den Debugger Tab, wo du die Einstellung ändern kannst:

Wenn du stattdesen den alternativen "OpenOCD" verwendest, kannst du die Einstellung im Abschnitt "Configuration Script" vornehmen. Klicke dort auf die Schaltfäche "Show generator options".

Debuggen

Klicke mit der rechten Maustaste auf den Projektnamen, dann auf "Debug as..." und dann auf "STM32 Cortex-M C/C++ Application". Auch hier werden Änderungen am Programm ggf. automatisch auf den Mikrocontroller übertragen.

Die Verbindungsoptionen kannst du wie oben beschrieben einstellen. Der Debugger hält das Programm am Anfang der main() Funktion an. Danach kannst du es über Schaltflächen und Funktionstasten fortsetzen. Am linken Rand des Texteditors (vor den Zeilennummern) kannst du Unterbrechungspunkte setzen.

Trace Meldungen ausgeben

Alle ARM Controller ab Cortex M3 aufwärts können Trace Meldungen (ITM, Instrumentation Trace Messages) auf der SWO Leitung ausgeben.

mit GDB

Die Cube IDE kann diese Meldungen bei Verwendung des ST-Link GDB Servers oder Segger J-Link folgendermaßen anzeigen:

Neben dem grünen Käfer ist ein kleiner Pfeil, der nach unten Zeigt. Klicke darauf und dann auf "Debug Configurations...". Aktiviere im Debugger Tab die rot markierte Option und stelle die Taktfrequenz des Mikrocontrollers ein:

Nun starte den Debugger durch Klick auf den grünen Käfer. Das Programm pausiert zunächst ganz am Anfang der main() Funktion. Jetzt gehe in das Menü Window/Show View/Other... und wähle "SWV ITM Data Console". Dieses Fenster ist zunächst leer. Klicke in der rechten oberen Ecke des Fensters auf das Werkzeug-Symbol.

Schalte im nächsten Dialog den "ITM Stimulus Port" Nummer 0 ein.

Direkt neben dem Werkzeug-Symbol ist ein roter Punkt mit der Beschriftung "Start Trace". Klicke darauf. Danach klicke am oberen Rand der IDE auf den Resume-Knopf.

Nun sollten in dem "SWV ITM Data Console" Fenster alle Trace Meldungen erscheinen, die das Programm auf dem Mikrocontroller erzeugt.

mit OpenOCD

Klicke mit der rechten Maustaste auf den kleinen Pfeil neben dem grünen Käfer, dann auf "Debug Configurations...". Wähle im Debugger Tab den ST-Link OpenOCD aus, und darunter die Option User defined configuration script.

Nun öffne dieses "Configuration Script" im Texteditor und hänge ganz unten zwei Zeilen an:

tpiu config internal /tmp/debug.txt uart off 8000000
itm port 0 on
Die Zahl 8000000 muss der CPU Taktfrequenz entsprechen.

Bei der nächsten debug Sitzung werden die Trace Meldungen dann in die Datei /tmp/debug.txt geschrieben. Zur fortlaufenden Anzeige benutze ich unter Windows den Befehl tail -f debug.txt in einem CygWin Fenster:

Die Datei enthält zwischen den Buchstaben nicht darstellbare Steuerzeichen. Falls tail diese unerwünscht anzeigt, kann man sie so heraus filtern: tail -f debug.txt | tr -dc '[:print:]\n'

Man kann die Schnittstelle auch so konfigurieren, dass sie die Meldungen im gleichen Format ausgibt, wie ein normaler serieller Port:

monitor tpiu config external uart off 8000000 2000000
itm port 0 on

Die Zahl 8000000 muss der CPU Taktfrequenz entsprechen, die Zahl 2000000 ist die serielle Baudrate - maximal 1/4 des CPU Taktes. Nun kann man die Ausgabe mit einem gewöhnlichen USB-UART Adapter empfangen.

mit ST-Link Utility

Außerhalb einer Debugger-Sitzung kann man das ST-Link Utility zur Anzeige benutzen, und zwar über dem Menüpunkt ST-LINK/Printf via SWO Viewer. Stelle die richtige Taktfrequenz ein und klicke dann auf Start.