基本嵌入式图形系统由微控制器、帧缓冲器、显示控制器和显示屏组成。 • 微控制器对要在帧缓冲器中显示的图像进行计算,以组成图标或图像等图形基元。CPU 通过运行图形库软件来执行此过程。该过程可以由图形库使用专用硬件(如DMA2D Chrom-Art Accelerator®)来加速。帧缓冲器更新的频率越高,动画越流畅(动画每秒 帧数)。
• 帧缓冲器是一个易失性存储器,用于存储要显示图像的像素数据。该存储区通常称为图 形RAM(GRAM)。所需帧缓冲器大小取决于显示器的分辨率和色深。帧缓冲存储器大小要求和位置。 – 双缓冲技术使用两个帧缓冲器,可以避免显示正在写入帧缓冲器的内容。
• 显示控制器持续“刷新”显示器,以每秒60次(60Hz)的速度将帧缓冲器内容传送到显 示屏。显示控制器可以嵌入显示模块或MCU中。
• 显示屏由显示控制器来驱动,并负责显示图像(由像素矩阵组成)。 显示器特性为: – 显示尺寸(分辨率):由显示像素数定义,表示为水平(像素数)×垂直(行 数)。 – 色深:定义可以绘制像素的颜色数量。它以每像素位数(bpp)来表示。对于24 bpp的色深(也可以用RGB888表示),一个像素可以有16777216种颜色表示。 – 刷新率(以Hz为单位):显示面板每秒刷新的次数。因为刷新率较低时产生的视 觉效果不佳,所以显示器每秒钟刷新60次(60 Hz)。
显示模块类别 显示模块分为两大类,取决于它们是否嵌入了内部控制器和GRAM。
• 第一类对应于具有显示屏控制器和GRAM的显示器。
• 第二类对应的显示器,其显示屏没有主控制器,仅有低电平时序控制器。 要连接无控制器和GRAM的显示器,所用帧缓冲器可以位于MCU的内部SRAM中或位于外部存储器SDRAM中。
在STM32H7S78系列中,内置了LTDC控制器,可以方便的进行LCD显示开发。
LTDC是以逐行方式读取图像数据的控制器。其存储器访问模式的长度为64字节,但当到达一行的结尾并且剩余数据少于64个字节时,LTDC将提取剩余的数据。
在每个像素时钟上升沿或时钟下降沿,并在屏幕有效区域内,LTDC层从其FIFO中检索一个像素数据,将其转换为内部ARGB8888像素格式,并将其与背景和/或其他图层像素颜色进行混合。得到的像素以RGB888格式编码,通过抖动单元并被驱动到RGB接口中。像素便会显示到屏幕上。
下面是实验部分:
首先是基本参数设置:
其次是Layer设置:
下面准备要显示的图片素材:
使用image Converter把jpg等格式文件转换为ARGB8888:
导出转换文件
把生成的.h文件放置到工程目录:
在源文件中添加引用:
#include "TESTIMAGE_800x480_ARGB8888.h"
LTDC初始化代码,位于函数static void MX_LTDC_Init(void)中:
static void MX_LTDC_Init(void)
{
/* USER CODE BEGIN LTDC_Init 0 */
/* USER CODE END LTDC_Init 0 */
LTDC_LayerCfgTypeDef pLayerCfg = {0};
/* USER CODE BEGIN LTDC_Init 1 */
/* USER CODE END LTDC_Init 1 */
hltdc.Instance = LTDC;
hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
hltdc.Init.HorizontalSync = 3;
hltdc.Init.VerticalSync = 3;
hltdc.Init.AccumulatedHBP = 11;
hltdc.Init.AccumulatedVBP = 11;
hltdc.Init.AccumulatedActiveW = 811;
hltdc.Init.AccumulatedActiveH = 491;
hltdc.Init.TotalWidth = 819;
hltdc.Init.TotalHeigh = 499;
hltdc.Init.Backcolor.Blue = 0;
hltdc.Init.Backcolor.Green = 0;
hltdc.Init.Backcolor.Red = 0;
if (HAL_LTDC_Init(&hltdc) != HAL_OK)
{
Error_Handler();
}
pLayerCfg.WindowX0 = 0;
pLayerCfg.WindowX1 = 800;
pLayerCfg.WindowY0 = 0;
pLayerCfg.WindowY1 = 480;
pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
pLayerCfg.Alpha = 127;
pLayerCfg.Alpha0 = 0;
pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
pLayerCfg.FBStartAdress = (uint32_t)&image_data_flower;
pLayerCfg.ImageWidth = 800;
pLayerCfg.ImageHeight = 480;
pLayerCfg.Backcolor.Blue = 0;
pLayerCfg.Backcolor.Green = 0;
pLayerCfg.Backcolor.Red = 0;
if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN LTDC_Init 2 */
/* USER CODE END LTDC_Init 2 */
}
主函数中调用MX_LTDC_Init();进行初始化即可。
显示效果:
|