Link in die Zwischenablage kopiert!

Erste Schritte mit Riverdi STM32-U5 Embedded Display – Tutorial von Controllerstech

Das Tutorial bietet eine ausführliche Anleitung zur Implementierung des STM32-U5 Embedded-Displays von Riverdi in einem Projekt, das ein 5-Zoll-LCD-TFT-Display aus der neuen Produktreihe von Riverdi zeigt, die auf der STM32U5-MCU-Serie basiert, die für ihre fortschrittlichen stromsparenden Mikrocontroller bekannt ist.

Tutorial – Erstellen von Visualisierungen für ADC-Potentiometer mit Riverdi STM32 Embedded Display

Durch die Einbindung einer kapazitiven Touch-Benutzeroberfläche, die mit TouchGFX entwickelt wurde, zeigt das Tutorial, wie man Variationen eines analogen Signals (von einem Potentiometer) auf der grafischen Benutzeroberfläche (GUI) visualisiert, indem man die ADC-Peripherie konfiguriert, kodiert und das Task- und Queue-Management mit FreeRTOS in die STM32CubeIDE-Umgebung integriert. Das Tutorial beschreibt jeden einzelnen Schritt, von der Konfiguration der MCU mit cubeMX, der Codierung des ADC-Tasks, der Anbindung und Aktualisierung der GUI bis hin zum abschließenden Flashen des Projekts. Es zeigt einen optimierten Entwicklungsprozess, der Projekte direkt mit cubeMX neu generiert, Probleme mit früheren STM32-H7 Embedded Displays von Riverdi überwindet und schließlich eine reaktionsschnelle Anzeige von Messwerten und Spannungen in der GUI liefert, die sich an Potentiometereinstellungen anpasst.

Dieses Tutorial wurde von Controllerstech – Robotics Simplified, einem in Indien ansässigen Softwareentwicklungsunternehmen, erstellt. Ihr Ziel ist es, Software-Wissen für Mikrocontroller auf STM32-Basis zu vermitteln. Nachstehend finden Sie den ursprünglich hier veröffentlichten Leitfaden: https://controllerstech.com/riverdi-stm32-u5-embedded-display/

Sehen Sie sich das Video-Tutorial an:

Riverdi STM32-U5 Eingebettetes Display

Dies ist ein weiteres Tutorial über das STM32 Embedded Display von Riverdi. Heute haben wir ein 5″ LCD TFT Display aus der neuen Produktreihe. Riverdi hat sich auf die Herstellung verschiedener Arten von Displays spezialisiert, zu denen auch die STM32-basierten Displays gehören, die TouchGFX von Haus aus unterstützen. Das Display kann unter https://riverdi.com/product-category/stm32-embedded-displays erworben werden.

Dieses Display basiert auf der STM32U5-Serie, die fortschrittliche, stromsparende Mikrocontroller auf der Basis von Arm® Cortex®-M33 bietet, um die anspruchsvollsten Energie-/Leistungsanforderungen zu erfüllen. Mit bis zu 4 Mbyte Flash-Speicher und 2514 Kbyte SRAM bietet die STM32U5-Serie Mikrocontroller, die eine neue Leistungsstufe erreichen.

Ich habe bereits einige Tutorials über die Riverdi STM32-H7 Embedded Displays behandelt, in denen ich gezeigt habe, wie man das vorgefertigte Projekt an einen neuen Ort kopiert, dann das Projekt von cubeMX modifiziert und nur die benötigten Dateien in das Originalprojekt kopiert. Dieses Verfahren funktioniert, ist aber sehr umständlich, wenn Sie das Projekt aus cubeMX neu generieren wollen.

ABER mit dieser neuen Reihe von STM32-U5 Embedded Displays können wir das Projekt direkt mit cubeMX regenerieren. Wir können das Projekt sogar mit cubeIDE flashen.

In diesem Tutorial werden wir das Potentiometer mit dem ADC auslesen, seine Veränderung auf dem Messgerät anzeigen und auch die ADC-Spannung in einem Textbereich darstellen. Um dies zu tun, werden wir die GUI mit TouchGFX erstellen, dann das Projekt mit cubeMX neu generieren und die ADC-Peripherie konfigurieren, den Code schreiben und das Projekt mit cubeIDE flashen.

Gestaltung der UI auf TouchGFX

Erstellen Sie das Projekt mit TouchGFX

  1. Klicken Sie auf Erstellen , um ein neues Projekt zu erstellen
  2. Suchen Sie nach dem Riverdi, um die verfügbaren Boards zu sehen
  3. Wählen Sie die Anzeige, die Sie haben. Ich habe den 5″ STM32U5.
  4. Geben Sie dem Projekt einen Namen
  5. Klicken Sie auf Erstellen, um das Projekt zu erstellen.

Hinzufügen der erforderlichen Elemente zur Benutzeroberfläche

