Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
systemtickc [2019/02/04 14:10]
127.0.0.1 Externe Bearbeitung
systemtickc [2019/07/25 15:48] (aktuell)
huwi
Zeile 5: Zeile 5:
 Diese Übung wird eine einfache Verwendung des //​SysTick_Handler//​ zur Generierung zyklischer Ausgaben demonstrieren. Wir lassen die LEDs auf dem Board abwechselnd blinken. Das folgende Blockbild verdeutlicht welche Bausteine bei dieser Aufgabe eine Rolle spielen. Vergleichen Sie diese vereinfachte Darstellung mit dem [[http://​www.mystm32.de/​lib/​exe/​detail.php?​id=systemtickc&​cache=cache&​media=blockbildstm32f4.jpg|Blockbild]] aus dem Datenblatt. Diese Übung wird eine einfache Verwendung des //​SysTick_Handler//​ zur Generierung zyklischer Ausgaben demonstrieren. Wir lassen die LEDs auf dem Board abwechselnd blinken. Das folgende Blockbild verdeutlicht welche Bausteine bei dieser Aufgabe eine Rolle spielen. Vergleichen Sie diese vereinfachte Darstellung mit dem [[http://​www.mystm32.de/​lib/​exe/​detail.php?​id=systemtickc&​cache=cache&​media=blockbildstm32f4.jpg|Blockbild]] aus dem Datenblatt.
  
->>>​{{:​hallosystickblockbild.jpg?​650|}}+>​{{:​hallosystickblockbild.jpg?​650|}}
  
 Die vier LEDs auf dem STM32F4 Discovery sind immer noch fest mit den Pins D12 bis D15 verbunden. Der SystemTick soll so konfiguriert werden, dass dieses Ereignis alle 10 Millisekunden eintritt. Die Takt-Versorgung des GPIO Ports D erfolgt, wie wir wissen, über AHB1. Fassen wir die Aufgaben zusammen: Die vier LEDs auf dem STM32F4 Discovery sind immer noch fest mit den Pins D12 bis D15 verbunden. Der SystemTick soll so konfiguriert werden, dass dieses Ereignis alle 10 Millisekunden eintritt. Die Takt-Versorgung des GPIO Ports D erfolgt, wie wir wissen, über AHB1. Fassen wir die Aufgaben zusammen:
Zeile 16: Zeile 16:
 Legen Sie bitte ein neues kleines Programm an und laden Sie das Grundgerüst für eine ARM C++ Anwendung. Beachten Sie die Einstellungen für die Zielplattform STM32F4-Discovery. Legen Sie bitte ein neues kleines Programm an und laden Sie das Grundgerüst für eine ARM C++ Anwendung. Beachten Sie die Einstellungen für die Zielplattform STM32F4-Discovery.
  
->>>​{{:​hallosystickneu.jpg?​700|}}+>​{{:​hallosystickneu.jpg?​700|}}
  
 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 cpp>+><​code cpp>
 //​---------------------------------------------------------------------- //​----------------------------------------------------------------------
 // Titel     : Beispiel einfache SysTick-Nutzung in SiSy STM32 // Titel     : Beispiel einfache SysTick-Nutzung in SiSy STM32
Zeile 39: Zeile 39:
 In den bisher verwendeten Programmgerüsten war der SystemTick schon vorbereitet. Diese Vorbereitung besteht aus dem Aufruf der Funktion //​SysTick_Config//​ und dem Ereignishandler //​SysTick_Handler//​. Die Funktion //​SysTick_Config//​ erwartet als Parameter den Zählerwert für den SysTick-Timer. Mit dem Parameter //​SystemCoreClock/​100//​ legen wir fest, dass nach 1.680.000 Systemtakten der SysTick-Interrupt ausgelöst und der //​SysTick_Handler//​ aufgerufen wird. Bei einem Systemtakt (//​SystemCoreClock//​) von 168 MHz entspricht dies 10 ms.  ​ In den bisher verwendeten Programmgerüsten war der SystemTick schon vorbereitet. Diese Vorbereitung besteht aus dem Aufruf der Funktion //​SysTick_Config//​ und dem Ereignishandler //​SysTick_Handler//​. Die Funktion //​SysTick_Config//​ erwartet als Parameter den Zählerwert für den SysTick-Timer. Mit dem Parameter //​SystemCoreClock/​100//​ legen wir fest, dass nach 1.680.000 Systemtakten der SysTick-Interrupt ausgelöst und der //​SysTick_Handler//​ aufgerufen wird. Bei einem Systemtakt (//​SystemCoreClock//​) von 168 MHz entspricht dies 10 ms.  ​
  
