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:
- Transformieren des Zielbereichs über lv_display_rotate_area(), und
- 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:
- Öffnen Sie Ihr Projekt.
- Navigieren Sie zum Abschnitt Display / Karte / Anwendungskonfiguration.
- 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!



