DMA2D的使用
2026/4/12大约 5 分钟
DMA2D的使用
简介
专门为二维图像处理和显示设计的硬件加速器
绘图从CPU解脱,交给DMA2D硬件
四种工作模式
寄存器到内存
用于纯色填充。你只需要配置好目标区域的大小和颜色值,DMA2D 就能以极快的速度将指定颜色填满屏幕的某一块区域(比如清屏、画矩形色块)。
内存到内存
用于纯图像拷贝。无需任何像素修改,直接将图像数据从源地址搬运到目标地址(比如将一张图片从 Flash 拷贝到 SDRAM 中的显存)。通常搭配LTDC
带像素格式转换的内存到内存
在拷贝图像的同时,硬件自动完成色彩格式转换 (PFC, Pixel Format Convertor)。例如,将存储在 Flash 中的 RGB565 格式图片,在输出到显存时硬件自动转换为 ARGB8888 格式。
带混合和格式转换的内存到内存
这是 DMA2D 最强大的功能。它支持硬件 Alpha 混合 (Alpha Blending)。它可以同时读取两个源(前景和背景),根据各自的透明度(Alpha 值)进行数学混合计算,然后再输出到目标显存中。这在渲染抗锯齿字体、半透明按钮或阴影效果时极为关键。
寄存器介绍
typedef struct
{
__IO uint32_t CR; /*!< DMA2D Control Register, Address offset: 0x00 */
__IO uint32_t ISR; /*!< DMA2D Interrupt Status Register, Address offset: 0x04 */
__IO uint32_t IFCR; /*!< DMA2D Interrupt Flag Clear Register, Address offset: 0x08 */
__IO uint32_t FGMAR; /*!< DMA2D Foreground Memory Address Register, Address offset: 0x0C */
__IO uint32_t FGOR; /*!< DMA2D Foreground Offset Register, Address offset: 0x10 */
__IO uint32_t BGMAR; /*!< DMA2D Background Memory Address Register, Address offset: 0x14 */
__IO uint32_t BGOR; /*!< DMA2D Background Offset Register, Address offset: 0x18 */
__IO uint32_t FGPFCCR; /*!< DMA2D Foreground PFC Control Register, Address offset: 0x1C */
__IO uint32_t FGCOLR; /*!< DMA2D Foreground Color Register, Address offset: 0x20 */
__IO uint32_t BGPFCCR; /*!< DMA2D Background PFC Control Register, Address offset: 0x24 */
__IO uint32_t BGCOLR; /*!< DMA2D Background Color Register, Address offset: 0x28 */
__IO uint32_t FGCMAR; /*!< DMA2D Foreground CLUT Memory Address Register, Address offset: 0x2C */
__IO uint32_t BGCMAR; /*!< DMA2D Background CLUT Memory Address Register, Address offset: 0x30 */
__IO uint32_t OPFCCR; /*!< DMA2D Output PFC Control Register, Address offset: 0x34 */
__IO uint32_t OCOLR; /*!< DMA2D Output Color Register, Address offset: 0x38 */
__IO uint32_t OMAR; /*!< DMA2D Output Memory Address Register, Address offset: 0x3C */
__IO uint32_t OOR; /*!< DMA2D Output Offset Register, Address offset: 0x40 */
__IO uint32_t NLR; /*!< DMA2D Number of Line Register, Address offset: 0x44 */
__IO uint32_t LWR; /*!< DMA2D Line Watermark Register, Address offset: 0x48 */
__IO uint32_t AMTCR; /*!< DMA2D AHB Master Timer Configuration Register, Address offset: 0x4C */
uint32_t RESERVED[236]; /*!< Reserved, 0x50-0x3FF */
__IO uint32_t FGCLUT[256]; /*!< DMA2D Foreground CLUT, Address offset:400-7FF */
__IO uint32_t BGCLUT[256]; /*!< DMA2D Background CLUT, Address offset:800-BFF */
} DMA2D_TypeDef;1. 全局控制与状态 (Control & Status)
这是 DMA2D 的“方向盘”和“仪表盘”。
CR(Control Register): 核心控制寄存器。用于配置 DMA2D 的工作模式(纯色填充、内存拷贝、是否开启混合等),并且用来启动 (Start) 传输。ISR(Interrupt Status Register): 中断状态寄存器。当一次图像搬运完成、或者发生配置错误时,硬件会在这里置位相应的标志。IFCR(Interrupt Flag Clear Register): 中断标志清除寄存器。读取到 ISR 的状态后,向 IFCR 写入对应的值来清空标志位。
2. 前景层与背景层配置 (Foreground & Background)
DMA2D 提供了两路数据输入(FG 代表 Foreground 前景,BG 代表 Background 背景),它们的寄存器是完全对称的:
FGMAR/BGMAR(Memory Address): 源图像的内存首地址。即你要搬运的图片存放在哪里(比如外部 Flash 或 SDRAM 的某个地址)。FGOR/BGOR(Offset): 偏移量寄存器(极其关键)。当你想把一张小图贴在一张大图(或整个屏幕)中间时,小图每读取完一行,需要跳过多少个像素才能读取下一行的起点?这个跨度就是 Offset(也叫 Stride)。FGPFCCR/BGPFCCR(PFC Control): 像素格式控制。告诉硬件这一层的数据是什么格式(RGB565、ARGB8888、L8 等),以及如何处理它的 Alpha 透明通道。FGCOLR/BGCOLR(Color): 纯色寄存器。如果在CR中配置了“寄存器到内存”模式(不读取源图像,只画纯色方块),硬件就会读取这里的颜色值去填充。
3. 输出配置 (Output)
两层图像混合或转换完毕后,最终输出到哪里的配置区(O 代表 Output):
OMAR(Memory Address): 目标内存地址。通常指向 LCD 的显存 (Framebuffer) 首地址,也就是画面要画到哪里去。OOR(Offset): 输出偏移量。原理同上,决定了在屏幕的指定区域画完一行后,指针需要跳过多少像素才能跳转到屏幕的下一行。OPFCCR(PFC Control): 输出像素格式。告诉硬件,最终写进显存的数据需要转换成什么格式(比如屏幕硬件只支持 RGB565,这里就配置为 RGB565)。OCOLR(Color): 用于某些特定模式下的背景色填充。
4. 传输尺寸配置 (Dimension)
NLR(Number of Line Register): 行数寄存器。这个寄存器分为高 16 位和低 16 位,分别配置了你要绘制的图形的 宽度(每行的像素数) 和 高度(总行数)。硬件就是靠它知道自己什么时候画完一个矩形的。
5. 高级控制与调色板 (Advanced & CLUT)
LWR(Line Watermark): 行水印寄存器。可以设定一个阈值,比如画完第 100 行时触发一个中断,常用于复杂的逐行渲染特效。AMTCR(AHB Master Timer): AHB 总线控制。限制 DMA2D 占用总线的带宽,防止它疯狂搬运数据导致 Cortex-M7 主核或其他外设(如 DMA1)卡顿。FGCLUT[256]/BGCLUT[256]: 硬件内部的色彩查找表(调色板)空间。用于解析 L8、L4 等带调色板格式的位图,以节省 Flash 存储空间。
总结来说它的工作流是这样的: 配置输入格式(FGPFCCR) -> 给定源地址(FGMAR) -> 配置输出格式(OPFCCR) -> 给定目标显存地址(OMAR) -> 设定要画多大(NLR) -> 启动(CR)。