Link in die Zwischenablage kopiert!

Ein Leitfaden für grundlegende Display-Operationen auf STM32

Back to top

Die Steuerung der Hintergrundbeleuchtung und die Drehung des Bildschirms sind zentrale Display-Operationen, die das Systemverhalten von STM32-basierten Designs direkt beeinflussen. Sie sind unabhängig von der Anwendungslogik, aber eng mit der Hardwarekonfiguration und den Funktionen des Grafik-Frameworks verbunden.

In diesem Artikel erklären wir, wie Riverdi STM32-Displaymodule die PWM-basierte Steuerung der Hintergrundbeleuchtung mit TIM15 und einem speziellen LED-Treiber implementieren und wie die Bildschirmdrehung in LVGL- und TouchGFX-Projekten unterschiedlich gehandhabt wird. Der Schwerpunkt liegt dabei auf praktischen Implementierungsdetails und der architektonischen Trennung.

Steuerung der Hintergrundbeleuchtung von Riverdi STM32-Displays

Die Steuerung der Hintergrundbeleuchtung ist eine der grundlegendsten Operationen bei der Arbeit mit eingebetteten Displays. Im Gegensatz zum Grafik-Rendering oder der Touch-Behandlung ist die Steuerung der Hintergrundbeleuchtung unabhängig vom GUI-Framework und hängt nicht davon ab, ob die Anwendung LVGL, TouchGFX oder einen anderen Grafik-Stack verwendet.

Bei Riverdi STM32-basierten Displaymodulen wird die Helligkeit der Hintergrundbeleuchtung über ein Hardware-PWM-Signal gesteuert , das von einem STM32-Timer erzeugt wird.

Unterstützte Riverdi STM32 Module

Die in diesem Artikel beschriebene Methode gilt für Riverdi STM32 Displaymodule wie z.B.:

  • RVT121
  • RVT101
  • RVT70
  • RVT50

Das gleiche Prinzip kann auf anderen Riverdi STM32-Plattformen verwendet werden, die über einen PWM-gesteuerten Eingang für die Hintergrundbeleuchtung verfügen.

Prinzip der Steuerung der Hintergrundbeleuchtung

In Riverdi STM32-basierten Display-Modulen steuert der Mikrocontroller die LED-Hintergrundbeleuchtung nicht direkt an. Stattdessen erzeugt der STM32 ein PWM-Steuersignal, das in eine spezielle Treiberschaltung für die LED-Hintergrundbeleuchtung eingespeist wird .

Der Hintergrundbeleuchtungstreiber ist eine Konstantstromquelle, die den durch die LED-Strings fließenden Strom reguliert. Das PWM-Signal moduliert die LED-Spannung nicht direkt. Stattdessen steuert es das effektive Tastverhältnis des Treibers, so dass der durchschnittliche LED-Strom zwischen 0% und 100% seines Nennwerts variieren kann.

Die Architektur lässt sich wie folgt zusammenfassen:

  • Der STM32 Timer (z.B. TIM15) erzeugt ein PWM-Signal.
  • Das PWM-Signal wird an den Treibereingang für die Hintergrundbeleuchtung weitergeleitet.
  • Der Hintergrundbeleuchtungstreiber regelt den LED-Strom.
  • as Tastverhältnis des PWM-Signals bestimmt die effektive Helligkeit.

Dies bedeutet:

  • Die PWM-Frequenz wird durch die Timer-Konfiguration definiert
  • Die Helligkeit ist proportional zum PWM-Tastverhältnis.
  • Der LED-Strom wird immer durch den Treiber geregelt, nicht durch den GPIO der MCU.

Höhere Einschaltdauer → höherer durchschnittlicher LED-Strom → helleres Display

Geringeres Tastverhältnis → geringerer durchschnittlicher LED-Strom → düsterere Anzeige

Denn die LEDs werden von einer geregelten Stromquelle betrieben:

  • Die Helligkeitssteuerung ist linear und stabil,
  • Die Lebensdauer der LED ist geschützt,
  • Das thermische Verhalten ist vorhersehbar,
  • Die Effizienz bleibt über den gesamten Betriebsbereich hoch.

