Für sehr viele eingebetete Systeme ist es notwendig mit anderen Systemen zu kommunizieren. Dafür gibt es unterschiedlichste Varianten. Eine der wichtigsten Kommunikationsmöglichkeiten ist die gute alte serielle Schnittstelle. Die Älteren unter uns kennen die noch. Da haben wir früher die Maus angeschlossen. Für diese Kommunikationsschnittstelle gibt es verschiedene Namen. Je nachdem in welchem Umfeld man sich bewegt läuft einem die serielle Schnittstelle als COM, TTY, RS232, RS485, UART, USART, USIC oder SERCOM über den Weg. In unserem Mikrocontroller heißt diese UART (Universal Asynchron Receiver Transmitter) oder USART (Universal Synchron Asynchron Receiver Transmitter). Im PC wir diese, obwohl wir einen USB-Anschluss benutzen, als COM-Port auftauchen. Das kann man sich im Gerätemanager unter Anschlüsse (COM & LPT) anschauen. Dafür sorgt ein kleiner Controller eine sogenannte USB-UART-Bridge. Der COM-Port im Gerätemanager wird durch den entsprechenden Gerätetreiber nur simuliert. Man spricht auch von einem virtuellen COM-Port (VCP). Diesen COM-Port werden wir für diese Aufgabe benutzen.
Die Aufgabe soll darin bestehen, Daten per UART an den PC zu senden. Dort werden die empfangenen Daten in einem Terminal-Programm angezeigt. Generieren Sie sich verändernde Daten indem sie einen Zähler um jeweils 1 erhöhen und diesen Wert senden.
Anforderungen an die Lösung:
Führen Sie folgende Vorbereitungsarbeiten durch:
Die Aufgabe besteht darin die UART an den Pins A9/A10 mit 19200 Baud zu konfigurieren und Daten über diese Schnittstelle an den PC zu senden. Die Verbindung der USB-UART-Bridge zu den Pins A9 und A10 des Controllers ist auf dem Board bereits fest eingebaut. Sie Benutzen diese schon die ganze Zeit jedes mal beim Programmieren über den Bootloader.
Für den Empfang von seriellen Daten benutzt man sogenannte Terminals. In älteren Versionen des Betriebssystems Windows konnte man noch solch ein Terminalprogramm unter der Rubrik Zubehör finden. Es hieß HyperTerminal. Dieses Programm stammt aus einer Zeit in der man noch mit sogenannten Modems über das normale analoge Telefonnetz Kommunikationsverbindungen zwischen Computern hergestellt hat. Naja dann kam das Internet und das war es dann für das HyperTerminal als Betriebssystemkomponente.
Für Embedded-Entwickler ist so ein Programm immer noch wichtig um mit seinem Mikrocontroller zu kommunizieren. Deshalb gibt es in SiSy ein spezielles Terminalprogramm das ControlCenter. Wir abstrahieren die UART Verbindung zu unserem Terminal als neuen Systembaustein wie folgt:
Das PEC-Framework bietet als Bibliotheksbaustein für das Senden und Empfangen von Daten über die Serielle Schnittstelle das Template PecUart und Konfigurationen für verschiedene Übertragungsgeschwindigkeiten an.
Als Bibliotheksbausteine benötigen wir us dem UART-Paket die PecUart und baudrate19200 zur Konfiguration. Die Konfiguration der Datenübertragung muss sowohl am PC-Terminal als auch im Mikrocontroller exakt übereinstimmen. Sind die Einstellungen nicht identisch kommt es zu einer fehlerhaften Datenübertragung.
Wir nutzen zur Datenübertragung folgende Konfiguration:
Der Grobentwurf für diese Lösung sieht dann so aus:
MERKE: UART = immer die Datenübertragungsgeschwindigkeit in BAUD konfigurieren
Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Zusätzlich muss noch die richtige UART Konfiguration hinzugefügt werden. ARM Controller verfügen über eine Busmatrix. Das bedeutet, dass interne Bausteine wie eine UART nicht fest mit den entsprechenden Pins verbunden sind sondern der Hard-/Software-Entwickler aus mehreren möglichen Pin-Konfigurationen wählen kann. Die entsprechenden Informationen findet man in den Dokumentationen zum Controller (Data-Sheet, Reference-Manual, …). Am Anfang des Tutorials haben wir ihnen empfohlen sich diese Referenzkarte auszudrucken und neben die Tastatur zu legen. Jetzt ist ein guter Zeitpunkt sich die Referenzkarte anzuschauen. Sie finden hier die relevanten Informationen um die korrekte UART Konfiguration zu ermitteln.
Sie finden den Bibliotheksbaustein uart1portA9_MM32L0 über den Explorer. Sie können auch die kleine Fragezeichenschaltfläche an PecUart [?] benutzen.
Die Daten welche wir zum PC senden wollen generieren wir uns mit einem einfachen Zähler. Die Variable für diesen Zähler legen wir uns als Attribut der Klasse Controller an.
Ihr Klassenmodell sollte nach den entsprechenden Arbeitsschritten der folgenden Darstellung entsprechen.
Jetzt fehlt nur noch das geforderte Verhalten zu codieren. Die einfachste Variante ist den rohen Wert zu übertragen.
Controller::onWork():void// continous event from the Mainloop counter++; terminal.writeByte(counter); waitMs(10);
Vergleichen Sie diese Lösung mit dem folgenden alternativen Lösungsansatz.
Controller::onWork():void// continous event from the Mainloop counter++; String txt; txt.format("\n Hallo mySTM32, counter= %d",counter); terminal.writeString(txt); waitMs(10);
Ü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 und Starten das Werkzeug ControlCenter.
Stellen Sie im ControlCenter die Parameter für die Verbindung mit dem Board ein. Achten Sie auf den richtigen COM-Port und die korrekte Baudrate. Der COM-Port ist ggf. dem Gerätemanager zu entnehmen.
Jetzt können Sie die gewünschten Daten vom Controller empfangen.
Erlernte und gefestigte Arbeitsschritte:
Und hier diesen Abschnitt wiederum als Videozusammenfassung.
Fügen Sie einen Taster als SendenTaste der Systemlösung hinzu. Stellen Sie die Lösung so um, dass die Datenübertragung im 100 Millisekunden Systemereignis onEvent100ms() erfolgt wenn die Taste Senden betätigt ist.