STM32的“GPU”——DMA2D模块
前置知识:
-
帧缓冲
帧缓冲是一个内存区域,用于存储即将显示的图像的像素数据。每个像素的颜色值在帧缓冲中都有一个对应的存储位置。帧缓冲的内容会在每一帧的显示周期中被读取并渲染到显示设备上。
1. 帧缓冲的结构
- 像素格式:帧缓冲中的每个像素通常以特定的格式存储,例如:
- RGB565:每个像素用 16 位表示,5 位红色、6 位绿色和 5 位蓝色。
- RGBA8888:每个像素用 32 位表示,8 位红色、8 位绿色、8 位蓝色和 8 位透明度。
- 分辨率:帧缓冲的大小通常与显示器的分辨率相匹配。例如,对于一个 800x600 像素的显示器,帧缓冲需要至少 480,000 个像素的存储空间。
2. 帧缓冲的工作原理
- 图像生成:应用程序或图形库生成图像帧,并将每个像素的颜色值写入帧缓冲中。
- 显示刷新:显示器在每个刷新周期(通常是每秒 60 次或更多次)读取帧缓冲中的数据,并将其渲染到屏幕上。
- 双缓冲技术:为了避免图像撕裂和闪烁,通常使用双缓冲技术,即设置两个帧缓冲(前缓冲和后缓冲)。绘制时,先在后缓冲上生成完整的图像,然后一旦图像生成完毕,交换前后缓冲进行显示。
- 像素格式:帧缓冲中的每个像素通常以特定的格式存储,例如:
-
TFT液晶控制器(LTDC)概述
TFT(薄膜晶体管)液晶显示器控制器是用于驱动和控制TFT液晶显示器的硬件组件。它主要用于嵌入式系统,尤其是在STM32系列微控制器中,LTDC提供了一种高效的方式来处理图形显示和图像渲染。
-
帧缓冲
LTDC依赖帧缓冲区来存储即将显示的图像数据。帧缓冲区通常位于外部RAM或内部RAM中,包含图像的像素信息。 -
LTDC支持多个图层(Layer)
每个图层可以独立管理自己的图像数据和属性(如透明度、位置、大小、颜色格式等)。各图层可以叠加显示,支持复杂的图形效果和界面布局。 -
像素时钟和同步信号
LTDC生成必要的时钟信号(像素时钟)和同步信号(水平和垂直同步信号),以确保液晶显示器正确地显示图像。像素时钟控制每个像素的显示频率,而同步信号则用于同步显示器的刷新。 -
图像数据传输
在每个刷新周期,LTDC从帧缓冲区读取图像数据,并将其发送到显示器。LTDC可以通过硬件加速快速处理这些数据,减少CPU的干扰。 -
图形处理
LTDC支持硬件图形处理功能,如颜色填充、图像合成等。这些操作通常在显示更新时进行,以减少CPU负担。
使用原理
-
初始化LTDC:
- 在使用LTDC之前,需要进行初始化,包括设置显示参数(如分辨率、颜色格式、时钟频率等)。
- 配置多个图层的属性,包括启用/禁用、透明度、位置等。
-
配置帧缓冲:
- 分配帧缓冲区,并将其地址配置到LTDC中。每个图层可以有自己的帧缓冲,允许灵活的图像管理。
-
更新图像数据:
- 应用程序在需要更新显示内容时,向帧缓冲区写入新的图像数据。
- LTDC会在下一个刷新周期自动显示这些更新。
-
控制显示状态:
- LTDC允许控制显示的状态,例如启动、停止、刷新等。这可以通过配置寄存器或使用中断方式来实现。
-
调试和优化:
- 在开发和调试过程中,可以监测LTDC的状态和性能,优化图像更新的效率。
- 通过合理管理图层和帧缓冲,可以提高系统的响应速度和用户体验。
DMA2D
主要功能
-
-
颜色填充(矩形区域)
-
功能描述:
-
-
- 颜色填充功能允许用户在指定的矩形区域内填充一种颜色。该操作通常用于初始化图像区域或重绘界面部分。
-
实现过程:
-
-
- 用户需要指定矩形的起始位置(x, y)、宽度和高度,以及要填充的颜色。
- DMA2D 会在后台执行填充操作,直接在内存中修改指定区域的像素值,而无需 CPU 参与。
-
-
-
图像(内存)复制
-
功能描述:
-
-
- 图像复制功能允许将一块内存区域(源图像)中的像素数据复制到另一块内存区域(目标图像)。
-
实现过程:
-
-
- 用户需要提供源图像和目标图像的地址、宽度和高度。
- DMA2D 将自动处理数据的复制,支持不同的颜色格式,确保在复制过程中保持图像质量。
-
-
-
颜色格式转换
-
功能描述:
-
-
- 颜色格式转换功能允许将图像数据从一种颜色格式转换为另一种,例如从 YCbCr 转换为 RGB 或从 RGB888 转换为 RGB565。
-
实现过程:
-
-
- 用户需要指定源颜色格式和目标颜色格式,并提供相应的源和目标内存地址。
- DMA2D 会自动进行颜色格式的转换,处理图像数据中的像素值,确保转换后的图像保持正确的色彩。
-
-
-
透明度混合(Alpha Blend)
-
功能描述:
-
-
- 透明度混合功能使得可以在图像合成时考虑透明度(Alpha 通道),允许将多个图像层叠加在一起,产生混合效果。
-
实现过程:
-
-
- 用户需要指定前景图像和背景图像的地址、位置、大小以及透明度值。
- DMA2D 在合成图像时,会根据指定的透明度计算每个像素的最终颜色值,从而实现平滑的混合效果。
-
工作模式
就像传统DMA有外设到外设,外设到存储器,存储器到外设三种工作模式一样,DMA2D作为一个DMA,也分为以下四种工作模式:
-
-
寄存器到存储器
-
存储器到存储器
-
存储器到存储器并执行像素颜色格式转换
-
存储器到存储器且支持像素颜色格式转换和透明度混合
-
实现方法
-
-
颜色填充
-
只是进行内存填充,而不需要进行内存拷贝,所以让DAM2D工作在“寄存器到存储器模式”,通过设置DMA2D的DMA2D_CR寄存器的[17:16]位为11来实现。
设置待填充矩形的起始地址,宽度,高度。起始地址由寄存器DMA2D_OMAR设置,宽度高度由寄存器AMD2D_NLR设置。
因为矩形在内存中的地址不连续,所以需要设置DMA2D在填充完一行的数据后,需要跳过的像素数量。这个值由DMA2D_OOR寄存器管理。计算跳过的像素数量有一个简单的方法,即显示区域的宽度减去矩形的宽度即可。
设置填充区域的颜色以及颜色格式。这分别由寄存器AMDD2_OCOLR和AMDD2_OPFCCR寄存器来管理,其中颜色格式由LTDC_PIXEL_FORMAT_XXX宏来定义。
上述已经将DMA2D配置好了,接下来只需要启动传输并且等待传输完成即可。通过设置DMA2D_CR来启动传输。DAM2D传输完成后,会自动把CR寄存器的第0位设置为0,故可通过判断这一位的值来判断传输是否完成。(当使用OS时为什么不使用中断而选择while死等?因为DMA2D进行内存填充的速度实在是太快了,以至于OS切换任务的开销都比这个时间要长,所以即便使用了OS,我们还是会选择死等。)
-
-
图片显示(内存复制)
-
核心思想:将目标图片的数据通过DMA2D直接传输到帧缓冲中。
显示一张静态图片
首先设置工作模式设定为“存储器到存储器模式”,通过设置DMA2D的DMA2D_CR寄存器的[17:16]位为00来实现。
然后要分别设置源和目标的内存地址,需要考虑数据源是否因为内存对齐等原因而存在内存偏移,所以我们要根据实际情况设定源和目标位置的数据偏移。通过寄存器DMA2D_FGMAR设置源地址,通过寄存器DMA2D_OMAR设置目标地址,通过寄存器DMA2D_FGOR设置源数据偏移,通过寄存器DMA2D_OOR设置目标地址偏移。
然后设置要复制的图像的宽和高,以及颜色格式。通过寄存器DMA2D_NLR设置图像宽高,通过寄存器DMA2D_FGPFCCR设置颜色格式。
上述已经将DMA2D配置好了,接下来只需要启动传输并且等待传输完成即可。
显示一个动图
基本原理和显示一张图片类似,只是关键在于一定的间隔轮流显示每一帧图像,就可以在屏幕上实现动图效果了。要注意考虑源地址和目标地址的实际偏移情况 。
图片渐变切换
前置知识:1、DMA2D硬件知识:
-
Alpha通道的基本概念
Alpha通道是图像中用于表示每个像素透明度的一个额外通道。它通常与红色、绿色和蓝色(RGB)通道一起使用,形成RGBA模型:
-
R:红色分量
-
G:绿色分量
-
B:蓝色分量
-
A:Alpha通道,取值范围通常为0到255或0.0到1.0,表示透明度。
-
0表示完全透明(不可见)。
-
255或1.0表示完全不透明(完全可见)。
-
-
Alpha通道功能
DMA2D支持通过Alpha通道进行图像合成,包括以下几种主要功能:
-
图像混合:DMA2D可以根据源图像和目标图像的Alpha通道值,计算出最终显示的颜色。这使得在图像重叠时,可以实现平滑的透明效果。
-
色彩键控:在某些应用中,可以使用Alpha通道来实现色彩键控(Chroma Keying),即将特定颜色(如绿色背景)替换为透明区域。
-
渐变和阴影效果:利用Alpha通道,DMA2D可以轻松实现渐变效果和阴影效果,从而增强视觉表现。
-
-
Alpha通道的混合公式
2、前景层FIFO和背景层FIFO
前景层FIFO和背景层FIFO的协同工作是DMA2D高效图像处理的关键:
-
-
-
-
数据流动:DMA2D从前景层FIFO读取待处理的图像数据,并从背景层FIFO获取背景图像数据。这样的设计确保了数据处理的顺序和完整性。
-
混合计算:在进行图像混合时,DMA2D会根据前景层的Alpha通道值与背景层的颜色进行计算,生成最终的显示颜色。这种计算方式确保了图像的真实感和深度。
-
降低延迟:由于FIFO能够快速读取数据,DMA2D的整体延迟降低,使得用户界面和图形应用响应更为迅速。
-
-
-
3、CLUT 接口
CLUT是一个用于存储颜色映射的表,它将每个像素的索引值映射到具体的颜色值。CLUT常用于索引颜色模式中,特别是在内存资源有限的情况下,可以减少所需的存储空间。
CULT接口功能:
-
-
-
-
颜色映射:DMA2D可以根据CLUT中的索引值快速查找和获取对应的颜色值。在处理图像时,DMA2D会根据每个像素的索引值,从CLUT中获取实际的RGB颜色。
-
支持多种颜色格式:CLUT接口可以支持多种颜色格式,如8位、16位或更高位数的颜色深度,能够适应不同应用场景的需求。
-
动态更新:在某些应用中,CLUT的内容可以动态更新,这意味着可以在运行时改变颜色映射,使得图像可以适应不同的显示需求。
-
透明度处理:CLUT接口可以与Alpha通道信息结合使用,允许在处理过程中实现透明度效果,使得图像合成更加自然。
-
-
-
CLUT接口的工作流程:
- 初始化CLUT:在开始处理之前,系统需要先定义并初始化CLUT。设置每个索引值对应的颜色值。
- 设置图像格式:配置DMA2D的图像格式,包括前景图像和背景图像的格式,确保它们与CLUT的配置相匹配。
- 数据输入:将待处理的图像数据输入到DMA2D,通常是像素的索引值。
- 颜色查找:DMA2D在处理每个像素时,根据像素的索引值从CLUT中查找相应的颜色值,并将其应用于图像生成。
- 输出图像:经过处理,生成的图像将包含根据CLUT映射的颜色值,并可以输出到显示设备或存储介质。
4、像素格式转换器(PFC)
像素格式转换器是一个关键组件,负责在不同的图像格式之间进行转换。
PFC的工作流程通常包括以下几个步骤:
-
-
-
- 初始化:在开始处理之前,配置DMA2D模块和PFC,指定源图像和目标图像的格式。
-
-
-
-
-
- 数据输入:将源图像数据输入到DMA2D,通常是存储在内存中的图像数据。
-
-
-
-
-
- 格式转换:PFC会根据配置,从源格式中读取像素数据,并将其转换为目标格式。这个过程可能涉及到颜色空间的转换、通道数的调整等。
-
-
-
-
-
- 输出图像:经过格式转换后,生成的图像将存储到目标内存位置,供后续处理或直接显示。
-
-
5、透明度混合
使用例子:
如何实现渐变?
使用DMA2D的”存储器到存储器并执行 PFC 和混合“模式实现渐变效果。
首先使能DAM2D的带颜色混合的存储器到存储器模式,对应AMD2D_CR寄存器[17:16]位的值为10。
然后分别设置前景、背景和输出数据的内存地址和数据传输偏移、传输图像的宽和高。设置方式同上。
接着设置颜色格式,这一步需要格外注意。如果使用的是ARGB这样的颜色格式,那么我们进行透明度混合时,颜色数据中本身的alpha通道就会对混合结果产生影响,所以我们这里要设定在进行混合操作时,忽略前景色自身的alpha通道,并强制设定混合时的透明度。关于透明度的设置,详见寄存器AMD2D_FGPFCCR。
代码操作如下:
分析:"pixelFormat" 设置CM[3:0]颜色模式;
"(1UL << 16)"将位16设置为1,使之忽略前景颜色数据中的Alpha通道,将原始前景层图像的 alpha 通道值替换为 ALPHA[7: 0],防止颜色数据中本身的alpha通道就会对混合结果产生影响。
" ((uint32_t)opa << 24) "设置前景色不透明度。
最后,启动传输即可。
!!!注意:有时会遇到一张带有透明通道的图片与背景叠加显示的情况,此时就不应该禁用颜色本身的alpha通道。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理