El control de la retroiluminación y la rotación de la pantalla son operaciones básicas de visualización que afectan directamente al comportamiento del sistema en los diseños basados en STM32. Son independientes de la lógica de la aplicación, pero están estrechamente relacionadas con la configuración del hardware y las capacidades del marco gráfico.
En este artículo, explicamos cómo los módulos de pantalla STM32 de Riverdi implementan el control de retroiluminación basado en PWM utilizando TIM15 y un controlador LED dedicado, y cómo la rotación de la pantalla se gestiona de forma diferente en los proyectos LVGL y TouchGFX. Nos centramos en los detalles prácticos de la implementación y en la separación arquitectónica.
Control de retroiluminación en pantallas Riverdi STM32
El control de la retroiluminación es una de las operaciones más fundamentales cuando se trabaja con pantallas integradas. A diferencia del renderizado de gráficos o del manejo táctil, el control de la retroiluminación es independiente del marco de la interfaz gráfica de usuario y no depende de si la aplicación utiliza LVGL, TouchGFX u otra pila de gráficos.
En los módulos de pantalla Riverdi basados en STM32, el brillo de la retroiluminación se controla mediante una señal PWM de hardware, generada por un temporizador STM32.
Módulos STM32 Riverdi compatibles
El método descrito en este artículo se aplica a los módulos de visualización STM32 de Riverdi, como por ejemplo
- RVT121
- RVT101
- RVT70
- RVT50
El mismo principio puede utilizarse en otras plataformas STM32 de Riverdi que expongan una entrada de retroiluminación controlada por PWM.
Principio de control de la retroiluminación
En los módulos de pantalla Riverdi basados en STM32, el microcontrolador no controla directamente la retroiluminación LED. En su lugar, el STM32 genera una señal de control PWM, que se introduce en un circuito dedicado de controlador de retroiluminación LED.
El controlador de retroiluminación es una fuente de corriente constante, diseñada para regular la corriente que fluye a través de las cadenas de LED. La señal PWM no modula directamente la tensión de los LED. En su lugar, controla el ciclo de trabajo efectivo del driver, permitiendo que la corriente media de los LED varíe entre el 0% y el 100% de su valor nominal.
La arquitectura puede resumirse como sigue:
- El temporizador de la STM32 (por ejemplo, TIM15) genera una señal PWM.
- La señal PWM se dirige a la entrada del controlador de retroiluminación.
- El controlador de la retroiluminación regula la corriente del LED.
- l ciclo de trabajo de la señal PWM determina la luminosidad efectiva.
Es decir:
- La frecuencia PWM se define mediante la configuración del temporizador
- El brillo es proporcional al ciclo de trabajo PWM.
- La corriente del LED siempre está regulada por el driver, no por el GPIO de la MCU.
Mayor ciclo de trabajo → mayor corriente media del LED → pantalla más brillante
Ciclo de trabajo más bajo → corriente LED media más baja → visualización más tenue
Porque los LED son accionados por una fuente de corriente regulada:
- El control del brillo es lineal y estable,
- La vida útil de los LED está protegida,
- el comportamiento térmico es predecible,
- La eficiencia se mantiene alta en todo el rango de funcionamiento.
Este enfoque proporciona:
- Control suave del brillo,
- baja pérdida de potencia,
- regulación correcta de la corriente de la retroiluminación LED,
- total independencia del hardware del marco de la interfaz gráfica de usuario.
Requisitos de hardware y software


