第55章 STM32H7的图形加速器DMA2D的基础知识和HAL库API
本章节为大家讲解DMA2D,实际项目中显示屏的加速全靠它了,而且性能也比较给力。
55.1 初学者重要提示
55.2 DMA2D基础知识
55.3 DMA2D的HAL库用法
55.4 源文件stm32h7xx_hal_dma2d.c
55.5 总结
55.1 初学者重要提示
DMA2D是专门用于LCD加速的,特别是刷单色屏,刷图片,刷Alpah(透明)混合效果全靠它,而且可以大大降低CPU利用率。
测评STM32H7的LTDC+DMA2D性能,100Hz以上无压力,刷800*480图片和色块仅需2.6ms一张:http://www.armbbs.cn/forum.php?mod=viewthread&tid=91489 。
H7的DMA2D与F429的DMA2D最大区别是支持了ARGB和ABGR互转,而且支持H7的硬解JEPG输出格式YCbCr转RGB,方便LCD显示。
特别注意,大家只需对HAL库提供的DMA2D操作API有个了解即可,实际工程中,并不使用这些API,我们需要使用更加高效的寄存器直接操作,在下一章节会为大家说明。
55.2 DMA2D基础知识
DMA2D主要实现了两个功能,一个是DMA数据传输功能,另一个是2D图形加速功能。
DMA数据传输
主要是两种方式,一个是寄存器到存储器,另一个是存储器到存储器。通过DMA可以大大降低CPU的利用率。
2D图形加速功能
支持硬件的颜色格式转换和Alpha混合效果。
55.2.1 DMA2D硬件框图
认识一个外设,最好的方式就是看它的框图,方便我们快速地了解DMA2D的基本功能,然后再看手册了解细节。框图如下所示:
通过这个框图,我们可以得到如下信息:
dma2d_aclk
AXI 总线时钟输入。
dma2d_gbl_it
DMA2D全局中断输出。
dma2d_clut_trg
CLUT传输完成信号输出,可以触发MDMA。
dma2d_tc_trg
传输完成信号输出,可以触发MDMA。
dma2d_tw_trg
传输watermark信号输出,可以触发MDMA。
将这个硬件框图简化一下,就是下面这样:
下面按照简化的硬件框图,对每个部分做个说明。
55.2.2 DMA2D工作模式
DMA2D支持的工作模式如下:
模式1:寄存器到存储器模式
这个模式主要用于清屏,也即是将显示屏清为单色效果。
模式2:存储器到存储器模式
这个模式用于从一个存储器复制一块数据到另一个存储器,比如将摄像头OV7670的输出图像复制到LCD显存就可以采用这种方式。
模式3:存储器到存储器模式,带颜色格式转换
这个模式比模式2多了一个颜色格式转换,比如我们要显示一幅RGB888颜色格式的位图到RGB565颜色格式的显示屏,就需要用到这个模式,只需输入端配置为RGB888,输出端配置RGB565即可。位图颜色格式转换后会显示到显示屏上。
模式4:存储器到存储器模式,带颜色格式转换和混合
这个模式比模式3多了一个混合操作,通过混合,可以将两种效果进行混合显示。
模式5:存储器到存储器模式,带颜色格式转换和混合,前景色是固定的
同模式4,只是前景色的颜色值是固定的。
55.2.3 前景层和背景层的输入以及颜色格式转换
前景层和背景层是指的用户绘制图形时的前景色和背景色,比如我们显示汉字,字体会有一个颜色,也就是前景色,还有一个背景色。又比如我们绘制两幅图片,想将两幅图片混合,那就可以将一幅图片作为前景层,另一个幅图片作为背景层。
DMA2D支持的输入颜色格式如下,前景层和背景层一样:
前8种颜色格式在第50章的第2小节开头有介绍,这里把后四种做个说明:
L4 (4-bit luminance or CLUT)
4位颜色格式,实际上仅仅是4位索引值,范围0–15,而每个索引值的具体颜色值在查色表CLUT里面存储。
A4和A8
A4和A8用于特定的Alpha模式,既不存储颜色信息,也没有索引值。
YCbCr
这个是H7的硬件JPEG输出的颜色格式,后面JPEG章节为大家专门做讲解。
这里特别注意一点,输入颜色格式的Alpha值是可以设置的,而且颜色格式里面的R通道和B通道可以交换位置。
55.2.4 前景层和背景层混合
DMA2D混合器用于混合前景色和背景色,这个功能不需要任何配置,仅需要通过DMA2D_CR寄存器使能即可。混合公式如下:
55.2.5 DMA2D输出颜色格式
DMA2D支持的输出颜色格式如下:
这里特别注意一点,输出颜色格式的Alpha值是可以设置的,而且颜色格式里面的R通道和B通道可以交换位置。
55.3 DMA2D的HAL库用法
DMA2D的HAL库用法其实就是几个结构体变量成员的配置和使用,然后配置时钟,并根据需要配置NVIC、中断。下面我们逐一展开为大家做个说明。
55.3.1 DMA2D寄存器结构体DMA2D_TypeDef
DMA2D相关的寄存器是通过HAL库中的结构体DMA2D_TypeDef定义的,在stm32h743xx.h中可以找到它们的具体定义:
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 u