Ein Stm32F1 Tutorial Part 1

Anleitung zum Thema STM32F1 einrichten auf einem Linux Rechner

Um einen Stm32F10x Microcontroller auf einem Linux-Rechner einzurichten benötigt es einiges an Konfiguration.

Hier versuche ich, diesen Weg zu einem funktionierenden Programm samt Debug-Möglichkeit zu zeigen.
Dafür setze ich ein aktuelles Ubuntu 13.10 und ein STM32VLDISCOVERY-Board von ST Microelectronics voraus.
Die Anleitung funktioniert mit etwas Abwandlung natürlich auch für jedes andere Linux-System und jedes andere STM32F10x-Board und dazugehörigem Programmer/Debugger (STlink)

Als Voraussetzung für dieses Tutorial sollte man Grundkenntnisse in der Programmierung mit C sowie mit Mikrocontrollern haben.
Es wird ein Compiler/Debugger benötigt ( arm-none-eabi ), ein Programm, um mit dem HW-Debugger zu kommunizieren und eine IDE.
Mit folgendem Befehl wird die benötigte Software installiert:

sudo add-apt-repository 'deb http://ppa.launchpad.net/terry.guo/gcc-arm-embedded/ubuntu raring main'
sudo apt-get update
sudo apt-get install libsgutils2-dev libusb-1.0-0-dev pkg-config gcc-arm-none-eabi git dh-autoreconf codeblocks cmake

Die Frage, ob man den GnuPG-Key des PPA’s importieren möchte, kann man mit [ENTER] akzeptieren.

Das Programm, um den HW-Debugger anzusprechen, muss man sich zur Zeit noch selbst kompilieren, was aber mit Hilfe des README’s denkbar einfach ist.

git clone git://github.com/texane/stlink.git
cd stlink
[sudo] ./autogen.sh
./configure
make
sudo make install
sudo cp 49-stlinkv*.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
#bei Bedarf
cd .. && rm -rf stlink

Mit „git clone“ wird das Repository heruntergeladen. Die 49-stlinkv*.rules werden benötigt, damit der HW-Debugger auch ohne Rootrechte benutzt werden kann.
Somit wäre schon mal der Debugger (HW & SW) und der Compiler installiert.

Als nächstes wird das Projekt aufgebaut. Ich selbst verwende mittlerweile CMake-Projekte, da ich Code für den STM32 im Team entwickle und das Handling mit CMake ( wenn es einmal eingerichtet ist …) einfacher ist, als mit Makefiles. Zudem kann CMake Projectfiles für diverse IDE’s erzeugen.
Um die Einrichtung und viele Fallstricke zu umgehen findet sich [hier] ein Beispielprojekt. Damit man versteht, wie der Projektordner aufgebaut ist, besteht das Beispielprojekt nur aus der minimalen Anzahl Dateien. Ebenso fehlen alle Dateien, welche von ST Microelectronics kommen. Dies hat allerdings zur Folge, dass einige unschöne Änderungen vorzunehmen sind, um das Projekt kompilierbar zu machen. Das Skeleton findet sich hier.

Zuerst legt man ein Projektverzeichnis an und entpackt dort das Skeleton des Beispielprojekts.

cd /YOUR/PROJECT/
wget http://blog.uniku.de/wp-content/uploads/2014/01/stm32F1_einführung_scratch.zip
unzip stm32F1_einführung_scratch.zip
rm stm32F1_einführung_scratch.zip

Nun kommt die „Standard Peripheral Library“ von STM ( STM32054 ) in der aktuellen Version 3.5.0 zum Einsatz. Diese ist für das Tutorial grundlegend nötig. Es gibt zwar noch andere, alternative (teilweise unvollständige) Bibliotheken für die STM32F1 – F4, auf die ich aber hier im Rahmen des Tutorial nicht eingehen werde.
Bis auf wenige Dateien braucht man nur den „Libraries“ Ordner. Der Rest kann getrost gelöscht werden. Das ganze geschieht in dem Projektordner „/YOUR/PROJECT“.

wget http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/stsw-stm32054.zip
unzip stsw-stm32054.zip
rm stsw-stm32054.zip
sudo chmod -vR u+rw STM32F10x_StdPeriph* #Fehlerhafte dateiberechtigungen

cd STM32F10x_StdPeriph*     #goto SPL-folder
mv Libraries/ ../Libraries            #in den ordner drüber verschieben
cp Project/STM32F10x_StdPeriph_Template/stm32f10x* ./../src/Board/
cp Project/STM32F10x_StdPeriph_Template/TrueSTUDIO/STM32100B-EVAL/stm32_flash.ld ./../Link
cd ..
cp Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h src/Board/
cp Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.* src/Board/
rm -rf STM32F10x_StdPeriph*

Die verschiedenen copy-Befehle werden benötigt um Dateien an die richtige Position zu verschieben/kopieren.
Nun kommt der ungemütliche Teil:

In Zeile 1217-1229 der Datei „Libraries/CMSIS/CM3/CoreSupport/core_cm3.h“ bei den InlineFunktionen muss „()“ mit „(void)“ ersetzt werden. Der Grund blieb mir bisher verborgen.
(Eventuell gibt es noch in den Zeilen 87-100 so etwas wie „static __INLINE“ . Diese sollte man auch löschen. In den neueren Version der Library sind diese aber nicht mehr enthalten.)

Die Header-Datei src/Board/stm32f10x.h muss ebenso angepasst werden.
Unter den Zeilen mit dem Inhalt :
„#ifndef __STM32F10x_H
#define __STM32F10x_H“
muss die Zeile „#define assert_param(expr) ((void)0)“ hinzugefügt werden. Damit wird vermieden, dass bei einem assert (logischer Fehler), der Controller weiterläuft. Diese Maßnahme kann logischerweise zu Laufzeitfehlern führen.

Etwas weiter unten muss man den richtigen Controller auswählen, die Erklärung darunter hilft ungemein bei der Auswahl.
Getestet wurde alles mit der Einstellung „STM32F10X_MD_VL“ und einem STM32F100RB ( 128kB Flash 8Kb Ram max 72. MHz mit externem 8 MHz Quarz) welcher sich auf dem STM32VLDISCOVERY -Board von STM befindet.
Die Anpassungen des Projektes auf andere Microcontroller der STM32F10x-Reihe findet sich im 3. Teil dieses Tutorials.

Nun steht der finale Test an. Mit den Folgenden Befehlen sollte sich das Testprojekt fehlerfrei compilieren lassen.

cd build/
./build.sh

Am Ende sollten sich im debug-Ordner eine .elf, eine .hex und eine .bin -Datei befinden.
Jetzt ist ist das erste Programm compiliert.!
Zusätzlich findet sich noch eine .cbp-Datei. Diese dient dazu, das Projekt in Codeblocks zu öffnen. Damit funktioniert das Debuggen des Mikrocontrollers relativ komfortabel.
Weiter geht es im nächsten Teil mit der Verbindung zur Hardware und dem debuggen des Controllers.
Falls ein anderer Mikrocontroller zum Einsatz kommt, sollte man zuerst die Anpassungen, welche im 3. Teil beschrieben werden, machen.

Zum Programmieren mit den STM32F1xx Microcontroller bieten sich weiterführende Tutorials wie z.B. http://www.diller-technologies.de/stm32.html an.