Dieser Ansatz bietet:

    • stufenlose Helligkeitsregelung,
  • geringe Verlustleistung,
  • die richtige Stromregelung der LED-Hintergrundbeleuchtung,
  • vollständige Hardware-Unabhängigkeit vom GUI-Framework.

Hardware- und Softwareanforderungen

Vergewissern Sie sich vor der Einstellung der Hintergrundbeleuchtung, dass:

  • das Display richtig mit dem STM32-Modul verbunden ist,
  • die Karte ist über ST-Link mit einem PC verbunden,
  • das Projekt mit einer unterstützten Softwarevorlage (LVGL oder TouchGFX) erstellt wurde.

Für die Steuerung der Hintergrundbeleuchtung sind keine Änderungen an der GUI-Framework-Konfiguration erforderlich.

Timer für die Steuerung der Hintergrundbeleuchtung

Bei Riverdi STM32-Displaymodulen wird die Hintergrundbeleuchtung mit gesteuert:

  • TIM15 (auf beiden Infrastrukturen U5 und H7)
  • Hardware PWM-Ausgang
  • Kanal 1

Die PWM-Konfiguration finden Sie in der Projektdatei tim.c, innerhalb der Funktion MX_TIM15_Init().

Beispiel für eine PWM-Konfiguration

Der PWM-Kanal wird mit Hilfe der Standard STM32 HAL-Strukturen konfiguriert:

sConfigOC.OCMode = TIM_OCMODE_PWM1;

sConfigOC.Pulse = 998;

sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;

if (HAL_TIM_PWM_ConfigChannel(&htim15, &sConfigOC, TIM_CHANNEL_1) !=
HAL_OK)
{
Error_Handler();
}

Der wichtigste Parameter ist hier sConfigOC.Pulse.

Helligkeitsbereich und Bedeutung

Die Helligkeit der Hintergrundbeleuchtung wird durch das PWM-Tastverhältnis gesteuert:

  • 0 → Hintergrundbeleuchtung AUS
  • 998 → maximale Helligkeit

Jeder Wert zwischen 0 und 998 ergibt eine proportionale Helligkeitsstufe.

Einstellung der Laufzeithelligkeit

Zusätzlich zur statischen Konfiguration kann die Beleuchtungsstärke auch während der Laufzeit geändert werden, indem direkt in das Timer-Register geschrieben wird:

TIM15->CCR1 = Ihr_neuer_Impulswert;

Dies ermöglicht:

  • dynamische Helligkeitskontrolle,
  • Dimmen mit Umgebungslicht,
  • Energiesparmodi,
  • weiche Ein- und Ausblendungseffekte.

Eine Neuinitialisierung des Displays ist nicht erforderlich.

Bildschirmdrehung auf STM32-Displays

Im Gegensatz zur Steuerung der Hintergrundbeleuchtung ist die Drehung des Bildschirms keine reine Hardware-Operation auf dem STM32.
Die LCD TFT Display Controller (LTDC) Peripherie unterstützt die Bilddrehung nicht, was bedeutet, dass die Drehung auf der Grafik-Framework-Ebene.

Je nach dem gewählten GUI-Framework unterscheidet sich die Implementierung erheblich.

Dieser Abschnitt erklärt beide Ansätze, die bei Riverdi STM32-Displays verwendet werden:

  • LVGL-basierte Rotation
  • TouchGFX-basierte Drehung

Bildschirmdrehung mit LVGL

Wenn Sie Riverdi STM32 Displaymodule mit RGB-Panels verwenden, streamt die STM32 LTDC-Peripherie die Pixel zeilenweise aus dem Speicher. Da LTDC keine Hardware-Drehung unterstützt, ist die einzige zuverlässige Möglichkeit, das Bild zu drehen, dies in der Software zu tun, bevor die Pixel den LTDC-Framebuffer erreichen.