Das folgende Bild zeigt das endgültige UI-Design.

  • Ich habe ein Messgerät hinzugefügt, dessen Werte von 0 bis 100 reichen können.
  • TextArea1, die den Wert auf dem Messgerät anzeigen wird.
  • TextArea2, die zur Anzeige der ADC-Voltgae verwendet wird.

Beide Textbereiche verwenden die Platzhalter, so dass wir die Werte direkt aus dem Code aktualisieren können.

Nachdem Sie die Benutzeroberfläche entworfen haben, erzeugen Sie das Projekt und öffnen es im cubeIDE.

Konfigurieren Sie das Projekt in cubeMX

Die folgende Abbildung zeigt die Pinbelegung des Erweiterungssteckers und wie das Potentiometer daran angeschlossen wird.

Wir werden den ADC1-Kanal 11/12 verwenden, der mit dem Pin PA7 (Pin 20) verbunden ist. Standardmäßig ist der ADC im differentiellen Modus konfiguriert, aber damit das Potentiometer funktioniert, müssen wir es im Single-Ended-Modus konfigurieren.

Nachfolgend sehen Sie die cubeMX-Konfiguration.

Ich habe den ADC1-Kanal 12 in den Single-Ended-Modus umkonfiguriert. Die ADC-Auflösung ist auf 12 Bit eingestellt.

Außerdem müssen wir eine Aufgabe und eine Warteschlange erstellen, um die ADC-Daten an die grafische Benutzeroberfläche zu senden. Die folgende Abbildung zeigt die Konfiguration für den ADC Task.

Der ADC Task ist mit normaler Priorität konfiguriert. Damit wird der ADC-Wert gelesen und dann an die Warteschlange gesendet.

Außerdem müssen wir die Warteschlange konfigurieren, um die Daten an die grafische Benutzeroberfläche zu senden. Die folgende Abbildung zeigt die Konfiguration der Warteschlange.

Die ADC-Warteschlange ist mit 5 Elementen ganzzahliger Größe konfiguriert. Wir werden die Werte zwischen 0 und 100 senden, so dass die Größe einer ganzen Zahl ausreicht.

Das ist alles, was wir brauchen, um das Projekt jetzt zu erstellen.

Schreiben wir den Code

Die ADC-Aufgabe, die wir definiert haben, befindet sich in der Datei app_freertos.c.

void StartADCTask(void *argument)
{
for(;;)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
uint16_t ADC_VALUE = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);converted_value = map(ADC_VALUE, 0, 4095, 0, 100);
if (osMessageQueueGetSpace(ADCQueueHandle) > 0)
{
osMessageQueuePut(ADCQueueHandle, &converted_value, 0, 0);
}
osDelay(100);
}

}

In der ADC-Task wird der ADC-Wert gelesen und dann über die ADC-Warteschlange an die GUI gesendet.

  • Ich verwende den Blockierungsmodus, um den ADC-Wert zu lesen und den Wert in der Variablen ADC_VAL zu speichern.
  • Die ADC-Auflösung ist auf 12 Bit eingestellt, daher reichen die Werte von 0 bis 4095.
  • Wir werden diese Werte dann im Bereich von 0 bis 100 abbilden. Die umgewandelten Werte werden dann in der Variablen converted_val gespeichert.
  • Dann prüfen wir, ob in der Warteschlange noch Platz ist. Wenn in der Warteschlange Platz ist, senden Sie den Wert an die Warteschlange.
  • Diese Aufgabe wird alle 100 ms ausgeführt. Wir lesen nur das Timing eines Potentiometers ab, und die Taktfrequenz ist wirklich nicht die Priorität.

Diese Werte werden in das GUI-Modell übernommen. Nachstehend finden Sie den Code, der die Implementierung des Modells zeigt.

void Model::tick()
{
if (osMessageQueueGetCount(ADCQueueHandle) > 0)
{
osMessageQueueGet(ADCQueueHandle, &ADC_VAL, 0, 0);
}
modelListener->setADC (ADC_VAL);
}

Innerhalb des Modells wird die Tick-Funktion bei jeder Bildaktualisierung aufgerufen. In dieser Funktion wird geprüft, ob die Daten in der Warteschlange vorhanden sind.

  • Wenn die Warteschlange Daten enthält, werden die Daten gelesen und in der Variablen ADC_VAL gespeichert.
  • Diese Variable ist in der Datei Model.hpp definiert.
  • Wir werden dann die Funktion setADC im modelListener aufrufen.

Die Funktion setADC ist in der Datei modelListener.hpp definiert, aber ihre Implementierung sollte eine leere Funktion sein. Dies ist im Folgenden dargestellt.

virtual void setADC (int val) {}

Diese leere Implementierung veranlasst die GUI, die Funktion in der Presenter-Datei zu suchen. An dieser Stelle wird die Funktion tatsächlich definiert.

void Screen1Presenter:: setADC (int val)
{
view.setADC (val);
}

