Experimente mit STM32 BluePill und libopencm3

Heute habe ich an einem Resturlaubstag mal ein bisschen mit meiner STM32 BluePill experimentiert.

Leider hat es einiges länger gedauert, als ich dachte.

Zunächst habe ich mir aktuelle Versionen von OpenOCD und den freien ST-Link Tools gebaut und installiert. Das funktionierte auch ohne Probleme.

Die ST-Link Tools bringen sogar eine GUI mit GTK3 mit. Leider kann das Tool nur Binärdateien auslesen und programmieren, aber es ist immerhin etwas bedienerfreundlicher als die Kommandozeilenvariante.

Danach habe ich mal die libopencm3 compiliert. Das ging auch gut, aber es gibt leider keine Installationsoption. Also muss man in die Projekte das jeweilige Verzeichnis entsprechend reinverdrahten.

Ich habe auch die offiziellen Beispiele mal übersetzt. Zumindest das Systicker Blink, USB HID und USB COM Port Beispiel für STM32L1 habe ich mit meiner BluePill zum Laufen bekommen.

Danach habe ich mir die Infrastruktur für eigene Projekte bauen wollen und bin beinahe gescheitert. Aus einigen Quellen musste ich mir Teile zusammenklauen, aber ich kann jetzt über CMake entsprechende Projekte aufsetzen, die die libopencm3 benutzen.

Das ganze habe ich im Visual Studio Code aufgesetzt und wollte dann die Debugerweiterung für Cortex-M benutzen und bin wieder gescheitert.

Nach langem Puzzeln habe ich gemerkt, daß mein gdb zu alt ist. Dann musste ich mir erstmal eine aktuelle Version bootstrappen.
Kurzentschlossen wollte ich die offizielle ARM Toolchain installieren, aber das waren 0,5GB Download. Das war mir doch zu riesig, also habe ich einen offiziellen gdb runtergeladen und mit einer kleinen Anleitung auch gebaut.

Mit dieser gdb Version konnte ich dann aber tatsächlich debuggen und mit .svd File auch die Peripherieregister anschauen.

Gelernte Punkte habe ich gleich mal in einer Wissenssammlung aufgeschrieben. Die werde ich vermutlich zukünftig noch erweitern und ggfs ergänzen.

Eigentlich wollte ich noch ein Beispiel mit Segger RTT ausprobieren, bin aber nicht mehr soweit gekommen.

STM32 “Blue pill” mit SEGGER Embedded Studio

Ich wollte mal SEGGER Embedded Studio ausprobieren, nachdem ich im Büro schon mit meinen Kollegen darüber gesprochen hatte.
Unter Linux stellt diese IDE auf jeden Fall eine gute Möglichkeit dar, für STM32 basierte Controller Software zu entwickeln, z.B. die “Blue Pill”.

Bislang habe ich nackte Makefiles und Eclipse probiert. Letzteres ist langsam und das Debuggen war damit nicht so gut verwendbar.

Die SEGGER IDE lies sich leicht installieren, die Installation benötigt leider root Rechte mit sudo, zumindest für udev Konfiguration für einen J-Link.
Wenn man das optional weglassen könnte, wäre das von Vorteil.

Die IDE präsentiert sich mit QT Oberfläche und ist flott und responsiv.

Positives:

  • gute Reaktionszeit
  • Debugger kann Controllerregister inklusive Peripherie darstellen
  • Debugger unterstützt SEGGER J-Link sowie GDB basiertes Debuggen mit OpenOCD
  • Installation nach /opt oder dgl möglich
  • bringt Compiler und Linker mit
  • Projektkonfigurator für Baremetal Devices
  • Plugins und Herstelersupport für definierte Controller und Familien nachinstallierbar
  • Crossplattform

Negatives:

  • kein Import von Makefileprojekten
  • Sortierung der Fenster und Reiter ist etwas unübersichtlich

Insgesamt aber besser als Eclipse und eine händische Umgebung.

Um via ST-Link v2 mit OpenOCD zu debuggen, habe ich mein Projekt im SEGGER Embedded Studio dann wie folgt konfiguriert:

  • “Debug > Debugger” auf “GDB Server” einstellen
  • “Debug > GDB Server für OpenOCD konfiguriert wie im Screenshot

[OpenOCD Konfiguration für die STM32 Blue Pill im SEGGER Embedded Studio]
OpenOCD Konfiguration für die STM32 Blue Pill im SEGGER Embedded Studio
Dann started OpenOCD automatisch im Hintergrund und man kann debuggen.

Ich bin bislang nur auf ein Problem gestossen, wenn ich die STM32 HAL für die Blue Pill benutzen möchte. Wenn ich das komplette .a File dazulinke, wird leider auch das komplette File eingebunden. Der GNU Linker im Makefile nimmt nur die Teile die nötig sind, da muss ich noch rausfinden, wie ich das SEGGER Embedded Studio dazu bekomme, nur das zu linken, was benötigt wird.

STM32 HAL Library für die “Blue pill”

Seit einiger Zeit kann man die sogenannte “Blue Pill” kaufen. Dies sind Mikrocontroller aus der STM32 Familie mit Cortex Kern, konkret STM32F103C8 mit Cortex M3, die auf einem schönen klassischen DIL-Träger aufgelötet sind mit Pinheader und Micro-USB zur Stromversorgung ausgerüstet sind. Dadurch passt alles in ein Steckbrett und kann auch als Arduino betrieben werden.

Ich habe mir ein paar Exemplare beschafft und möchte diese natürlich mehr oder minder “bare metal” benutzen, ähnlich wie ich das im Beruf auch tue. Dort arbeite ich seit gut 7 Jahren ebenfalls mit STM32 Controllern.

ST Microelectronics stellt eine recht gute Bibliothek zum Ansprechen der Controllerperipherie zur Verfügung. Damit man diese nicht immer mit jedem noch so kleinen Projekt von Null auf übersetzen muss, habe ich mir mit CMake ein kleines Framework geschrieben, welches die Library für den konkreten Controller der “Blue Pill” als Binary übersetzt.

Ausprobiert habe ich die Library noch nicht, aber es baut und linkt. Eigentlich müsste das schon reichen, das .a File wird im neuen Projekt referenziert und der Includepfade zu der Headern der HAL Library mitangegeben.

Der Anwender muss ggfs. die STM32 Header für den Controller in seinem Projekt referenzieren, denn einige Headerfiles der HAL Library ziehen die controllerspezifischen Header nochmal rein.

Näheres und technische Updates gibt es auf der Projektablage bei Github:
https://github.com/simonsunnyboy/stm32hal_bluepill

Ich habe den heute aktuellen Stand der HAL Library eingebunden, speziell den vom CubeMX angelegten, STM32Cube_FW_F1_V1.8.0.