DMA2D 是一个专门用于2D图形操作的硬件加速器,常见于STM32等微控制器中。它的本质是一个特殊的DMA控制器,但相比于常规DMA只能进行内存到内存、内存到外设的数据线性搬运,DMA2D增加了图形处理能力。
核心功能:
存储器到存储器的数据传输: 这是最基础的功能,可以高效地将一片内存区域的数据复制到另一片,例如将图片数据从Flash解压后存入RAM。颜色格式转换: 可以在传输过程中自动转换像素的颜色格式,例如将RGB565格式的图像数据转换为ARGB8888格式,无需CPU介入。图像混合 (Alpha Blending): 可以将两张图片(前景和背景)按照指定的透明度进行混合,生成一张新的图片。这是实现UI界面半透明效果的关键硬件功能。常量颜色填充: 可以用一个指定的颜色快速填充一块矩形区域,例如清屏操作或绘制矩形色块。核心优势: DMA2D的所有操作都在硬件层面完成,完全不占用CPU计算资源。在CPU处理其他逻辑(如网络通信、传感器数据处理)的同时,DMA2D可以在后台高效地完成复杂的图形渲染和搬运任务,极大地提升了系统的并行处理能力和UI流畅度。
2 DMA2D 在不同屏幕类型下的应用场景(1) 驱动 RGB 屏幕 (TFTLCD_RGB)
在这种场景下,系统架构通常如下:
帧缓冲区 (Frame Buffer): 通常是在单片机外部挂载的大容量SDRAM中开辟的一块内存区域。这块内存的大小直接对应屏幕的分辨率和颜色深度(例如,一个480x800分辨率、16位色深的屏幕,其帧缓冲区大小至少为 480 * 800 * 2 bytes = 768 KB)。LTDC (LCD-TFT Display Controller): 这是一个硬件外设,它被配置为持续不断地、自动地读取“帧缓冲区”中的数据,并将其转换为RGB时序信号,直接驱动屏幕显示。LTDC的工作是独立于CPU的。DMA2D 的作用:内容绘制: 当需要更新屏幕显示内容时(例如,显示一张图片、移动一个窗口),CPU会配置并启动DMA2D。数据搬运: DMA2D将存储在Flash或内部SRAM中的图片、文字等原始数据,经过可能的颜色转换或混合后,直接“绘制”到位于外部SDRAM的帧缓冲区中。无缝显示: 由于LTDC一直在刷新帧缓冲区的内容到屏幕,一旦DMA2D更新了帧缓冲区的数据,屏幕上的图像几乎是瞬间改变的。数据流: 图片源数据 (Flash/SRAM) -> DMA2D (处理/搬运) -> 帧缓冲区 (SDRAM) -> LTDC (读取) -> RGB屏幕
(2) 驱动 MCU 屏幕 (TFTLCD_MCU / OLED)
MCU屏的特点是其驱动IC内部自带一个GRAM(Graphic RAM),这个GRAM就是屏幕实际的帧缓冲区。单片机无法像驱动RGB屏那样直接将内存映射到屏幕,而必须通过特定的通信协议(如8080/6800并行总线、SPI等)向驱动IC发送命令和数据来修改GRAM的内容。
图形缓冲区 (Graphics Buffer): 由于直接通过CPU逐个像素点发送数据给MCU屏效率极低(例如,通过循环调用Set_Pixel(x, y, color)),我们通常会在单片机内部的RAM(速度最快的内部SRAM或外部SDRAM)中开辟一块“图形缓冲区”。DMA2D 的作用:离屏渲染: CPU配置DMA2D,在图形缓冲区中快速合成一帧完整的画面或需要更新的局部画面。例如,将背景图、按钮图、文字等元素叠加在一起。准备数据: 这一步操作的是单片机内部可访问的RAM,速度极快,且不占用CPU。刷新函数的作用:当图形缓冲区中的画面准备好后,CPU会调用一个“刷新函数”。这个函数通常会使用FSMC(或SPI的DMA模式)等外设,将图形缓冲区中的整块数据高效地、一次性地传输到MCU屏驱动IC的GRAM中。数据流: 图片源数据 (Flash) -> DMA2D (处理/搬运) -> 图形缓冲区 (SRAM/SDRAM) -> CPU/FSMC/DMA (刷新函数) -> MCU屏驱动IC的GRAM
3 图形缓冲区 (Graphics Buffer) vs. 帧缓冲区 (Frame Buffer) 的本质区别这个概念是理解嵌入式图形系统的关键。
特性
图形缓冲区 (Graphics Buffer)
帧缓冲区 (Frame Buffer)
定义
一个位于MCU可控RAM中的中间画布或暂存区,用于预先合成图像。
一块直接或间接映射到屏幕显示的最终显存。它的内容就是屏幕当前应该显示的内容。
位置
MCU屏: 通常在内部SRAM或外部SDRAM。RGB屏: 也可以有图形缓冲区,用于复杂UI的离屏渲染,渲染完成后再由DMA2D拷贝到帧缓冲区。
MCU屏: 位于屏幕驱动IC内部的GRAM。RGB屏: 位于MCU外部的SDRAM中,由LTDC直接读取。
更新方式
由CPU或DMA2D主动写入,用于绘制和合成。
MCU屏: 由MCU通过通信总线(如FSMC)将数据写入。RGB屏: 由DMA2D写入,或CPU直接修改。
读取方式
由MCU的刷新逻辑读取,然后发送给屏幕。
MCU屏: 由屏幕驱动IC内部逻辑读取并驱动屏幕面板。RGB屏: 由LTDC硬件自动、周期性地读取。
作用
作为中介,解决渲染速度与显示同步问题,实现复杂图形处理和双缓冲技术。
作为显示的最终数据源,是屏幕显示的“唯一真相”。
4 为什么图形缓冲区作为中介至关重要?解决同步与撕裂问题 (Tearing):问题描述: 显示器的刷新是从上到下逐行进行的。如果CPU/DMA在LTDC正在读取帧缓冲区(比如读到屏幕中间位置)的时候,去修改这个帧缓冲区(比如绘制下半部分的新内容),就会导致屏幕的上半部分显示的是旧画面,下半部分显示的是新画面,中间形成一条“撕裂线”。解决方案: 使用图形缓冲区(特别是双缓冲中的后台缓冲区)。所有绘制操作都在这个不直接显示的缓冲区内进行。只有当一整帧画面完全绘制好后,才在极短的时间内(通常是垂直同步信号V-Sync期间)将图形缓冲区的内容一次性更新到帧缓冲区,或者直接切换缓冲区指针,从而保证了显示画面的完整性。实现复杂的图像处理与合成:现代UI界面往往是分层的,例如:背景层、窗口层、按钮层、光标层。如果没有图形缓冲区,要实现这种效果将极其复杂且低效。你需要计算每个像素最终应该是什么颜色。有了图形缓冲区,处理流程变得清晰:用DMA2D将背景图填充到图形缓冲区。用DMA2D将窗口图(可能带透明通道)混合(Alpha Blending)到图形缓冲区之上。用DMA2D将按钮图再混合上去。最后,将这个合成好的、完美的最终图像一次性“呈现”给帧缓冲区。双缓冲技术 (Double Buffering) 的基础:这是图形缓冲区最经典的应用,旨在解决闪烁 (Flicker) 问题。它需要两个缓冲区:一个前台缓冲区(当前正在被LTDC读取并显示),一个后台缓冲区(当前正在被DMA2D绘制下一帧)。当后台缓冲区绘制完成后,系统并不立即复制数据,而是在等待一个合适的时机(V-Sync信号),然后交换两个缓冲区的角色(通常只是修改LTDC要读取的内存地址指针)。后台缓冲区瞬间变成前台缓冲区,而旧的前台缓冲区则成为新的后台,等待绘制更新的内容。因为切换是瞬时的,人眼无法察觉,从而实现了平滑、无闪烁的动画和视频播放效果。1.2 优化图像运行效果的方法LVGL (Light and Versatile Graphics Library) 是一个功能强大且广受欢迎的开源嵌入式图形库。要成功地将其移植到您的硬件平台,理解其文件结构至关重要。
转载请注明来自Sjyct,本文标题:《火影忍者究极传奇二(从0到1吃透LVGL图形加速DMA2D双缓冲与脏区算法的终极指南)》
京公网安备11000000000001号
京ICP备11000001号
还没有评论,来说两句吧...