Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
hallo_c [2019/02/04 14:10] – Externe Bearbeitung 127.0.0.1 | hallo_c [2019/07/25 15:45] (aktuell) – [Videozusammenfassung] huwi | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Hallo ARM C ====== | ====== Hallo ARM C ====== | ||
- | Die erste Übung in jedem Programmierkurs ist das berühmte „Hallo Welt“. Damit wird versucht, dem Lernenden ein motivierendes **„AHA-Erlebnis“** zu vermitteln. OK mal sehen, ob wir das auch hin bekommen. Bei der Programmierung von eingebetteten Systemen besteht oft das Problem, dass kein Bildschirm oder Display zur Textausgabe angeschlossen ist. Dann stehen für das "sich bemerkbar machen" | ||
+ | Die erste Übung in jedem Programmierkurs ist das berühmte „Hallo Welt“. Damit wird versucht, dem Lernenden ein motivierendes **„AHA-Erlebnis“** zu vermitteln. OK mal sehen, ob wir das auch hin bekommen. Bei der Programmierung von eingebetteten Systemen besteht oft das Problem, dass kein Bildschirm oder Display zur Textausgabe angeschlossen ist. Dann stehen für das "sich bemerkbar machen" | ||
===== Die Aufgabe ===== | ===== Die Aufgabe ===== | ||
+ | |||
Die erste Übung soll das typische LED einschalten sein. Dazu nutzen wir die blaue LED auf dem STM32F4 Discovery Board. Die blaue LED ist bereits fest mit dem Pin //PD15// verbunden. | Die erste Übung soll das typische LED einschalten sein. Dazu nutzen wir die blaue LED auf dem STM32F4 Discovery Board. Die blaue LED ist bereits fest mit dem Pin //PD15// verbunden. | ||
- | >>> | + | > |
Aus dem [[http:// | Aus dem [[http:// | ||
Die Aufgabe besteht also darin: | Die Aufgabe besteht also darin: | ||
+ | |||
- über den AHB1 Bus den GPIO Port D zu aktivieren, indem dieser mit einem Taktsignal versorgt wird | - über den AHB1 Bus den GPIO Port D zu aktivieren, indem dieser mit einem Taktsignal versorgt wird | ||
- das Bit 15 des GPIOD als Ausgang zu konfigurieren | - das Bit 15 des GPIOD als Ausgang zu konfigurieren | ||
Zeile 15: | Zeile 17: | ||
===== Vorbereitung ===== | ===== Vorbereitung ===== | ||
- | Falls das Tutorial-Projekt nicht mehr offen ist, öffnen Sie dies. Legen Sie bitte ein neues //kleines Programm// an und laden das // | ||
- | >>> | + | Falls das Tutorial-Projekt nicht mehr offen ist, öffnen Sie dies. Legen Sie bitte ein neues //kleines Programm// |
+ | |||
+ | > | ||
Erstellen Sie die Programmkopfdokumentation. Übersetzen und übertragen Sie das noch leere Programm auf den Controller, um die Verbindung zu testen. | Erstellen Sie die Programmkopfdokumentation. Übersetzen und übertragen Sie das noch leere Programm auf den Controller, um die Verbindung zu testen. | ||
- | >>><code c> | + | > |
+ | |||
+ | <code c> | ||
// | // | ||
// Titel : Beispiel Hallo Welt mit SiSy ARM | // Titel : Beispiel Hallo Welt mit SiSy ARM | ||
Zeile 40: | Zeile 45: | ||
Als Erstes diskutieren wir kurz die nötigen Lösungsschritte. Wie bereits ausgeführt, | Als Erstes diskutieren wir kurz die nötigen Lösungsschritte. Wie bereits ausgeführt, | ||
- | >>>{{:hilferccahb1gpiod.jpg? | + | > |
Die Funktion // | Die Funktion // | ||
- | >>>< | + | >< |
/* GPIOD Takt einschalten | /* GPIOD Takt einschalten | ||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, | ||
Zeile 59: | Zeile 64: | ||
Der Takt für Port D ist bereits aktiviert. Demzufolge ist als Nächstes die Initialisierungsstruktur anzulegen und mit Standardwerten zu füllen. Strukturen und Funktionen finden sich in der Hilfe im Abschnitt des jeweiligen Gerätes. Der entsprechende Quellcode für den GPIO Port D sieht wie folgt aus: | Der Takt für Port D ist bereits aktiviert. Demzufolge ist als Nächstes die Initialisierungsstruktur anzulegen und mit Standardwerten zu füllen. Strukturen und Funktionen finden sich in der Hilfe im Abschnitt des jeweiligen Gerätes. Der entsprechende Quellcode für den GPIO Port D sieht wie folgt aus: | ||
- | >>>< | + | >< |
GPIO_InitTypeDef | GPIO_InitTypeDef | ||
GPIO_StructInit (& | GPIO_StructInit (& | ||
Zeile 66: | Zeile 71: | ||
Nun müssen die anwendungsspezifischen Einstellungen angegeben werden. Das erfolgt durch Zuweisung der entsprechenden Werte zu den einzelnen Elementen der Initialisierungsstruktur. Die möglichen Strukturelemente und Werte sind wiederum der Hilfe entnehmbar. | Nun müssen die anwendungsspezifischen Einstellungen angegeben werden. Das erfolgt durch Zuweisung der entsprechenden Werte zu den einzelnen Elementen der Initialisierungsstruktur. Die möglichen Strukturelemente und Werte sind wiederum der Hilfe entnehmbar. | ||
- | >>> | + | < |
Bei den Werten für die Strukturelemente handelt es sich um Aufzählungen bzw. Bitdefinitionen, | Bei den Werten für die Strukturelemente handelt es sich um Aufzählungen bzw. Bitdefinitionen, | ||
Zeile 101: | Zeile 106: | ||
Für unsere LED ergibt sich, dass diese an Pin15 angeschlossen ist, dieser als Ausgang betrieben werden soll und keine PullUp oder PullDown benötigt werden. Der mögliche Quellcode sieht wie folgt aus: | Für unsere LED ergibt sich, dass diese an Pin15 angeschlossen ist, dieser als Ausgang betrieben werden soll und keine PullUp oder PullDown benötigt werden. Der mögliche Quellcode sieht wie folgt aus: | ||
- | >>>< | + | >< |
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; | ||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | ||
Zeile 111: | Zeile 116: | ||
Damit sind alle relevanten Einstellungen in der Initialisierungsstruktur vorbereitet. Jetzt kann die eigentliche Initialisierung erfolgen. Das geschieht mit der Funktion // | Damit sind alle relevanten Einstellungen in der Initialisierungsstruktur vorbereitet. Jetzt kann die eigentliche Initialisierung erfolgen. Das geschieht mit der Funktion // | ||
- | >>>< | + | >< |
GPIO_Init(GPIOD, | GPIO_Init(GPIOD, | ||
</ | </ | ||
Zeile 117: | Zeile 122: | ||
Für das An- oder Ausschalten von GPIO-Pins stehen die Funktionen // | Für das An- oder Ausschalten von GPIO-Pins stehen die Funktionen // | ||
- | >>>< | + | >< |
GPIO_SetBits(GPIOD, | GPIO_SetBits(GPIOD, | ||
</ | </ | ||
Zeile 126: | Zeile 131: | ||
Gewöhnen wir uns gleich daran einigermaßen systematisch vorzugehen. Bevor wir die Befehle in unseren Code wild hineinhacken, | Gewöhnen wir uns gleich daran einigermaßen systematisch vorzugehen. Bevor wir die Befehle in unseren Code wild hineinhacken, | ||
- | >>>< | + | >< |
// | // | ||
// Titel : Beispiel Hallo Welt mit SiSy STM32 | // Titel : Beispiel Hallo Welt mit SiSy STM32 | ||
Zeile 178: | Zeile 183: | ||
Nutzen Sie die Codevervollständigung des Editors. Die in den Treibern systematisch festgelegten Bezeichner folgen einem einfach einzuprägenden Muster: | Nutzen Sie die Codevervollständigung des Editors. Die in den Treibern systematisch festgelegten Bezeichner folgen einem einfach einzuprägenden Muster: | ||
- | >>>< | + | >< |
Gerät_TeilKomponente_Was | Gerät_TeilKomponente_Was | ||
</ | </ | ||
Zeile 184: | Zeile 189: | ||
Der Bezeichner beschreibt einen Pfad vom Allgemeinen (dem Gerät) zum Speziellen (z.B. einer konkreten Funktion oder einem Bit). Zum Beispiel finden Sie alle Funktionen zur //Reset and Clock Control Unit// unter *RCC_* . | Der Bezeichner beschreibt einen Pfad vom Allgemeinen (dem Gerät) zum Speziellen (z.B. einer konkreten Funktion oder einem Bit). Zum Beispiel finden Sie alle Funktionen zur //Reset and Clock Control Unit// unter *RCC_* . | ||
- | >>>{{:rcc_cs.jpg?400|}} | + | > |
Nach drei zusammenhängenden Buchstaben springt die Codevervollständigung an und listet alle Bezeichner fortlaufend gefiltert nach dem Stand der Eingabe. Wählen sie jetzt die Taste //CUD (Cursor/ | Nach drei zusammenhängenden Buchstaben springt die Codevervollständigung an und listet alle Bezeichner fortlaufend gefiltert nach dem Stand der Eingabe. Wählen sie jetzt die Taste //CUD (Cursor/ | ||
- | >>>< | + | >< |
Also dann, viel Erfolg bei den ersten // | Also dann, viel Erfolg bei den ersten // | ||
- | >>>< | + | >< |
// | // | ||
// Titel : Beispiel Hallo Welt mit SiSy STM32 | // Titel : Beispiel Hallo Welt mit SiSy STM32 | ||
Zeile 245: | Zeile 250: | ||
</ | </ | ||
+ | |||
===== Test ===== | ===== Test ===== | ||
- | Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers. | + | |
+ | Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers. | ||
- Kompilieren | - Kompilieren | ||
- Linken | - Linken | ||
- Brennen | - Brennen | ||
- | >>> | + | > |
- | Gratulation! Sie haben Ihre erste Ausgabe realisiert. Die blaue LED auf dem STM32F4 Discovery leuchtet jetzt. | + | Gratulation! Sie haben Ihre erste Ausgabe realisiert. Die blaue LED auf dem STM32F4 Discovery leuchtet jetzt. |
====== Videozusammenfassung ====== | ====== Videozusammenfassung ====== | ||
+ | |||
Fassen wir nochmal kurz zusammen, was es sich einzuprägen gilt: | Fassen wir nochmal kurz zusammen, was es sich einzuprägen gilt: | ||
**Initialisierungssequenz für Geräte:** | **Initialisierungssequenz für Geräte:** | ||
+ | |||
- Takt einschalten, | - Takt einschalten, | ||
- Initialisierungsstruktur anlegen, xxx_InitTypDef initStruct | - Initialisierungsstruktur anlegen, xxx_InitTypDef initStruct | ||
Zeile 266: | Zeile 276: | ||
- Gerät initialisieren, | - Gerät initialisieren, | ||
- | **Initialisierungsstruktur für Digitalports: | + | **Initialisierungsstruktur für Digitalports: |
- | * initStruct.GPIO_Pin = GPIO_Pin_0..15; | + | |
+ | * initStruct.GPIO_Pin = GPIO_Pin_0..15; | ||
* initStruct.GPIO_Mode = GPIO_Mode_OUT|IN|AF; | * initStruct.GPIO_Mode = GPIO_Mode_OUT|IN|AF; | ||
* initStruct.GPIO_OType = GPIO_OType_PP|OD; | * initStruct.GPIO_OType = GPIO_OType_PP|OD; | ||
Zeile 274: | Zeile 285: | ||
**wichtige Funktionen für Digitalports: | **wichtige Funktionen für Digitalports: | ||
+ | |||
* RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, | * RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, | ||
* GPIO_StructInit (& | * GPIO_StructInit (& | ||
Zeile 280: | Zeile 292: | ||
* GPIO_ResetBits(GPIOD, | * GPIO_ResetBits(GPIOD, | ||
+ | Und hier diesen Abschnitt wiederum als Videozusammenfassung. | ||
+ | |||
+ | >< | ||
+ | |||
+ | ====== Nächstes Thema ====== | ||
+ | |||
+ | * [[: | ||
- | Und hier diesen Abschnitt wiederum als Videozusammenfassung. | ||
- | >>>< | ||
- | ====== Nächstes Thema ====== | ||
- | * [[Einfache Ein- und Ausgaben mit dem ARM]] |