Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
grundstruktur [2018/06/04 14:26]
huwaldt
grundstruktur [2019/07/25 12:57] (aktuell)
huwi
Zeile 6: Zeile 6:
 Wählen Sie das ARM Vorgehensmodell aus. Damit sind alle wichtigen Einstellungen für das Projekt und die darin enthaltenen Übungen als Default-Werte gesetzt. Nach Auswahl des Vorgehensmodells öffnet SiSy LibStore und bietet vorhandene Vorlagen für die weitere Arbeit an. Wählen Sie das ARM Vorgehensmodell aus. Damit sind alle wichtigen Einstellungen für das Projekt und die darin enthaltenen Übungen als Default-Werte gesetzt. Nach Auswahl des Vorgehensmodells öffnet SiSy LibStore und bietet vorhandene Vorlagen für die weitere Arbeit an.
  
->>>​{{:​umlprojekt2vgm.jpg?​500|}}+>​{{:​umlprojekt2vgm.jpg?​500|}}
  
 Wir brauchen für die ersten Schritte noch keine UML Bibliotheken. Damit können wir die Frage nach den Projektvorlagen mit "keine Vorlage verwenden"​ beantworten oder den Dialog einfach mit der Schaltfläche //​Abbrechen//​ beenden. Sie erhalten somit ein leeres Projekt. Die typische Aufteilung der SiSy-Oberfläche besteht aus Navigator, Assistent, Diagrammfenster und Editor. Die Aufteilung zwischen Diagrammfenster und Editor können Sie sich je nach Bedarf anpassen. Wir brauchen für die ersten Schritte noch keine UML Bibliotheken. Damit können wir die Frage nach den Projektvorlagen mit "keine Vorlage verwenden"​ beantworten oder den Dialog einfach mit der Schaltfläche //​Abbrechen//​ beenden. Sie erhalten somit ein leeres Projekt. Die typische Aufteilung der SiSy-Oberfläche besteht aus Navigator, Assistent, Diagrammfenster und Editor. Die Aufteilung zwischen Diagrammfenster und Editor können Sie sich je nach Bedarf anpassen.
Zeile 14: Zeile 14:
 Legen Sie Ihr erstes //kleines Programm// an, indem Sie das entsprechende Objekt aus der Objektbibliothek per //Drag & Drop// in das Diagrammfenster ziehen. Geben Sie dem Programm den Namen //​Beispiel1//​ und überprüfen Sie, ob die Zielsprache auf //ARM C++// eingestellt ist. Legen Sie Ihr erstes //kleines Programm// an, indem Sie das entsprechende Objekt aus der Objektbibliothek per //Drag & Drop// in das Diagrammfenster ziehen. Geben Sie dem Programm den Namen //​Beispiel1//​ und überprüfen Sie, ob die Zielsprache auf //ARM C++// eingestellt ist.
  
->>>​{{:​kleinesprogramm.jpg?​600|}}+>​{{:​kleinesprogramm.jpg?​600|}}
  
 Im nächsten Schritt wird die Hardware ausgewählt. Wir benutzen das Entwicklerboard //​STM32F407-Discovery//​ und den Programmer //ST-Link V2//. Falls Sie eine neuere SiSy Version ab 3.69 verwenden, achten Sie bitte darauf, dass Sie für diese Übungen die klassischen STM32 Bibliotheken nutzen und nicht die HAL. Des weiten schauen Sie auf die Seriennummer Ihres ST-Discovery um welche Revisionsnummer es sich handelt (A-D). Im nächsten Schritt wird die Hardware ausgewählt. Wir benutzen das Entwicklerboard //​STM32F407-Discovery//​ und den Programmer //ST-Link V2//. Falls Sie eine neuere SiSy Version ab 3.69 verwenden, achten Sie bitte darauf, dass Sie für diese Übungen die klassischen STM32 Bibliotheken nutzen und nicht die HAL. Des weiten schauen Sie auf die Seriennummer Ihres ST-Discovery um welche Revisionsnummer es sich handelt (A-D).
  