Antes de ajustar el nivel de retroiluminación, asegúrate de que:
- la pantalla está correctamente conectada al módulo STM32,
- la placa está conectada a un PC mediante ST-Link,
- el proyecto se construye utilizando una plantilla de software compatible (LVGL o TouchGFX).
Para controlar la retroiluminación no es necesario modificar la configuración del marco de la interfaz gráfica de usuario.
Temporizador utilizado para el control de la retroiluminación
En los módulos de pantalla STM32 de Riverdi, la retroiluminación se controla mediante:
- TIM15 (en las infraestructuras U5 y H7)
- Salida PWM por hardware
- Canal 1
La configuración PWM se encuentra en el archivo de proyecto tim.c, dentro de la función MX_TIM15_Init().
Ejemplo de configuración PWM
El canal PWM se configura utilizando estructuras HAL estándar de STM32:
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();
}El parámetro más importante aquí es sConfigOC.Pulse.
Rango de luminosidad y significado
El brillo de la retroiluminación se controla mediante el ciclo de trabajo PWM:
- 0 → Luz de fondo APAGADA
- 998 → luminosidad máxima
Cualquier valor entre 0 y 998 da como resultado un nivel de brillo proporcional.
Ajuste del brillo en tiempo de funcionamiento
Además de la configuración estática, el nivel de retroiluminación también se puede cambiar en tiempo de ejecución escribiendo directamente en el registro del temporizador:
TIM15->CCR1 = tu_nuevo_valor_impulso;
Esto permite:
- control dinámico del brillo,
- regulación basada en la luz ambiental,
- modos de ahorro de energía,
- Efectos suaves de fundido de entrada y salida.
No es necesario reiniciar la pantalla.
Rotación de pantalla en pantallas STM32
A diferencia del control de la retroiluminación, la rotación de la pantalla no es una operación puramente de hardware en STM32.
El periférico controlador de pantalla LCD TFT (LTDC) no admite la rotación de la imagen, lo que significa que la rotación debe gestionarse en el nivel del marco gráfico.
Dependiendo del marco GUI elegido, la implementación difiere significativamente.
En este apartado se explican los dos enfoques utilizados en las pantallas STM32 de Riverdi:
- Rotación basada en LVGL
- Rotación basada en TouchGFX
Rotación de pantalla con LVGL
Cuando se utilizan módulos de visualización Riverdi STM32 con paneles RGB, el periférico STM32 LTDC transmite los píxeles de la memoria línea a línea. Como el LTDC no admite la rotación por hardware, la única forma fiable de rotar la imagen es hacerlo por software antes de que los píxeles lleguen al framebuffer del LTDC.
LVGL admite la rotación de la pantalla mediante:
lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_xxx);
donde xxx puede ser 0, 90, 180 o 270.
Sin embargo, esta llamada actualiza el sistema de coordenadas interno de LVGL y el manejo del diseño -no rota automáticamente los datos de píxel para las canalizaciones RGB basadas en LTDC-. Por esa razón, la rotación de píxeles debe manejarse dentro de la llamada de retorno de LVGL.
Dónde encaja la rotación en el canal LVGL
En esta configuración:
- LVGL renderiza pequeños «mosaicos» en un búfer de trabajo (px_map) utilizando el modo de renderizado PARCIAL.
- La llamada de retorno (disp_flush) escribe los mosaicos renderizados en el framebuffer LTDC.
- Si la rotación está activada, la llamada de retorno a la descarga rota el azulejo antes de escribirlo en el framebuffer.
- Las coordenadas táctiles se mantienen constantes porque LVGL conoce la rotación actual de la pantalla.
Inicialización LVGL (renderizado PARCIAL + rotación)
La pantalla se crea y configura en lvgl_port_display.c:
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);
/* Establece la rotación deseada */
lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_90);
/* Registra la llamada de retorno de descarga */
lv_display_set_flush_cb(disp, disp_flush);
}