->>><​code cpp>+><​code cpp>
 // SysTickCounter = TakteProSekunde/​100 = 10 ms // SysTickCounter = TakteProSekunde/​100 = 10 ms
 SysTick_Config(SystemCoreClock/​100);​ SysTick_Config(SystemCoreClock/​100);​
Zeile 46: Zeile 46:
 Zehn Millisekunden sind ein sehr brauchbares und auch sehr übliches System-Timer-Ereignis. Da wir jedoch LEDs blinken lassen wollen, müssen wir uns überlegen, wie wir das dem Auge sichtbar machen. Einhundert Umschaltvorgänge pro Sekunde nehmen wir beim besten Willen nicht mehr wahr. Treten wir also auf die Bremse und richten uns einen eigenen einfachen Vorteil für unsere blinkenden LEDs ein. Dabei ist zu beachten, dass die Gültigkeit einer Variablen abhängig von deren Position im Quellcode ist. Eine Möglichkeit ist, eine globale Variable einzurichten. Das Thema globale Variablen, inclusive der sich darum entfachenden Glaubenskriege,​ kann an dieser Stelle nicht erschöpfend diskutiert werden. Die Globale bleibt eine Möglichkeit. Als Zweites bietet sich eine lokale Variable in dem //​SysTick_Handler//​ an. Diese verliert jedoch jedesmal ihre Gültigkeit,​ wenn die Funktion verlassen wird. Die Lösung ist, die lokale Variable als [[http://​openbook.galileocomputing.de/​c_von_a_bis_z/​009_c_funktionen_008.htm#​mjfaa118de66f0515eb22dd115f803c18a|statisch zu deklarieren]]. Zehn Millisekunden sind ein sehr brauchbares und auch sehr übliches System-Timer-Ereignis. Da wir jedoch LEDs blinken lassen wollen, müssen wir uns überlegen, wie wir das dem Auge sichtbar machen. Einhundert Umschaltvorgänge pro Sekunde nehmen wir beim besten Willen nicht mehr wahr. Treten wir also auf die Bremse und richten uns einen eigenen einfachen Vorteil für unsere blinkenden LEDs ein. Dabei ist zu beachten, dass die Gültigkeit einer Variablen abhängig von deren Position im Quellcode ist. Eine Möglichkeit ist, eine globale Variable einzurichten. Das Thema globale Variablen, inclusive der sich darum entfachenden Glaubenskriege,​ kann an dieser Stelle nicht erschöpfend diskutiert werden. Die Globale bleibt eine Möglichkeit. Als Zweites bietet sich eine lokale Variable in dem //​SysTick_Handler//​ an. Diese verliert jedoch jedesmal ihre Gültigkeit,​ wenn die Funktion verlassen wird. Die Lösung ist, die lokale Variable als [[http://​openbook.galileocomputing.de/​c_von_a_bis_z/​009_c_funktionen_008.htm#​mjfaa118de66f0515eb22dd115f803c18a|statisch zu deklarieren]].
  
->>><​code cpp>+><​code cpp>
 // Zähler einrichten // Zähler einrichten
 static u8 sysTickCounter=0;​ static u8 sysTickCounter=0;​