->>>>>​>​{{:​hardwareauswahl.jpg?​350|}}+>​{{:​hardwareauswahl.jpg?​350|}}
  
  
 Bevor wir uns dem Stress aussetzen und fast 40 Zeilen Programmcode abtippen, benutzen wir lieber eines der Features von SiSy, die Programmgerüste. Selektieren Sie das Grundgerüst für ein ARM C++ Programm und laden die Struktur über die Schaltfläche //Struktur laden//​. ​ SiSy fügt die ausgewählten Programmstrukturen jeweils an das Ende des bestehenden Quellcodes an.  Bevor wir uns dem Stress aussetzen und fast 40 Zeilen Programmcode abtippen, benutzen wir lieber eines der Features von SiSy, die Programmgerüste. Selektieren Sie das Grundgerüst für ein ARM C++ Programm und laden die Struktur über die Schaltfläche //Struktur laden//​. ​ SiSy fügt die ausgewählten Programmstrukturen jeweils an das Ende des bestehenden Quellcodes an. 
  
->>>>>​>​{{:​strukturladen.jpg?​350|}}+>​{{:​strukturladen.jpg?​350|}}
  
 Das nächste Dialogfeld mit Code-Wizzard überspringen wir und wählen die Schaltfläche //Fertig stellen//. Das nächste Dialogfeld mit Code-Wizzard überspringen wir und wählen die Schaltfläche //Fertig stellen//.
Zeile 29: Zeile 29:
  
 Zur Sicherheit können die vorgenommenen Einstellungen kontrolliert und ggf. geändert werden. Markieren Sie dafür im Diagrammfenster das Objekt //kleines Progemm// und wählen aus dem Kontextmenü (rechte Maustaste) //​Definieren//​. Überprüfen Sie die Einstellungen der Zielplattform unter //​Options(ARM).//​ Wir benutzen ein Evaluierungsboard von ST, das STM32F407-Discovery. ​ Zur Sicherheit können die vorgenommenen Einstellungen kontrolliert und ggf. geändert werden. Markieren Sie dafür im Diagrammfenster das Objekt //kleines Progemm// und wählen aus dem Kontextmenü (rechte Maustaste) //​Definieren//​. Überprüfen Sie die Einstellungen der Zielplattform unter //​Options(ARM).//​ Wir benutzen ein Evaluierungsboard von ST, das STM32F407-Discovery. ​