LVGL unterstützt die Anzeigendrehung über:
lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_xxx);
wobei xxx 0, 90, 180 oder 270 sein kann.

Dieser Aufruf aktualisiert jedoch das interne LVGL-Koordinatensystem und die Layout-Behandlung. Er dreht die Pixeldaten für LTDC-basierte RGB-Pipelines nicht automatisch. Aus diesem Grund muss die Pixeldrehung innerhalb des LVGL-Flush-Callbacks behandelt werden.

Wo die Rotation in die LVGL-Pipeline passt

In diesem Fall:

  • LVGL rendert kleine „Kacheln“ in einen Arbeitspuffer (px_map) unter Verwendung des PARTIAL-Rendermodus.
  • Der Flush-Callback (disp_flush) schreibt die gerenderten Kacheln in den LTDC-Rahmenpuffer.
  • Wenn die Drehung aktiviert ist, dreht der Flush-Callback die Kachel, bevor er sie in den Framebuffer schreibt.
  • Die Berührungskoordinaten bleiben konsistent, da LVGL die aktuelle Bildschirmdrehung kennt.

LVGL-Initialisierung (PARTIAL Rendering + Rotation)

Das Display wird in lvgl_port_display.c erstellt und konfiguriert:

void lvgl_display_init(void)
{
disp = lv_display_create(MY_DISP_HOR_RES, MY_DISP_VER_RES);

__attribute__((section(".my_ram_d2_data")))
static uint8_t buf1[288 * 1024];

lv_display_set_buffers(disp, (void *)buf1, NULL, sizeof(buf1),
LV_DISPLAY_RENDER_MODE_PARTIAL);

/* Legen Sie die gewünschte Drehung fest */
lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_90);

/* Registrieren Sie den Flush-Callback */
lv_display_set_flush_cb(disp, disp_flush);
}

Flush-Callback (Software-Rotation in LTDC-Framebuffer)

Nachfolgend finden Sie den Flush-Callback, der für Riverdi STM32-Displays mit LTDC verwendet wird.
Es unterstützt die Drehung um:

  1. Transformieren des Zielbereichs über lv_display_rotate_area(), und
  2. Drehen der Pixeldaten mittels lv_draw_sw_rotate() vor dem Schreiben in den
    Framebuffer.
static void disp_flush(lv_display_t * display,
const lv_area_t * area,

uint8_t * px_map)
{
lv_color_format_t cf = lv_display_get_color_format(display);
uint32_t px_size = lv_color_format_get_size(cf); /* RGB565 = 2 Bytes */

/* Berechnen Sie den Zielbereich nach der Drehung */
lv_area_t rot_area = *area;
lv_display_rotate_area(display, &rot_area);

int32_t src_w = lv_area_get_width(area);
int32_t src_h = lv_area_get_height(area);

uint32_t src_stride = lv_draw_buf_width_to_stride(src_w, cf);
uint32_t fb_stride = lv_draw_buf_width_to_stride(MY_DISP_HOR_RES, cf);

/* LTDC-Rahmenpuffer-Adresse */
uint8_t * fb = (uint8_t *)hltdc.LayerCfg[0].FBStartAdress;
fb += (rot_area.y1 * fb_stride) + (rot_area.x1 * px_size);

/* Cache-Wartung (erforderlich, wenn sich der Framebuffer im externen SDRAM befindet) */
SCB_CleanInvalidateDCache();

lv_display_rotation_t r = lv_display_get_rotation(display);

if(r == LV_DISPLAY_ROTATION_0) {
/* Schneller Pfad: keine Drehung */
for(int32_t y = 0; y < src_h; y++) {
lv_memcpy(fb, px_map, src_stride);
px_map += src_stride;

fb += fb_stride;
}
} sonst {
/* Drehen Sie die gerenderte Kachel direkt in den Framebuffer */
lv_draw_sw_rotate(px_map, fb,
src_w, src_h,
src_stride, fb_stride,
r, cf);
}

/* LVGL benachrichtigen, dass die Spülung abgeschlossen ist */
lv_display_flush_ready(display);
}

