Inhaltsverzeichnis

Werbung
Inhaltsverzeichnis
1. Mikrocontroller Einführung
1.1. Einige Grundbegriffe . . . . . . . .
1.1.1. Programmiersprachen . . . .
1.1.2. Programmer . . . . . . . . .
1.1.3. PIN . . . . . . . . . . . . .
1.1.4. PORT . . . . . . . . . . . .
1.1.5. HIGH und LOW . . . . . .
1.2. PIN-Funktionen . . . . . . . . . . .
1.2.1. GPIO . . . . . . . . . . . .
1.2.2. Andere PIN-Funktionen . .
1.3. STM32F0Discovery-Board . . . . .
1.3.1. Programmer und Debugger
1.3.2. Zwei LEDs und Taster . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
3
3
4
4
4
4
4
5
5
5
5
2. CubeMX
2.1. PIN-Konfiguration für das STM32f0Discovery-Board
2.2. HAL, API, IP . . . . . . . . . . . . . . . . . . . . . .
2.2.1. Hardware Abstraction Layer (HAL) . . . . . .
2.2.2. Application Programmer Interface (API) . . .
2.2.3. Intellectual Propriety (IP) . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
8
8
8
9
.
.
.
.
.
.
.
.
.
.
10
10
10
10
10
10
10
11
11
11
11
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3. Eclipse
3.1. Eclipse Starten . . . . . . . . . . . . . . . . . . . . . . .
3.1.1. Beim erstem Mal einen neuen Workspace wählen!
3.2. Projekt(e) importieren . . . . . . . . . . . . . . . . . . .
3.2.1. Nach dem Import empfielt sich ein Index refresh“
”
3.3. Mit dem ersten Projekt das ganze mal durchtesten . . .
3.3.1. Ersmal Compilieren . . . . . . . . . . . . . . . . .
3.3.2. Dann einmalg das Debugging konfigurieren . . . .
3.3.3. Auf den Käfer (Bug) klicken . . . . . . . . . . . .
3.4. In die C++ Perspektive wechseln . . . . . . . . . . . . .
3.4.1. Tipp: Benutze Command Completion . . . . . . .
. . . .
. . . .
. . . .
. . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4. HAL mit C benutzen
12
4.1. Mit main.c gehts los . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.1.1. CubeMX Kommentare beachten . . . . . . . . . . . . . . . . . . . 12
4.1.2. Die Endlos while -Schleife . . . . . . . . . . . . . . . . . . . . . . 12
1
Inhaltsverzeichnis
4.2. HAL und GPIO . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.1. Millisekunden delay . . . . . . . . . . . . . . . . . . .
4.2.2. Output Pin auf HIGH setzen . . . . . . . . . . . . .
4.2.3. Output Pin auf LOW zurücksetzen . . . . . . . . . .
4.2.4. Output Pin toggeln . . . . . . . . . . . . . . . . . . .
4.2.5. Input Pin auslesen . . . . . . . . . . . . . . . . . . .
4.2.6. Polling . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3. Zwischendurch ein bischen C . . . . . . . . . . . . . . . . . .
4.3.1. Integer Variablen deklarieren und initialisieren . . . .
4.3.2. Inkrementierung einer Variable mit dem ++ -Operator
4.3.3. Eine einfache Verzweigung . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
12
12
12
12
12
12
13
13
13
13
14
5. External Interrupts
15
5.1. Better than Polling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.1.1. Beispiel: Elektronischer Compass mit Pulsdauer basierter Datenübermittlung
(PWM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.1.2. Interrupts mit dem Taster auslösen . . . . . . . . . . . . . . . . . 15
5.1.3. Synchrones Blinken von zwei Boards . . . . . . . . . . . . . . . . 15
A. Hinweise zur Installation der Tool-Chain
16
A.0.1. Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2
1. Mikrocontroller Einführung
1.1. Einige Grundbegriffe
1.1.1. Programmiersprachen
Assembler
Ein Prozessor hat einen sogenannten Befehlssatz. Eine Assembler-Programmiersprache
ist eine Sprache, die für einen bestimmten Befehlssatz eines bestimmten Prozessors vorgesehen ist. Ein Assembler-Programmierer erstellt dann ein Programm, indem er jeden
Schritt, den der Prozessor ausführen soll in seinem Programm vorgibt. Das erfordert
sehr viel Spezialwissen. Das ist nichts für uns!
Die Hochsprache C und das Compilieren
Mit einer Hochsprache, wie der Programmiersprache C wird ein Programm in einer
spracheigenen Syntax erstellt (sogenannter Quellcode). Ein Übersetzer (Compiler) sorgt
dann dafür, dass ein solches Programm in die Befehle für einen bestimmten Prozessor
umgesetzt werden.
Bevor ein C-Programm ausgeführt werden kann, muss es also erst einmal compiliert
werden. Dabei entsteht aus der Quellcode-Datei eine neue Datei. Für unseren STM32Mikrocontroller ist das eine Datei im sogenannten ELF-Format (Execute-and LinkableFormat) mit der Dateieindung .elf“ bzw. eine Datei mit der Dateiendung .bin“. Diese
”
”
Datei muss dann in den Flash-Speicher des Mikrocontrollers transferiert werden.
1.1.2. Programmer
Zum Übertragen einer compilierten Programm-Datei auf den Mikrocontroller braucht
man einerseits einen Programmer– auf dem STM32F0Discovery-Board ist bereits ein
solcher Programmer integriert– und ein Programm, das die Datei mit Hilfe des Programmers auf den Microcontroller überträgt. Verwendet man die Stm32-Workbench, so
verwendet diese hierfür den sogenannten ODC-Debugger. Es gibt aber auch ein kleines
Tool mit dem Namen st-flash“, mit dem man ein Programm vom Entwicklungs-PC auf
”
den Mikrocontroller übertragen kann.
Mikrocontroller
Als Mikrocontroller (auch µController, µC, Microcontroller Unit (MCU)) werden Halbleiterchips bezeichnet, die neben einem Prozessor zugleich auch noch Peripherieeinhei-
3
1. Mikrocontroller Einführung
ten enthalten. In vielen Fällen befindet sich auch der Arbeits- und Programmspeicher teilweise oder komplett auf demselben Chip. Ein Mikrocontroller ist ein Ein-ChipComputersystem. Für manche Mikrocontroller wird deshalb auch der Begriff Systemon-a-Chip oder (SoC) verwendet.
Mikrocontroller werden von verschiedenen Chip-Hersteller angeboten und in unterschiedlichen Größen hergestellt. Dies sind z.B. PIC-Controller, AVR-Controller, STM32Controller.
1.1.3. PIN
PINs sind im Prinzip die meisten Füßchen“ eines MCU-Chips. Diese Füßchen können
”
durch unterschiedliche Konfigurationen verschiedene Funktionen übernehmen. Andere
Füßchen“ sind z.B. für die Stromversorgung des Chips vorgesehen.
”
1.1.4. PORT
Die Konfiguration der PINS geschieht über sogenannte Konfiguratiosregister. Dafür werden mehrere PINS in einer Gruppe zu einem sogenannten PORT zusammengefasst.
Die Pins werden mit Zahlen durchnummeriert, Die PORTs mit Großbuchstaben.
So bezeichnet z.B.
P C9
den PIN 9 am PORT C.
1.1.5. HIGH und LOW
Die digitale Welt basiert an ganz vielen Stellen darauf, dass an einem PIN eine Spannung
mit einem vorgeschriebenen Spannungswert anliegt (HIGH) oder dass diese Spannung
nicht an diesem PIN anliegt (LOW).
1.2. PIN-Funktionen
1.2.1. GPIO
GPIO steht für General Purpose Input and Output“. Alle PINS des STM32 lassen sich
”
mit dieser Funkionalität versehen. D.h. der PIN kann dann z.B. einen digitalen Wert
(HIGH oder LOW) einlesen (Input) oder einen digitalen Wert ausgeben (Output).
Ein als Output konfigurierter PIN ist dann so etwas wie der Pluspol einer kleinen
Stromquelle. Wenn man mit dieser Stromquelle“ etwas betreiben will, wie z.B. eine
”
LED, dann muss man aufpassen, dass man diese Stromquelle“ nicht überlastet.
”
4
1. Mikrocontroller Einführung
1.2.2. Andere PIN-Funktionen
Für die einzelen PINS git es darüber hinaus noch viele weitere Konfigurationsmöglichkeiten,
wie z.B. die Wandlung von Spannungen in Zahlenwerte, die sogenannte Analog-DigitalWandlung, kurz ADC von engl. analog to digital converter.
1.3. STM32F0Discovery-Board
Ein Discovery-Board ist eine Platine auf der ein Mikrocontroller mit weiteren externen
Komponenten versehen ist und das die Möglichkeit gibt, relativ leicht etwas an einzelnen
PINs anzuschließen. Dadurch lassen sich relativ schnell einfacher Prototypen herstellen.
1.3.1. Programmer und Debugger
Im Falle unseres STM32F0Discovery-Boards ist das ein sogenannter ST-Link Program”
mer und Debugger“. Mit diesem Programmer kann ein Programm in den Programmspeicher des Mikrocontrollers geladen werden. Mit dem Debugger kann die Ausführung
des Programmes auf dem Mikrocontroller schrittweise durchgeführt werden, Das kann
sehr hilfreich sein, um Fehler in einem Programm zu finden.
1.3.2. Zwei LEDs und Taster
Für uns verwendbar sind neben zwei LEDs (grün und blau) noch der blaue Taster.
Mit dem schwarzen Taster kann das Programm auf dem Mikrocontroller neu gestartet
werden (RESET).
Wie die beiden LEDs und der Taster an den MCU-PINS angeschlossen sind, ist im
folgenden Schaltplan-Ausschnitt dargestellt.
Aufgabe 1:
1A: Welche Bezeichnung hat der PIN, an dem die blaue LED angeschlossen ist.
5
1. Mikrocontroller Einführung
1B: Welche Bezeichnung hat der PIN, an dem der Taster angeschlossen ist.
1C: An welchem Port ist die grüne LED angeschlossen?
1D: An welchem PIN ist die grüne LED angeschlossen?
Aufgabe 2:
Welche LED leuchtet,wenn PIN P C9 auf HIGH und der PIN P C8 auf LOW gesetzt
ist?
Aufgabe 3:
Muss man den Taster drücken oder loslassen, damit am PIN P A0 ein LOW-Siganl
anliegt?
Aufgabe 4:
Welche der PINs P C8, P C9 und P A0 sind als Ausgänge (OUTPUT), welche als Eingänge
(INPUT) zu konfigurieren, damit über diese PINS die LEDs und der Taster verwendet
werden können?
6
2. CubeMX
CubeMX ist eine Tool der Fa. ST-Micro mit dem die Funktion/Aufgabe der einzelnen
PINs konfiguriert werden kann. Aus dieser Konfiguration wird dann automatisch Quellcode und ein Projekt für eine bestimmte Entwicklungsumgebung generiert. CubeMX
unterstütz dabei mehrere Entwicklungsumgebungen und seit kurzem auch die Entwicklung mit der freien Entwicklungsumgebung Eclipse.
Eine Entwicklungsumgebung ist ein Programm, dass mehrere Aufgaben, die ein SoftwareEntwickler immer wieder machen muss, durch eine komfortablen Benutzeroberfläche erleichtert.
2.1. PIN-Konfiguration für das
STM32f0Discovery-Board
Aufgabe 1:
Die grünen PINs sind die konfigurierten PINs. Die Konfiguration von P A0,P C8 und
P C9 sollte Dir hoffentlich klar sein. Wozu dient aber wohl die Konfiguration der PINs
P A13 und P A14?
7
2. CubeMX
2.2. HAL, API, IP
2.2.1. Hardware Abstraction Layer (HAL)
Die Software die durch den CubeMX-Pinkonfigurator generiert wird, bildet eine sogenannte Abstraktions Schicht (Hardware Abstraction Layer). Durch diese Abstarktionsschicht erhält man einen einigermaßen einheitlichen Zugriff für unterschiedliche MCUs
einer Familie.
2.2.2. Application Programmer Interface (API)
Dieser einheitliche Zugriff wird über eine Software-Bibliothek realisiert, die sogenannte
Funktionen zur Verfügung stellt. Der Aufruf einer solchen Funktion im Programm bewirkt dann, dass die MCU das macht, was die Entwicker des HAL für diese Funktion
vorgesehen haben.
Beispiel: Um die LED am PIN P C9 einzuschalten, um also den PIN P C9 auf HIGH
zu setzen, muss die folgende Funktion aufgerufen werden:
1
HAL_GPIO_WritePin ( GPIOC , GPIO_PIN_9 , GPIO_PIN_SET ) ;
Man könnte die Namensgebung für diesen Funktionsaufruf vielleicht so untergliedern:
HAL
es handelt sich um eine Funktion des Hardware Abstraction Layers,
GPIO
die auf einen als General Purpose Input and Output“ konfigurierten PIN einwir”
ken soll.
WritePin
An diesem Pin soll ein Signal verändert werden.
GPIOC
Es ist der PIN des der zum PORT C gehört.
GPIO PIN 9
Es ist der PIN mit der Nummer 9.
GPIO PIN SET
Der PIN soll gesetzt werden, damit ist gemeint er soll HIGH gesetzt werden.
Alle diese Bibliotheks-Funktionen, die einem Programmierer den Zugriff auf die Hardware vereinfachen, nennt man oft auch API (Application Programmer Interface, also
eine Schnittstelle für Programmierer von Anwendungen)
8
2. CubeMX
2.2.3. Intellectual Propriety (IP)
Um das geistige Eigentum der Entwickler des HAL zu schützen, gibt es von STM Vorkehrungen verschiedene Code-Module für den Anwendungsentwickler zu verbergen. D.h
das HAL besteht z.T. aus unsichtbaren IP-Code-Modulen.
9
3. Eclipse
Eclipse ist eine vielseitig einsetzbare Entwicklungsumgebung, die unter der Programmiersprache java entwickelt wurde und die über Plugins vielseitig konfiguriert werden
kann. Das Eclipse, das wir für die STM32-Programmierung verwenden ist mit einem
Plugin für die STM32-Programmierung versehen.
Auf den Laptops gibt es zweierlei Eclipse-Versionen. Achte darauf die Richtige zu starten!
∆!
3.1. Eclipse Starten
Im Homeverzeichnis ist der Ordner STM32Course , indem sich der Ordner eclipse
befindet.
Im eclipse Ordner die ausführbare Datei eclipse anklicken!
3.1.1. Beim erstem Mal einen neuen Workspace wählen!
Sollte bereits erledigt sein, falls Eclipse nach dem Workspace fragt, bitte melden
∆!
3.2. Projekt(e) importieren
Sollte bereits erledigt sein, falls in Eclipse die vier Projekte fehlen, dann bitte melden!
∆!
3.2.1. Nach dem Import empfielt sich ein Index refresh“
”
Mir rechts auf den Projektordner klicken, im Kontextmenü Index → Rebuild auswählen
3.3. Mit dem ersten Projekt das ganze mal durchtesten
3.3.1. Ersmal Compilieren
✞
Das geht mit dem Hammer-Symbol oder mit dem Shortcut
Strg
✝
Aber zuvor immer erst den gewünschten Projektordner anklicken
10
☎✞
☎
B ✆
✆✝
∆!
3. Eclipse
3.3.2. Dann einmalg das Debugging konfigurieren
Auch hierfür immer erst den gewünschten Projektordner anklicken! Dann den Debug
Konfigurationsdialog öffnen und
∆!
Nach der compilierten Datei im ELF-Format browsen“
”
Diese befindet sich ein wenig versteckt im Debug Ordner des Projektes
Für das erste Projekt sollte das bereits passiert sein. Den Debug Konfigurationsdialog
schließen. Für ein erneutes Debugging
∆!
3.3.3. Auf den Käfer (Bug) klicken
Das Discovery Board muss über das USB-Kabel mit dem PC verbunden sein! Mit dem
Start des Debug-Vorganges wird das Projekt compiliert, dann wird die compilierte Datei
auf den Mikricontroller übertragen. Zur Ausführung muss dann noch das kleine grüne
Dreieck angeklickt werden
Zur anschließenden Programmierung
3.4. In die C++ Perspektive wechseln
Beim Programmieren kannst du mit dem folgenden Tipp viele Schreib- und Tippfehler
vermeiden!
3.4.1. Tipp: Benutze Command Completion
✞
☎✞
✝
✆
☎
Nach
Änderungen
am Programm geht es wieder mit 3.3.3 los.
Strg
Leertaste
✝
✆
11
∆!
4. HAL mit C benutzen
4.1. Mit main.c gehts los
4.1.1. CubeMX Kommentare beachten
4.1.2. Die Endlos while -Schleife
4.2. HAL und GPIO
4.2.1. Millisekunden delay
1000 Millisekunden warten:
1
HAL_Delay ( 1 0 0 0 ) ;
4.2.2. Output Pin auf HIGH setzen
1
HAL_GPIO_WritePin ( GPIOC , GPIO_PIN_9 , GPIO_PIN_SET ) ;
4.2.3. Output Pin auf LOW zurücksetzen
1
HAL_GPIO_WritePin ( GPIOC , GPIO_PIN_9 , GPIO_PIN_RESET ) ;
4.2.4. Output Pin toggeln
1
HAL_GPIO_TogglePin ( GPIOC , GPIO_PIN_9 ) ;
4.2.5. Input Pin auslesen
12
4. HAL mit C benutzen
HAL_GPIO_ReadPin ( GPIOA , GPIO_PIN_0 )
1
Beispiel: LED Pin P C9 mit dem Wert des Taster Pins P A0 setzen:
1
2
3
4
5
HAL_GPIO_WritePin (
GPIOC ,
GPIO_PIN_9 ,
HAL_GPIO_ReadPin ( GPIOA , GPIO_PIN_0 )
);
4.2.6. Polling
Wird der Taster-PIN P A0 in der Endlos- while -Schleife ständig ausgelesen, um sofort
die LED mit einer Taster-Änderung umzuschalten, spricht man von sogenanntem Polling.
Aufgabe 1:
1A: Wieso ändert sich die LED beim folgenden Programm (nur die while -Schleife )
nicht gleich, wenn man den Taster-Zustand ändert?
1B: Was ist ein Nachteil des Pollings?
1
w h i l e ( 1 ) {}
2
HAL_GPIO_WritePin (
GPIOC ,
GPIO_PIN_9 ,
HAL_GPIO_ReadPin ( GPIOA , GPIO_PIN_0 )
);
HAL_Delay ( 1 4 0 0 ) ;
3
4
5
6
7
8
9
}
4.3. Zwischendurch ein bischen C
4.3.1. Integer Variablen deklarieren und initialisieren
1
i n t delay =0;
4.3.2. Inkrementierung einer Variable mit dem ++ -Operator
13
4. HAL mit C benutzen
1
++delay ;
4.3.3. Eine einfache Verzweigung
1
2
3
i f ( delay >20){
delay=0
}
14
5. External Interrupts
5.1. Better than Polling
5.1.1. Beispiel: Elektronischer Compass mit Pulsdauer basierter
Datenübermittlung (PWM)
Das elektronische Kompassmodul gibt am sogenennten PWM-PIN die gemessene Himmelsrichtung in Grad aus, indem für jedes Grad ein Signal für eine zehntel Millisekunde
auf HIGH gesetz wird. Anschließend wird das Signal wieder für eine bestimmte Zeit auf
LOW gesetz.
Beispiel für 279◦ ist das Signal 27,9 ms HIGH.
Wie lässt sich ermitteln, wann das Signal von HIGH auf LOW wechselt?
Benutze Externe Interrupts!
5.1.2. Interrupts mit dem Taster auslösen
5.1.3. Synchrones Blinken von zwei Boards
15
A. Hinweise zur Installation der
Tool-Chain
A.0.1. Linux
Workbench
sudo apt-get install lib32ncurses5-dev
sw-flash
udev rules
16
Herunterladen