Das erste Blinky

So, dann frisch ans Werk. Die erste Übung mit der wahrscheinlich ungewohnten Umgebung soll das einfache Einschalten einer LED sein.
Der Sinn und Zweck von Klassenbibliotheken ist natürlich vor allen der, dass Dinge die öfters gebraucht werden oder typische Problemstellungen die einfach schon mal gelöst wurden, dem Anwender komfortabel zur Wiederverwendung zur Verfügung stehen.
Das werden wir nutzen.

Die Objektorientierung zeichnet sich durch zunehmende Abstraktion von der tatsächlichen inneren Struktur und dem internen Verhalten der Maschine, hin zu einer anwenderbezogenen Sichtweise aus.

Die Aufgabe lautet:
Der Anwender soll sehen, dass der Mikrocontroller funktioniert. Entwickeln Sie dafür eine Lösung die den Status des Mikrocontrollers durch blinken einer LED anzeigt. Diese StausLED soll an Port B0 angeschlossen werden.

Falls Sie jetzt noch das vorherige Klassendiagramm geöffnet haben wählen Sie im Kontextmenü (rechte Maustaste) des Diagramms den Menüpunkt nach oben. Falls das Projekt nicht mehr geöffnet ist, öffnen sie das SiSy UML-Projekt wieder.

  1. Legen Sie ein neues Klassendiagramm an und
  2. wählen Sie die Sprache ARM C++.
  3. Beachten Sie die Einstellungen für die Zielplattform STM32F042 mySTM32 Board light HAL.
  4. Beim Öffnen des Diagramms (rechte Maustaste, nach unten) laden Sie aus dem SiSy LibStore die Diagrammvorlage Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR).
  5. Weisen Sie das Treiberpaket für STM32F0 zu.
  6. Zusätzlich können Sie den Bibliotheksbaustein stm32F042_48Mhz aus dem Explorer nutzen um den Controller mit voller 48MHz Leistung zu betreiben.

Die Aufgabe besteht darin eine LED anzusteuern um den Status des Controllers anzuzeigen. Folgen wir dem sogenannten objektorientierten Konzepten, ist diese StatusLED ein Baustein unseres Systems. Systembausteine bilden wir in der UML als Klassen ab. In unserem Klassendiagramm sehen wir schon einen solchen Systembaustein. Den Controller.

Jetzt brauchen wir noch eine Klasse für die StausLED.

Diese beiden Bausteine stehen in Beziehung zu einander. Als Anfänger benutzen sie bitte nur zwei Beziehungstypen zwischen Bausteinen. Das ist die „ist ein“-Beziehung und die „hat“-Beziehung. Zwischen Controller und LED macht die „ist ein“-Beziehung wenig Sinn da passt die „hat“-Beziehung besser. Eine „hat“-Beziehung können wir mit der „Aggregation“ in der UML gut abbilden. Die Aggregation wird in der UML als Pfeil mit einer Raute (diamond shape) am Anfang dargestellt. Der Codegenerator macht daraus ein Klassenattribut. Der Name und die Sichtbarkeit des Attributes ist am Pfeil zu sehen. Der Klassenname sollte immer mit einem Großbuchstaben beginnen. Attribute und Operationen schreiben wir am Anfang immer klein.

Des weiteren möchten wir nicht so viel selber programmieren, sondern den Komfort der verfügbaren PEC-Bibliothek nutzen. Ein für diese Aufgabe passender PEC-Baustein ist PecPinOutput. Wenn wir uns den den Bibliotheksbaustein PecPinOutput anschauen werden wir feststellen, dass er genau das macht was wir benötigen um eine LED an- oder auch auszuschalten.

Die Beziehung zwischen StatusLED und PecPinOutput lässt sich als „ist ein“-Beziehung abbilden.
Dazu nutzen wir in diesem Fall die UML-Realisierung.

Diese Darstellung lässt sich zur Verifikation sehr schön wie folgt lesen:
Der Controller hat eine StatusLED. Die StatusLED ist ein PecPinOutput.

Das ist schon ein recht brauchbarer Grobentwurf. Es fehlt noch die Zuordnung zum konkreten Pin am Controller und die eigentliche Logik zum Einschalten der StatusLED. Das überlassen wir der Realisierung.