Flush callback (rotación software en framebuffer LTDC)
A continuación se muestra la llamada de retorno de descarga utilizada para las pantallas Riverdi STM32 con LTDC.
Admite la rotación por:
- Transformar el área de destino mediante lv_display_rotate_area(), y
- Rota los datos de los píxeles mediante lv_draw_sw_rotate() antes de escribirlos en el framebuffer
.
static void disp_flush(lv_display_t * pantalla,
const lv_area_t * área,
uint8_t * px_map)
{
lv_color_format_t cf = lv_display_get_color_format(pantalla);
uint32_t px_size = lv_color_format_get_size(cf); /* RGB565 = 2 bytes */
/* Calcula el área de destino tras la rotación */
lv_area_t rotar_área = *área;
lv_área_de_rotación_de_pantalla(pantalla, &área_de_rotación);
int32_t src_w = lv_area_get_width(área);
int32_t src_h = lv_area_get_height(área);
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);
/* Dirección del búfer de trama LTDC */
uint8_t * fb = (uint8_t *)hltdc.LayerCfg[0].FBStartAdress;
fb += (rot_area.y1 * fb_stride) + (rot_area.x1 * px_size);
/* Mantenimiento de la caché (necesario cuando el framebuffer está en SDRAM externa) */
SCB_CleanInvalidateDCache();
lv_display_rotation_t r = lv_display_get_rotation(pantalla);
if(r == LV_DISPLAY_ROTATION_0) {
/* Trayectoria rápida: sin rotación */
for(int32_t y = 0; y < src_h; y++) {
lv_memcpy(fb, px_map, src_stride);
px_map += src_stride;
fb += fb_stride;
}
} si no {
/* Gira el azulejo renderizado directamente en el framebuffer */
lv_draw_sw_rotate(px_map, fb,
src_w, src_h,
src_stride, fb_stride,
r, cf);
}
/* Notifica a LVGL que la descarga se ha completado */
lv_display_flush_ready(pantalla);
}Resultado
Con este planteamiento:
- la imagen se gira físicamente antes de la salida LTDC,
- El diseño y la representación de LVGL siguen siendo coherentes,
- las coordenadas táctiles permanecen alineadas con la IU girada,
- no es necesario modificar la configuración de temporización LTDC.
Rotación de pantalla en STM32 usando TouchGFX
A diferencia de LVGL, TouchGFX gestiona la rotación de la pantalla a nivel de marco y configuración. En la mayoría de los proyectos de visualización Riverdi basados en STM32, se puede activar la rotación sin modificar los controladores de pantalla de bajo nivel ni el código de gestión del búfer de trama.
Esto hace que TouchGFX sea especialmente práctico cuando:
- la orientación de la pantalla se conoce en el momento del diseño,
- la rotación no necesita modificarse dinámicamente en tiempo de ejecución,
- se prefiere un enfoque rápido y mantenible basado en la configuración.
Concepto de rotación TouchGFX
TouchGFX abstrae el canal de visualización y lo gestiona:
- disposición del búfer de trama,
- orientación de la representación,
- transformaciones de coordenadas,
- mapeo de entrada táctil.
En consecuencia:
- no es necesaria la rotación manual de píxeles en la ruta de descarga LTDC,
- no es necesaria ninguna manipulación personalizada del búfer de fotogramas,
- La rotación se aplica de forma coherente en el renderizado y en la entrada táctil.
Activar la rotación de pantalla en el diseñador TouchGFX
La rotación de la pantalla se configura directamente en TouchGFX Designer.
La denominación exacta puede diferir ligeramente según la versión de TouchGFX, pero el flujo de trabajo de
es coherente.
Paso 1-Abrir Configuración de Pantalla
En Diseñador TouchGFX:
- Abre tu proyecto.
- Navega hasta la sección Pantalla / Placa / Configuración de la Aplicación.
- Localiza el ajuste Orientación de la pantalla o Rotación de la pantalla.
Resumen
En los módulos Riverdi STM32, el brillo de la retroiluminación se controla mediante PWM de hardware generado por TIM15 y regulado por un controlador LED de corriente constante. El ciclo de trabajo define el brillo, independientemente del marco GUI, lo que permite un funcionamiento estable y predecible.
La rotación de la pantalla no es compatible con el hardware LTDC y debe gestionarse en la capa gráfica. En LVGL, la rotación requiere una transformación de píxeles por software en la llamada de retorno a la pantalla. En TouchGFX, la rotación se configura a nivel de marco sin modificar los controladores de pantalla de bajo nivel
Separar el control a nivel de hardware de las responsabilidades de la capa gráfica garantiza una arquitectura limpia y un comportamiento fiable en los sistemas de visualización basados en STM32.
DESCUBRE NUESTRA
Libro Blanco
Consigue una interacción perfecta entre el usuario y la pantalla con el CI de sensor táctil adecuado. ¿Te has enfrentado alguna vez a problemas con eventos táctiles fantasma o de certificación? ¡Impulsa tu I+D como un profesional con nuestro Libro Blanco!



