打印
[STM32H7]

【STM32H7S78-DK测评】LTDC显示全彩照片

[复制链接]
36|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SJZhu|  楼主 | 2024-10-5 09:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
基本嵌入式图形系统由微控制器、帧缓冲器、显示控制器和显示屏组成。 • 微控制器对要在帧缓冲器中显示的图像进行计算,以组成图标或图像等图形基元。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();进行初始化即可。


显示效果:


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

16

帖子

0

粉丝