Ergebnis

Mit diesem Ansatz:

  • wird das Bild vor der LTDC-Ausgabe physisch gedreht,
  • LVGL-Layout und Rendering bleiben konsistent,
  • Die Berührungskoordinaten bleiben an der gedrehten Benutzeroberfläche ausgerichtet,
  • sind keine Änderungen an der LTDC-Zeitkonfiguration erforderlich.

Bildschirmdrehung auf STM32 mit TouchGFX

Im Gegensatz zu LVGL, TouchGFX verwaltet die Bildschirmdrehung auf der Ebene des Frameworks und der Konfiguration. Für die meisten STM32-basierten Riverdi-Display-Projekte kann die Rotation aktiviert werden ohne Änderung der Low-Level-Anzeigetreiber oder des Codes für die Framebuffer-Verarbeitung.

Das macht TouchGFX besonders praktisch, wenn:

  • die Ausrichtung des Displays ist zum Zeitpunkt des Entwurfs bekannt,
  • Rotation muss nicht dynamisch zur Laufzeit geändert werden,
  • wird ein schneller und wartbarer konfigurationsbasierter Ansatz bevorzugt.

TouchGFX Rotationskonzept

TouchGFX abstrahiert die Display-Pipeline und verwaltet sie:

  • Framebuffer-Layout,
  • Rendering-Ausrichtung,
  • Koordinatentransformationen,
  • Zuordnung der Touch-Eingabe.

Das Ergebnis ist:

  • ist keine manuelle Pixeldrehung im LTDC-Spülpfad erforderlich,
  • ist keine benutzerdefinierte Manipulation des Framebuffers erforderlich,
  • Die Rotation wird konsistent auf das Rendering und die Touch-Eingabe angewendet.

Aktivieren der Bildschirmdrehung im TouchGFX-Designer

Die Bildschirmdrehung wird direkt in TouchGFX Designer konfiguriert.

Die genaue Benennung kann je nach TouchGFX-Version leicht variieren, aber der Arbeitsablauf auf
ist einheitlich.

Schritt 1 – Display-Konfiguration öffnen

In TouchGFX Designer:

  1. Öffnen Sie Ihr Projekt.
  2. Navigieren Sie zum Abschnitt Display / Karte / Anwendungskonfiguration.
  3. Suchen Sie die Einstellung Displayausrichtung oder Bildschirmdrehung.

Zusammenfassung

Auf den Riverdi STM32-Modulen wird die Helligkeit der Hintergrundbeleuchtung durch Hardware-PWM gesteuert, die von TIM15 erzeugt und von einem Konstantstrom-LED-Treiber geregelt wird. Das Tastverhältnis definiert die Helligkeit, unabhängig vom GUI-Framework, und ermöglicht so einen stabilen und vorhersehbaren Betrieb.

Die Drehung des Bildschirms wird von der LTDC-Hardware nicht unterstützt und muss in der Grafikschicht behandelt werden. In LVGL erfordert die Drehung eine Software-Pixeltransformation im Flush-Callback. In TouchGFX wird die Drehung auf Framework-Ebene konfiguriert, ohne dass Low-Level-Anzeigetreiber geändert werden müssen.

Die Trennung der Steuerung auf Hardwareebene von den Verantwortlichkeiten auf der Grafikebene gewährleistet eine saubere Architektur und ein zuverlässiges Verhalten in STM32-basierten Displaysystemen.

ENTDECKEN SIE UNSER

Whitepaper

Erzielen Sie die perfekte Interaktion zwischen Benutzer und Display mit dem richtigen Touchsensor-IC. Hatten Sie jemals Probleme mit Phantomberührungen oder Zertifizierungen? Verbessern Sie Ihre Forschung und Entwicklung wie ein Profi mit unserem Whitepaper!

Schauen Sie sich unseren Produktkatalog an und sehen Sie, wie Sie durch Qualität und nicht an Qualität sparen können.

Kontaktieren Sie uns jetzt, sparen Sie mit Qualität, nicht an Qualität.