MERKE: Systembaustein = Klasse
MERKE: „hat“-Beziehung = Aggregation oder Komposition
MERKE: „ist ein“-Beziehung = Realisierung oder Vererbung
MERKE: Klassennamen = immer ein Großbuchstabe am Anfang
MERKE: Attribute und Operationen = beginnen immer mit einem kleinen Buchstaben

Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Zusätzlich muss das Pin B0 an die Realisierung der StatusLED gebunden werden. Sie finden den entsprechenden PEC-Baustein über den Explorer. Nutzen Sie gern auch das kleine Fragezeichen an PecPinOutput. Orientieren Sie sich an der folgenden Darstellung bei der Realisierung ihres Entwurfes:

Beim ersten mal gehen wir das hier Schritt für Schritt durch.
Zuerst ziehen Sie eine Klasse aus der Objektbibliothek in das Diagramm und geben dieser den Namen StatusLED.

Danach verbinden Sie die Klasse Controller mit der Klasse StatusLED und wählen als Verbindungstyp eine Aggregation aus.

Suchen Sie im Explorer nach dem PEC-Bibliotheksbaustein PecPinOutput. Ziehen Sie dieses Element in das Diagramm.

Verbinden Sie den Bibliotheksbaustein PecPinOutput mit der Klasse StatusLED. Wählen sie als Verbindungstyp die Realisierung.

Suchen Sie über den Explorer den Bibliotheksbaustein pinB0. Ziehen Sie diesen Baustein in das Diagramm. Sie können auch die kleine Fragezeichenschaltfläche nutzen um eine Liste der möglichen Bausteine zu erhalten.

Verbinden Sie den Baustein pinB0 mit der Klasse StatusLED. Wählen Sie als Verbindungstyp die Realisierung.

Sie sollten mit diesen Schritten einen Entwurf entsprechend der folgenden Darstellung erhalten. Ordnen Sie die Elemente übersichtlich an. Klassendiagramme sind sehr nützliche Dokumentationsmittel. Vergleichen Sie ihren Entwurf mit der folgenden Darstellung.

Diese Softwarekonstruktionszeichnung lässt sich wie folgt „lesen“:

  • der zentrale Baustein ist der Controller (Applikationsklasse)
  • dieser verfügt über die Verhaltensmerkmale (Operationen) onStart und onWork
  • Der Controller ist ein PecAppKernel
  • Das globale Objekt app ist die Instanz der Applikationsklasse Controller
  • Der Controller verfügt über eine StatusLED mit dem Attributnamen statusLED
  • Das Attribut statusLED der Klasse Controller ist öffentlich

Die eigentliche Verhaltenslogik für das Blinken der LED notieren wir als C++ Code in der Operation onWork() der Klasse Controller. Um die LED blinken zu lassen schalten wir die LED zyklisch um (togglen). Damit das Auge dieses toggeln auch wahrnimmt bauen wir eine kleine Pause ein. Die Möglichkeiten die der Bibliotheksbaustein PecPinOutput bietet sehen Sie rechst angezeigt. Notieren Sie den folgenden Code in der Operation onWork:

Controller::onWork():void
// continuous event from the Mainloop
statusLED.toggle();
waitMs(200);

Vergleichen sie diesen Code mit der folgenden alternativen Lösung:

Controller::onWork():void
// continuous event from the Mainloop
statusLED.on();
waitMs(50);
statusLED.off();
waitMs(200);

Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.

  1. Erstellen (Kompilieren und Linken)
  2. Brennen
  3. verbinden Sie Pin B0 mit der roten LED

Videozusammenfassung

Erlernte und gefestigte Arbeitsschritte:

  1. Klassendiagramm anlegen und öffnen
  2. Diagrammvorlage für PEC Applikation auswählen, laden und Treiberpaket für STM32F0 einfügen
  3. im Navigator/Explorer PEC-Bausteine finden
  4. gewünschte Bibliothekselemente in das Diagramm ziehen
  5. Klassen miteinander verbinden (Aggregation, Realisierung)
  6. den nötigen Quellcode in den richtigen Operationen erstellen
  7. Erstellen und Brennen einer STM32 Applikation im Klassendiagramm

Und weil es so schön war hier das Ganze noch mal als Video.

oder die schnelle Version ohne Sprachkommentare

Übung 1

Erweitern Sie zur Übung die Anwendung um eine weitere ErrorLED an Pin B1. Orientieren sie sich an den obigen Arbeitsschritten. Lassen Sie die ErrorLED im Gegentakt zur StatusLED blinken.

Weiter mit:

Suchbegriffe