Innerhalb des Präsentators rufen wir die gleiche Funktion in der Ansicht auf.

Die Ansicht ist der Ort, an dem die Funktion tatsächlich geschrieben wird. Nachfolgend die Definition für die Funktion setADC

void Screen1View::setADC (int val)
{
Unicode::snprintf(textArea1Buffer, TEXTAREA1_SIZE, „%d“, val);
textArea1.invalidate();adc_voltage = (float)(val*3.3)/100.0;
Unicode::snprintfFloat(textArea2Buffer, TEXTAREA2_SIZE, „%.2f“, adc_voltage);
textArea2.invalidate();

gauge1.setValue(val);
gauge1.invalidate();
}

  • Hier wird der Wert zunächst mit snprintf in das Zeichenformat konvertiert und dann in den textArea1-Puffer kopiert.
  • textArea1 ist über dem Messgerät definiert, so dass es die Werte zwischen 0 und 100 anzeigt.
  • Als Nächstes werden wir die Werte in den Float-Bereich von 0 bis 3,3 umwandeln, der zur Anzeige der Spannung am ADC-Pin verwendet wird.
  • Anschließend konvertieren Sie den Float-Wert mit der Funktion snprintfFloat in das Zeichenformat und kopieren ihn in den textArea2-Puffer.
  • textArea2 wird unterhalb des Messgeräts definiert und zeigt die Werte zwischen 0 und 3,3 an.
  • Schließlich setzen wir den Wert auf das Messgerät.

Damit ist unser Code-Teil abgeschlossen. Jetzt flashen wir das Projekt aus dem cubeIDE selbst.

Blinken Sie das Projekt

Wir müssen die Debug-Konfiguration ein wenig ändern, bevor wir mit dem Flashen fortfahren können. Das von TouchGFX generierte Projekt erzeugt nicht die externe Ladedatei, daher müssen wir den Pfad relativ zu unserem Dateisystem angeben.

Öffnen Sie die Debug-Konfiguration, klicken Sie auf die Registerkarte Debugger und scrollen Sie nach unten zu Externe Lader.

Klicken Sie auf den Lader und dann auf Bearbeiten.

Klicken Sie nun auf Dateisystem.

Suchen Sie nun den Loader im Verzeichnis STM32cubeProgrammer. In meinem Fall befindet es sich in Program Files -> STMicroElectronics -> STM32CubeProgrammer ->bin -> ExternalLoaders.

Wenn Sie den Loader gefunden haben, klicken Sie auf Übernehmen, um die Konfiguration zu speichern, und klicken Sie auf RUN, um das Projekt auf die Karte zu übertragen.

Ergebnis

Nachfolgend sehen Sie ein Gif, das die Anzeige zeigt.

Wie Sie sehen können, reagiert das Messgerät ziemlich gut auf die Drehung des Potentiometers. Der textArea auf dem Messgerät zeigt den aktuellen Wert des Messgeräts an.

Im textArea unten wird die aktuelle Spannung am ADC-Pin angezeigt, die zwischen 0 und 3,3 V variieren kann.

Code herunterladen

Hier können Sie den von Controllertech zur Verfügung gestellten Code herunterladen: Potentiometer

Riverdi – der europäische Hersteller von Displays höchster Qualität

Warum sollten Sie uns und unseren Produkten vertrauen? Riverdi ist der europäische Hersteller von Displays höchster Qualität. Wir stellen seit über 10 Jahren TFT-LCD-Displays her und haben viele Kunden weltweit, an die wir regelmäßig Displays liefern.

Auf unserer Website finden Sie viele verschiedene Display-Serien, aber was wir liefern, ist nicht nur die höchste Qualität der Displays, sondern auch eine perfekte Dokumentation. Auf der Website finden Sie auch 3D-Modelle von jedem Display, die meisten werden mit einem EMI-Bericht geliefert, damit Sie sich über das Emissionsniveau informieren können. Der Bestellvorgang ist benutzerfreundlich, wenn Sie ein Muster bestellen möchten, können Sie es in unserem Webshop kaufen. Gehen Sie einfach auf https://riverdi.com/product-category/stm32-embedded-displays/.

Sie können sich auch an einen unserer Vertriebspartner wenden. Riverdi verfügt über ein umfangreiches Vertriebsnetz mit vielen US-Partnern, die das Display sofort an Sie liefern können.

Bitte denken Sie daran, unseren YouTube-Kanal zu abonnieren und das MITGLIEDSCHAFTSFORMULAR auszufüllen,
um über unsere Riverdi University-Materialien und Live-Veranstaltungen informiert zu bleiben!

window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag("consent", "default", { ad_storage: "denied", ad_user_data: "denied", ad_personalization: "denied", analytics_storage: "denied", functionality_storage: "denied", personalization_storage: "denied", security_storage: "granted", wait_for_update: 2000, }); gtag("set", "ads_data_redaction", true); gtag("set", "url_passthrough", true);