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