Zeile 60: Zeile 60:
 Ein weiterer Aspekt, den wir diskutieren wollen, ist der zu betreibende Aufwand, ​ um ein Pin zu konfigurieren. Bisher haben wir dafür jeweils **sieben Zeilen** aufgewendet. Für unsere vier Ausgabe-Pins müssen wir den Schreibaufwand für fast dreißig Zeilen nicht fürchten. Die Funktion //​GPIO_Init//​ kann nicht nur ein Pin, sondern auch mehrere Pins gleichartig konfigurieren. Dazu werden die gewünschten Pins //​ODER-verknüpft//​ und können der Initialisierungsstruktur zugewiesen werden. Ein weiterer Aspekt, den wir diskutieren wollen, ist der zu betreibende Aufwand, ​ um ein Pin zu konfigurieren. Bisher haben wir dafür jeweils **sieben Zeilen** aufgewendet. Für unsere vier Ausgabe-Pins müssen wir den Schreibaufwand für fast dreißig Zeilen nicht fürchten. Die Funktion //​GPIO_Init//​ kann nicht nur ein Pin, sondern auch mehrere Pins gleichartig konfigurieren. Dazu werden die gewünschten Pins //​ODER-verknüpft//​ und können der Initialisierungsstruktur zugewiesen werden.
  
->>><​code cpp>+><​code cpp>
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;​ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;​
 </​code>​ </​code>​
Zeile 66: Zeile 66:
 Für das Blinken der LEDs nutzen wir die Funktion //​GPIO_ToggleBits//​ aus der STM32F4 Treiberbibliothek. Für das Blinken der LEDs nutzen wir die Funktion //​GPIO_ToggleBits//​ aus der STM32F4 Treiberbibliothek.
  
->>><​code cpp>+><​code cpp>
 GPIO_ToggleBits(GPIOD,​GPIO_Pin_12);​ GPIO_ToggleBits(GPIOD,​GPIO_Pin_12);​
 </​code>​ </​code>​
Zeile 75: Zeile 75:
 Auch wenn es uns in den Fingern kribbelt sofort die nötigen Befehle einzugeben, kasteien wir uns mit dem folgenden Entwurf. ​ Auch wenn es uns in den Fingern kribbelt sofort die nötigen Befehle einzugeben, kasteien wir uns mit dem folgenden Entwurf. ​
  
->>><​code c>+><​code c>
 //​---------------------------------------------------------------------- //​----------------------------------------------------------------------
 // Titel     : Beispiel einfache SysTick-Nutzung in SiSy STM32 // Titel     : Beispiel einfache SysTick-Nutzung in SiSy STM32
Zeile 128: Zeile 128:
 Nachdem wir den Entwurf bei einem kräftigen Schluck Kaffee auf uns wirken lassen haben , kann der Code erstellt werden.\\ //Nicht kopieren! Selbstbewusst **tippen!**//​ Nachdem wir den Entwurf bei einem kräftigen Schluck Kaffee auf uns wirken lassen haben , kann der Code erstellt werden.\\ //Nicht kopieren! Selbstbewusst **tippen!**//​
  
->>><​code c>+><​code c>
 //​---------------------------------------------------------------------- //​----------------------------------------------------------------------
 // Titel     : Beispiel einfache SysTick-Nutzung in SiSy STM32 // Titel     : Beispiel einfache SysTick-Nutzung in SiSy STM32
Zeile 199: Zeile 199:
   - Brennen   - Brennen
  
->>>​{{:​systicktest.jpg?​400|}}+>​{{:​systicktest.jpg?​400|}}
  
  
Zeile 218: Zeile 218:
   - LEDs mit //​GPIO_ToggleBits//​ umschalten   - LEDs mit //​GPIO_ToggleBits//​ umschalten
  
->>><​html><​iframe width="​640"​ height="​400"​ src="​https://​www.youtube.com/​embed/​gj15-kPWQlE"​ frameborder="​0"​ allowfullscreen></​iframe></​html>​+><​html><​iframe width="​640"​ height="​400"​ src="​https://​www.youtube.com/​embed/​gj15-kPWQlE"​ frameborder="​0"​ allowfullscreen></​iframe></​html>​
  
 ====== Nächstes Thema ====== ====== Nächstes Thema ======
   * [[ARM Interrupts in C]]   * [[ARM Interrupts in C]]