->>>>>>>​> {{:​armextraskleinesprg.jpg?​350|}}+ 
 +> {{:​armextraskleinesprg.jpg?​350|}}
  
 ====== Grundstruktur einer einfachen ARM Anwendung ====== ====== Grundstruktur einer einfachen ARM Anwendung ======
 Schauen wir uns den geladenen Quellcode etwas genauer an. Dieser lässt sich in mehrere Bereiche unterteilen. Zum einen ist da der Programmkopf mit Dokumentation und Deklarationen. Hier werden unter anderem die Deklarationen,​ zum Beispiel die Registernamen und die Funktionsdeklarationen des CMSIS und der Peripherietreiber für den STM32F4, aus externen Dateien in den Programmcode eingefügt (//#​include//​). Die //stddef// und //stdlib// sind exemplarisch eingefügte C-Standardbibliotheken. Schauen wir uns den geladenen Quellcode etwas genauer an. Dieser lässt sich in mehrere Bereiche unterteilen. Zum einen ist da der Programmkopf mit Dokumentation und Deklarationen. Hier werden unter anderem die Deklarationen,​ zum Beispiel die Registernamen und die Funktionsdeklarationen des CMSIS und der Peripherietreiber für den STM32F4, aus externen Dateien in den Programmcode eingefügt (//#​include//​). Die //stddef// und //stdlib// sind exemplarisch eingefügte C-Standardbibliotheken.
  
->>><​code c>+><​code c>
 //​---------------------------------------------------------------------- //​----------------------------------------------------------------------
 // Titel     : Grundgerüst einer einfachen ARM C Anwendung in SiSy // Titel     : Grundgerüst einer einfachen ARM C Anwendung in SiSy
Zeile 55: Zeile 56:
 Die Dokumentation sollte immer gewissenhaft ausgefüllt werden. Vor allem die Beschreibungen von Funktion und Hardware sind sehr wichtig. Das richtige Programm zur falschen Schaltung oder umgekehrt kann verheerende Folgen haben. Es folgt der Definitionsteil. Hier finden sich globale Variablen oder eben Unterprogramme,​ besser gesagt [[http://​openbook.galileocomputing.de/​c_von_a_bis_z/​009_c_funktionen_001.htm#​mj7893101be51aa469fe52334038acd465|Funktionen]]. Diese müssen vor dem ersten Benutzen deklariert sein. Das bedeutet in unserem Fall, dass die Funktion //​initApplication//​ noch vor dem Hauptprogramm der Funktion //main// steht. Es gibt durchaus die Möglichkeit,​ dies auch anders zu tun, aber das ist dann doch eher Bestandteil eines reinen C/C++ Tutorials. Besonders der C-Neuling beachte den Funktionskopf,​ in dem Fall //mit ohne// Typ und Parametern sowie den Funktionskörper,​ begrenzt durch die geschweiften Klammern. Die Dokumentation sollte immer gewissenhaft ausgefüllt werden. Vor allem die Beschreibungen von Funktion und Hardware sind sehr wichtig. Das richtige Programm zur falschen Schaltung oder umgekehrt kann verheerende Folgen haben. Es folgt der Definitionsteil. Hier finden sich globale Variablen oder eben Unterprogramme,​ besser gesagt [[http://​openbook.galileocomputing.de/​c_von_a_bis_z/​009_c_funktionen_001.htm#​mj7893101be51aa469fe52334038acd465|Funktionen]]. Diese müssen vor dem ersten Benutzen deklariert sein. Das bedeutet in unserem Fall, dass die Funktion //​initApplication//​ noch vor dem Hauptprogramm der Funktion //main// steht. Es gibt durchaus die Möglichkeit,​ dies auch anders zu tun, aber das ist dann doch eher Bestandteil eines reinen C/C++ Tutorials. Besonders der C-Neuling beachte den Funktionskopf,​ in dem Fall //mit ohne// Typ und Parametern sowie den Funktionskörper,​ begrenzt durch die geschweiften Klammern.
  
->>><​code c>+><​code c>
 void initApplication() void initApplication()
 { {
Zeile 65: Zeile 66:
 Als vorgegebenen Funktionsaufruf finden wir dort die Initialisierung des SysTick-Timers. Dieser liefert uns schon mal ein regelmäßiges Timerereignis. In den Übungen werden wir dies recht schnell benötigen. An dieser Stelle können noch weitere Funktionen eingefügt werden. Es folgt jetzt das Hauptprogramm. Dies ist durch das Schlüsselwort //main// gekennzeichnet. Auch hier sehen wir wieder die Begrenzung des Funktionskörpers durch die geschweiften Klammern. Innerhalb des Hauptprogramms findet sich zuerst die Initialisierungssequenz. Dabei sollte als erstes die Funktion //​SystemInit//​ aufgerufen werden. Diese ist im Treiberfundus von ST enthalten und übernimmt die Grundinitialisierungen des ARM Kerns. Die Funktion ist quellcodeoffen und kann bei Bedarf durch den Entwickler für ein Projekt angepasst werden. Als Einsteiger nehmen wir diese, wie sie vorgefertigt ist. Danach initialisieren wir die Pheripherie. Das erfolgt durch Aufruf der bereits besprochenen Funktion //​initApplication//​. Als vorgegebenen Funktionsaufruf finden wir dort die Initialisierung des SysTick-Timers. Dieser liefert uns schon mal ein regelmäßiges Timerereignis. In den Übungen werden wir dies recht schnell benötigen. An dieser Stelle können noch weitere Funktionen eingefügt werden. Es folgt jetzt das Hauptprogramm. Dies ist durch das Schlüsselwort //main// gekennzeichnet. Auch hier sehen wir wieder die Begrenzung des Funktionskörpers durch die geschweiften Klammern. Innerhalb des Hauptprogramms findet sich zuerst die Initialisierungssequenz. Dabei sollte als erstes die Funktion //​SystemInit//​ aufgerufen werden. Diese ist im Treiberfundus von ST enthalten und übernimmt die Grundinitialisierungen des ARM Kerns. Die Funktion ist quellcodeoffen und kann bei Bedarf durch den Entwickler für ein Projekt angepasst werden. Als Einsteiger nehmen wir diese, wie sie vorgefertigt ist. Danach initialisieren wir die Pheripherie. Das erfolgt durch Aufruf der bereits besprochenen Funktion //​initApplication//​.
  
->>><​code c>+><​code c>
 int main(void) int main(void)
 { {
Zeile 81: Zeile 82:
 Zum Schluss folgen die Interrupt Service Routinen und Ereignishandler. Da diese nicht explizit zum Beispiel aus der //main// aufgerufen werden sondern in der Regel an für unser Anwendungsprogramm quasi externe Hardwareereignisse gebunden sind und automatisch auslösen können, stehen sie hinter dem Hauptprogramm als Letztes . Zum Schluss folgen die Interrupt Service Routinen und Ereignishandler. Da diese nicht explizit zum Beispiel aus der //main// aufgerufen werden sondern in der Regel an für unser Anwendungsprogramm quasi externe Hardwareereignisse gebunden sind und automatisch auslösen können, stehen sie hinter dem Hauptprogramm als Letztes .
  
->>><​code c>+><​code c>
 extern "​C"​ void SysTick_Handler(void) extern "​C"​ void SysTick_Handler(void)
 { {
Zeile 92: Zeile 93:
  
 >​{{:​uebersetzen.jpg?​350|}} {{:​brennen.jpg?​350|}} >​{{:​uebersetzen.jpg?​350|}} {{:​brennen.jpg?​350|}}
->>​{{:​denarmflaschen.jpg?​700|}}+>​{{:​denarmflaschen.jpg?​700|}}
  
 Während der Übertragung kann man die Status-LED des integrierten ST-LINK flackern sehen. Nach der Übertragung leuchtet diese in der Regel grün für den Status RUN. Der ARM "​arbeitet"​ jetzt. Da unser Programm selbst aber nur ein leeres Grundgerüst ist läuft der Controller faktisch im Leerlauf. Es sind keine Bausteine bzw. keine Peripherie aktiv. Während der Übertragung kann man die Status-LED des integrierten ST-LINK flackern sehen. Nach der Übertragung leuchtet diese in der Regel grün für den Status RUN. Der ARM "​arbeitet"​ jetzt. Da unser Programm selbst aber nur ein leeres Grundgerüst ist läuft der Controller faktisch im Leerlauf. Es sind keine Bausteine bzw. keine Peripherie aktiv.
  
->>>>​>​{{:​leerlauf.jpg?​500|}}+>​{{:​leerlauf.jpg?​500|}}
  
 ====== Videozusammenfassung ====== ====== Videozusammenfassung ======
Zeile 102: Zeile 103:
 Und hier diesen Abschnitt als Videozusammenfassung zum nochmal drüberschauen. Und hier diesen Abschnitt als Videozusammenfassung zum nochmal drüberschauen.
  
->>><​html><<​iframe width="​640"​ height="​480"​ src="​https://​www.youtube.com/​embed/​1aqgfjNNFcI"​ frameborder="​0"​ allowfullscreen></​iframe></​html>​+><​html><<​iframe width="​640"​ height="​480"​ src="​https://​www.youtube.com/​embed/​1aqgfjNNFcI"​ frameborder="​0"​ allowfullscreen></​iframe></​html>​
  
 ====== Nächstes Thema ====== ====== Nächstes Thema ======
   * [[Hallo C|Hallo ARM C]]   * [[Hallo C|Hallo ARM C]]