45.1 初学者重要提示
DMA2D是专门用于LCD加速的,特别是刷单色屏,刷图片,刷Alpha(透明)混合效果全靠它,而且可以大大降低CPU利用率。
特别注意,大家只需对HAL库提供的DMA2D操作API有个了解即可,实际工程中,并不使用这些API,我们需要使用更加高效的寄存器直接操作,在下一章节会为大家说明。
45.2 DMA2D基础知识
DMA2D主要实现了两个功能,一个是DMA数据传输功能,另一个是2D图形加速功能。
DMA数据传输
主要是两种方式,一个是寄存器到存储器,另一个是存储器到存储器。通过DMA可以大大降低CPU的利用率。
2D图形加速功能
支持硬件的颜色格式转换和Alpha混合效果。
45.2.1 DMA2D硬件框图
认识一个外设,最好的方式就是看它的框图,方便我们快速地了解DMA2D的基本功能,然后再看手册了解细节。框图如下所示:
将这个硬件框图简化一下,就是下面这样:
下面按照简化的硬件框图,对每个部分做个说明。
45.2.2 DMA2D工作模式
DMA2D支持的工作模式如下:
模式1:寄存器到存储器模式
这个模式主要用于清屏,也即是将显示屏清为单色效果。
模式2:存储器到存储器模式
这个模式用于从一个存储器复制一块数据到另一个存储器,比如将摄像头OV7670的输出图像复制到LCD显存就可以采用这种方式。
模式3:存储器到存储器模式,带颜色格式转换
这个模式比模式2多了一个颜色格式转换,比如我们要显示一幅RGB888颜色格式的位图到RGB565颜色格式的显示屏,就需要用到这个模式,只需输入端配置为RGB888,输出端配置RGB565即可。位图颜色格式转换后会显示到显示屏上。
模式4:存储器到存储器模式,带颜色格式转换和混合
这个模式比模式3多了一个混合操作,通过混合,可以将两种效果进行混合显示。
模式5:存储器到存储器模式,带颜色格式转换和混合,前景色是固定的
同模式4,只是前景色的颜色值是固定的。
45.2.3 前景层和背景层的输入以及颜色格式转换
前景层和背景层是指的用户绘制图形时的前景色和背景色,比如我们显示汉字,字体会有一个颜色,也就是前景色,还有一个背景色。又比如我们绘制两幅图片,想将两幅图片混合,那就可以将一幅图片作为前景层,另一个幅图片作为背景层。
DMA2D支持的输入颜色格式如下,前景层和背景层一样:
前8种颜色格式在第40章的第2小节开头有介绍,这里把后四种做个说明:
L4 (4-bit luminance or CLUT)
4位颜色格式,实际上仅仅是4位索引值,范围0–15,而每个索引值的具体颜色值在查色表CLUT里面存储。
A4和A8
A4和A8用于特定的Alpha模式,既不存储颜色信息,也没有索引值。
这里特别注意一点,输入颜色格式的Alpha值是可以设置的,而且颜色格式里面的R通道和B通道可以交换位置。
45.2.4 前景层和背景层混合
DMA2D混合器用于混合前景色和背景色,这个功能不需要任何配置,仅需要通过DMA2D_CR寄存器使能即可。混合公式如下:
45.2.5 DMA2D输出颜色格式
DMA2D支持的输出颜色格式如下:
45.3 DMA2D的HAL库用法
DMA2D的HAL库用法其实就是几个结构体变量成员的配置和使用,然后配置时钟,并根据需要配置NVIC、中断。下面我们逐一展开为大家做个说明。
45.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 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;
__IO表示volatile, 这是标准C语言中的一个修饰字,表示这个变量是非易失性的,编译器不要将其优化掉。core_m4.h 文件定义了这个宏:
#define __O volatile /*!< Defines 'write only' permissions */
#define __IO volatile /*!< Defines 'read / write' permissions */
下面我们再看DMA2D的定义,在stm32f429xx.h文件。
#define PERIPH_BASE 0x40000000UL
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL)
#define DMA2D_BASE (AHB1PERIPH_BASE + 0xB000UL)
#define DMA2D ((DMA2D_TypeDef *)DMA2D_BASE) <----- 展开这个宏,(DMA2D_TypeDef *) 0x4002B000
我们访问DMA2D的ISR寄存器可以采用这种形式:DMA2D->ISR = 0。
45.3.2 DMA2D参数初始化结构体DMA2D_InitTypeDef
此结构体用于配置DMA2D的基本参数,具体定义如下:
typedef struct
{
uint32_t Mode;
uint32_t ColorMode;
uint32_t OutputOffset;
uint32_t AlphaInverted;
uint32_t RedBlueSwap;
} DMA2D_InitTypeDef;
下面将这几个参数逐一为大家做个说明:
uint32_t Mode
此参数用于设置DMA2D的传输模式,具体支持的参数如下:
#define DMA2D_M2M ((uint32_t)0x00000000U) /*存储器到存储传输模式 */
#define DMA2D_M2M_PFC DMA2D_CR_MODE_0 /*存储器到存储器传输模式,并执行FPC像素格式转 */
#define DMA2D_M2M_BLEND DMA2D_CR_MODE_1 /* 存储器到存储器模式,并执行像素格式转换和混合 */
#define DMA2D_R2M DMA2D_CR_MODE /* 寄存器到存储器传输模式 */
uint32_t ColorMode
此参数用于设置DMA2D的输出颜色格式,具体支持的参数如下:
#define DMA2D_OUTPUT_ARGB8888 ((uint32_t)0x00000000U) /* ARGB8888 */
#define DMA2D_OUTPUT_RGB888 DMA2D_OPFCCR_CM_0 /* RGB888 */
#define DMA2D_OUTPUT_RGB565 DMA2D_OPFCCR_CM_1 /* RGB565 */
#define DMA2D_OUTPUT_ARGB1555 (DMA2D_OPFCCR_CM_0|DMA2D_OPFCCR_CM_1) /* ARGB1555 */
#define DMA2D_OUTPUT_ARGB4444 DMA2D_OPFCCR_CM_2 /* ARGB4444 */
uint32_t OutputOffset
此参数用于设置输出位置的偏移值,参数范围0x0000到0x3FFF。
45.3.3 DMA2D的图层结构体DMA2D_LayerCfgTypeDef
此结构体用于配置前景色和背景色。
typedef struct
{
uint32_t InputOffset;
uint32_t InputColorMode;
uint32_t AlphaMode;
uint32_t InputAlpha;
} DMA2D_LayerCfgTypeDef;
下面将这几个参数逐一为大家做个说明。
uint32_t InputOffset
设置前景色或者背景色的输入偏移,范围0x000到0x3FFF。
uint32_t InputColorMode
设置前景色或者背景色的输入颜色格式,具体支持的参数如下:
#define DMA2D_INPUT_ARGB8888 ((uint32_t)0x00000000U) /* ARGB8888 */
#define DMA2D_INPUT_RGB888 ((uint32_t)0x00000001U) /* RGB888 */
#define DMA2D_INPUT_RGB565 ((uint32_t)0x00000002U) /* RGB565 */
#define DMA2D_INPUT_ARGB1555 ((uint32_t)0x00000003U) /* ARGB1555 */
#define DMA2D_INPUT_ARGB4444 ((uint32_t)0x00000004U) /* ARGB4444 */
#define DMA2D_INPUT_L8 ((uint32_t)0x00000005U) /* L8 */
#define DMA2D_INPUT_AL44 ((uint32_t)0x00000006U) /* AL44 */
#define DMA2D_INPUT_AL88 ((uint32_t)0x00000007U) /* AL88 */
#define DMA2D_INPUT_L4 ((uint32_t)0x00000008U) /* L4 */
#define DMA2D_INPUT_A8 ((uint32_t)0x00000009U) /* A8 */
上一篇:第46章 STM32F429的DMA2D应用之刷色块,位图和Alpha混合
下一篇:第44章 STM32F429的LTDC应用之LCD电阻触摸和电容触摸
推荐阅读最新更新时间:2024-11-12 13:02
推荐帖子
- 电子工业技术词典 磁性材料与器件
- 电子工业技术词典磁性材料与器件可直接下载!电子工业技术词典磁性材料与器件
- fighting 工控电子
- 【为C2000做贡献】基于Matlab的TMS320LF2407程序快速设计
- 基于Matlab的TMS320LF2407程序快速设计Timson,如果您要查看本帖隐藏内容请回复【为C2000做贡献】基于Matlab的TMS320LF2407程序快速设计kanakan看看,正在学2407正在学这个东西我也来看看谢谢谢谢正在学习dsp,看看。听说过这种方法,今天开眼了。谢谢gjfkldgjdklfjakldjfkadsjkladsj在寻找ccs与simulink开发的相关资料。。。。太好了呀matlab下来看看s
- 0212009623 微控制器 MCU
- 我的个神! 海内外电动自行车DIY
- 海外版中国版我的个神!海内外电动自行车DIY不怕链条上的机油溅到屁股上?{:1_103:}先不说链条溅油问题。这可怎么调速呢?总用一个速度行驶?遇到前方有情况也没法减速。在1980s,有人在普通自行车和三轮车的基础上加发动机,有小型轻骑用50cc,装在三角梁上还算正常。更神的是用一种不知道哪儿用的微型发动机装在自行车前叉上,整成了前驱……京东上有众筹普通自行车改电动的一种外挂电机电池一体化的装置,直接装在前轮上,换个加长前轴就能适配任意一种自行车。我一直想买一种可折
- PowerAnts DIY/开源硬件专区
- 【FPGA(cyclone4)第二期】应用设计文档大放送
- 自己下载,我没币了,收点别介意,绝对值得你下载自己看吧,手机了三年的资料啥也不说,自觉顶贴一次就可以下载一次,哈哈后续会免费的,希望下载的好好学习,共享经验【FPGA(cyclone4)第二期】应用设计文档大放送哇....好丰富好多呀,可惜我也是穷鬼,只能支持下了好多资料,收藏着好好学习不厚道,还要收费好多是学校的数据库下载的回复5楼fanlly的帖子很超值的,每个收费1个芯币只要你回帖一次就有了哦哈哈,我写了教程了,写到快两点了,加了精华呗,哈哈哈回复7楼
- 834629744 FPGA/CPLD
- 这是两个不同的电源,请问能采集到R0的压降不?得到电压的AD值,除以电阻值,从而...
- 这是两个不同的电源,请问能采集到R0的压降不?得到电压的AD值,除以电阻值,从而得到被校准板子的静态功耗,这种方法是否可行?这是两个不同的电源,请问能采集到R0的压降不?得到电压的AD值,除以电阻值,从而...得到电压的AD值,除以电阻值,从而得到被校准板子的静态功耗,这种方法是否可行?不可行。 这样独立的电源不可能会有电流流过R0?没有回路是吗 你有什么好的方法没有?目的是用治具实现半自动测量到产品的静态功耗 这样独立的电源不可能会有电流流过
- QWE4562009 电源技术
- 慧友电子IP保安DV视频服务器采用矽玛特PR818S系统级芯片
- 矽玛特公司宣布,慧友电子最新推出的IP保安数字摄像机视频服务器,已选用矽玛特PR818S系统级芯片。全新四通道MPEG-4数字录像机(DVR)支持四组镜头输入及灵活的录像模式,如连续间歇性拍摄(ContinuousTime-lapse)、预定时间/警报式拍摄,或移动侦测拍摄。 矽玛特PR818S为个人录像机和数字录像机等消费类便携式设备,能够提供低能耗及出色的视频质量。PR818S的单芯片设计支持硬件式MPEG-4ASP/SP、MPEG-2及J
- lorant 移动便携
设计资源 培训 开发板 精华推荐
- DSP2812最小系统原理图及PCB
- LT1956IFE 正负降压转换器的典型应用电路
- 风扇PWM调速
- LR8 高输入电压、5.0V 输出线性稳压器的典型应用
- 使用 Integrated Silicon Solution Inc 的 IS31LT3515 的参考设计
- 电子负载
- SY89873L,用于 GB 以太网交换机的时钟分频器的评估板
- Avenger96、96Boards Avenger96 板基于 ST STM32MP157A 2x Cortex-A7 + 1x Cortex-M4 多核处理器,旨在支持物联网 (IoT) 中的安全和空间约束应用
- MIC863 的典型应用:SOT23-8 中的双路超低功耗运算放大器
- EVAL-AD7661CB,AD7661 评估板,48 引脚,16 位 PulSAR 模数转换器