STM32: Erste Schritte mit SW4STM32 und der „Blue Pill“

Oder: Eine LED zum Blinken bringen in 78 einfachen Schritten

Wenn man so ziemlich alles mit einem Arduino gemacht hat, was man mit einem Arduino machen kann, sehnt man sich vielleicht nach etwas mehr Power oder anderen Funktionen. Bei der Suche wird man um Controller mit ARM-Prozessor nicht herumkommen. Weit vorne liegen dabei die STM32-Controller von ST.

Der Vorteil: Aus China bekommt man für extrem wenig Geld die benötigte Hardware. Ein Board mit dem STM32F103C8 kostet etwa 2€, ein Programmiergerät liegt bei etwa 1,50€. Der Programmer ist ST-Link V2 kompatibel und funktioniert damit problemlos mit allen offiziellen ST-Tools.

Technische Daten

  • STM32F103C8
  • ARM®32-bit Cortex®-M3 CPU Core mit bis zu 72MHz
  • 64Kbyte Flash
  • 20Kbyte SRAM
  • Ext. 4…16MHz Clock + 32kHz RTC
  • Int. Clock-Optionen inkl. PLL
  • 2 12bit ADCs mit insg. 16 Kanälen
  • 7 Timer ( 3x 16bit, 16bit Motor-PWM, 2x Watchdog, 1x 24bit Systick)
  • CAN, USB, I2C, UART, SPI,…

Für 2€ gibt es schon ordentlich bang for the buck und die Community und Software-Unterstützung ist auch gut.

Auf der „Blue Pill“ ist ein minimalistisches System mit den nötigsten Komponenten aufgebaut. Neben einem 8MHz Hauptquarz, einem 32.768kHz RTC-Quarz gibt es einen USB-Anschluss, einen Reset-Taster und BOOT-Jumper, auf die ich im nächsten Kapitel näher eingehen werde.

Hardware

Mit der Platine und dem Programmer ist die Hardware für den ersten Test eigentlich schon vollständig. Praktischerweise liegen bei den China-ST-Links auch gleich noch die Verbindungsleitungen zum Controller mit bei. Das schöne ist, dass das Programmierinterface, SWD (Serial Wire Debug) mit nur zwei Leitungen, SWCLK und SWDIO auskommt. Dazu dann noch GND und bei Bedarf 3.3V. Die Testschaltung ist also binnen weniger Sekunden zusammengesteckt und einsatzbereit.

BluePill mit STLink verbunden

Auffällig auf dem Board sind die beiden gelben Jumper über dem Reset-Taster. Hierbei handelt es sich um die beiden Pins BOOT0 und BOOT1. Mit den beiden Pins kann ausgewählt werden, von welchem Speicher der Controller nach einem Reset oder einem Wake-Up startet.

Wichtig ist der Main Flash Memory, in dem das User-Programm liegt. Mit dieser Boot-Option startet der Controller direkt mit dem normalen Programm.

Die Boot-Konfiguration für den System Memory, also den serienmäßigen Bootloader ist praktisch, wenn man bei der Software-Erstellung einen kleinen Fehler begangen hat. Mehr dazu später.

Benötigte Software

Mit der Hardware alleine ist es nicht getan. Als Entwicklungsumgebung nutze ich System Workbench for STM32 (SW4STM32) von ac6 Tools, welches auf Eclipse basiert.

[Screens SW]

Zusätzlich zur eigentlichen IDE bietet es sich an, die Projekte mit STM32CubeMX zu erstellen. Mit dieser Software von ST ist es möglich, den Controller komplett zu konfigurieren und einen HAL (Hardware Abstraction Layer) mit vordefinierten Funktionen einfügen. Der HAL ermöglicht es, die Hardware ohne Softwareänderungen anzupassen oder auszutauschen. Pin-Funktionen können zugewiesen werden, Kommunikationsschnittstellen, Timer und die Takterzeugung können grafisch konfiguriert werden, ohne, dass man den Quelltext selber anpassen muss. Dadurch lässt sich das Projekt sogar sehr leicht auf einen anderen Controller portieren. Dadurch sind Hard- und Software gewissermaßen voneinander getrennt, oder eben abstrahiert. CubeMX kann hier heruntergeladen werden.

Der Reiter für die Takterzeugung

Gerade die Optionen für die Takterzeugung sind komplex und vielseitig. Da möchte man definitiv nicht auf Fußpilzebene in den Konfigurationsregistern rumfummeln. Freundlicherweise erkennt CubeMX auch Probleme bei der Takterzeugung, wenn z.B. der Takt für die USB-Kommunikation nicht korrekt erzeugt werden kann, und schlägt Lösungen dafür vor.

Das erste Projekt

Die Hardware steht und CubeMX und SW4STM32 sind installiert? Dann kann es ja losgehen!

Zunächst starten wir CubeMX und erstellen ein neues Projekt, wählen unseren Controller, den STM32F103C8, aus und haben nun die Möglichkeit, die Hardware-Funktionen des Controllers zu konfigurieren. Insofern CubeMX nicht noch fehlende Pakete herunterladen und installieren möchte.

STM32CubeMX mit den grundlegenden Einstellungen für die BluePill

Einstellungen für die Blue Pill:

  • Unter RCC können für HS-Clock und LS-Clock jeweils die externen Quarze ausgewählt werden
  • Unter USB kann die USB-Device-Funktion aktiviert werden
  • Unter SYS muss „Serial Wire“ als Debug-Interface ausgewählt werden

Der letzte Punkt ist wichtig. Wählt man in in der Option keine Debug-Schnittstelle aus, so sind die beiden SWD-Pins, Clock und IO, als normale GPIOs geschaltet und nach dem Flashen über SWD ohne Debug-Interface kann über SWD kein weiteres Programm geladen werden, da die Pins zum Programmieren deaktiviert sind.

Sollte das einmal passieren, kommen der BOOT0- und der BOOT1-Jumper zum Einsatz. Mit BOOT0 auf 0 und BOOT1 auf 1 startet der Controller nach einem Reset mit dem seriellen Bootloader und wartet auf Daten über SWD. Nachdem man dann eine Firmware mit aktiviertem SWD geflasht hat, müssen beide Jumper wieder auf 0 gesetzt werden, damit unser Programm wie gewohnt startet.

Mit einem Rechtsklick auf einen Pin kann dieser als Ein- oder Ausgang definiert werden und es kann ein Name vergeben werden, mit dem im Quelltext dann der Pin einfach angesprochen werden kann.

[Bild Rechtsklickoptionen]

Nachdem alle Konfigurationen durchgeführt wurden, kann man mit einem Klick auf  der Code generiert werden. Im folgenden Fenster kann dann ein SW4STM32-Projekt daraus angelegt werden.

[Screen Export]

Debugger-Option zur Reset-Auswahl

[Zusammenfassung CubeMX]
[Source erzeugen, in SW4STM32 öffnen]
[Source]

1
2
3
4
5
</p>
<p>/* USER CODE BEGIN WHILE */<br />while (1)<br />{</p>
<p>/* USER CODE END WHILE */<br />HAL_GPIO_WritePin(ONBOARD_LED_GPIO_Port, ONBOARD_LED_Pin, GPIO_PIN_RESET);<br />HAL_Delay(100);<br />HAL_GPIO_WritePin(ONBOARD_LED_GPIO_Port, ONBOARD_LED_Pin, GPIO_PIN_SET);<br />HAL_Delay(500);<br />/* USER CODE BEGIN 3 */</p>
<p>}<br />/* USER CODE END 3 */</p>
<p>

 

Resourcen

https://wiki.stm32duino.com/index.php?title=Blue_Pill