当前位置: 首页 > news >正文

STM32H7之DMD2D是个啥

STM32H7之DMD2D是个啥

  • 硬件框图
    • 硬件框图简化一下
  • DMA2D工作模式
    • 前景层和背景层的输入以及颜色格式转换
    • 前景层和背景层混合
    • DMA2D输出颜色格式
  • 行偏移怎么理解
  • 通过读写寄存器高速控制DMA2D
    • 颜色填充功能
      • 举例
    • 从前景层复制指定区域的颜色数据到目标区域
      • 举例
    • 前景层和目标区域颜色混合
      • 举例
    • 前景层和背景层的颜色混合,并输出到目标区
      • 举例
    • ARGB8888格式位图显示
      • 举例

DMA2D主要实现了两个功能,一个是DMA数据传输、另一个是2D图形加速功能。

◆ DMA 数据传输
主要是两种方式,一个是寄存器到存储器,另一个是存储器到存储器。通过 DMA 可以大大降低 CPU
的利用率。
◆ 2D 图形加速功能
支持硬件的颜色格式转换和 Alpha 混合效果。

硬件框图

在这里插入图片描述◆ dma2d_aclk
AXI 总线时钟输入。
◆ dma2d_gbl_it
DMA2D 全局中断输出。
◆ dma2d_clut_trg
CLUT 传输完成信号输出,可以触发 MDMA。
◆ dma2d_tc_trg
传输完成信号输出,可以触发 MDMA。
◆ dma2d_tw_trg
传输 watermark 信号输出,可以触发 MDMA。

硬件框图简化一下

在这里插入图片描述

DMA2D工作模式

DMA2D 支持的工作模式如下:
模式 1:寄存器到存储器模式
这个模式主要用于清屏,也即是将显示屏清为单色效果。
模式 2:存储器到存储器模式
这个模式用于从一个存储器复制一块数据到另一个存储器,比如将摄像头 OV7670 的输出图像复制到
LCD 显存就可以采用这种方式。
模式 3:存储器到存储器模式,带颜色格式转换
这个模式比模式 2 多了一个颜色格式转换,比如我们要显示一幅 RGB888 颜色格式的位图到 RGB565颜色格式的显示屏,就需要用到这个模式,只需输入端配置为 RGB888,输出端配置 RGB565 即可。位图颜色格式转换后会显示到显示屏上。
模式 4:存储器到存储器模式,带颜色格式转换和混合
这个模式比模式 3 多了一个混合操作,通过混合,可以将两种效果进行混合显示。
模式 5:存储器到存储器模式,带颜色格式转换和混合,前景色是固定的
同模式 4,只是前景色的颜色值是固定的。

前景层和背景层的输入以及颜色格式转换

前景层和背景层是指的用户绘制图形时的前景色和背景色,比如我们显示汉字,字体会有一个颜色,也就是前景色,还有一个背景色,又比如我们绘制两幅图片,想将两幅图片混合,那就可以将一副图片作为前景层,另一副图片作为背景层。
DMA2D支持的输入颜色格式如下,前景层和背景层一样

CM[3:0]配置位颜色格式
0000ARGB8888
0001RGB888
0010RGB565
0011ARGB1555
0100ARGB4444
0101L8
0110AL44
0111AL88
1000L4
1001A8
1010A4
1011YCbCr(仅仅用于前景层)

前面8钟的颜色格式这边就不过多的介绍了,这里把后四种做个说明。
L4(4-bit luminance or CLUT)
4位颜色格式,实际上仅仅是4位索引值,范围0-15,而每个索引值的具体颜色值在查色表CLUT里面存储。
A4和A8
A4和A8用于特定的Alpha模式,既不存储颜色信息,也没有索引值。
YCbCr
这个是H7的硬件JPEG输出的颜色格式。

前景层和背景层混合

DMA2D混合器用于混合前景色和背景色,这个功能不需要任何配置,仅需要通过DMA2D_CR寄存器使能即可。
混合的公式如下:
在这里插入图片描述

DMA2D输出颜色格式

DMA2D支持的输出颜色格式如下:
在这里插入图片描述

行偏移怎么理解

对于DMA2D传输的关键是理解行偏移。前景层、背景层和输出层都有一个行偏移寄存器。
这里画一个框图:
在这里插入图片描述
举例子,前景层、背景层和输出区域的分辨率都是800480,颜色的格式为RGB565
将前景层起始坐标(40,30),长480,高272的数据。
背景层里面起始坐标(50,40)长480、高272的数据复制到输出区的起始地址(60,50),长480,高272的区域。
前景层的首地址是30
8002+402,这里乘以2是因为RGB565的颜色格式是一个像素占2个字节。
难点在于如何保证前景层一行结束到一行开始的距离,里面包含了水平消隐等,单位是像素个数。
通过这个行偏移,我们可以很容易地将其切换到下一行,然后从前景层复制出来480*272的数据。

通过读写寄存器高速控制DMA2D

颜色填充功能

/*3. * 函 数 名: _DMA2D_Fill
4. * 功能说明: DMA2D 颜色填充功能
5. * 形 参: pDst 颜色数据目的地址
6. * xSize 色块 X 轴大小,即每行像素数
7. * ySize 色块 Y 轴大小,即行数
8. * OffLine 前景层图像的行偏移
9. * ColorIndex 色块颜色值
10. * PixelFormat 目标区颜色格式
11. * 返 回 值: 无
12. ******************************************************************************************************
13. */
static void _DMA2D_Fill(void * pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex, uint32_t PixelFormat) 
{/* DMA2D 采用寄存器到存储器模式, 这种模式用不到前景层和背景层 */DMA2D->CR      = 0x00030000UL | (1 << 9);DMA2D->OCOLR   = ColorIndex;DMA2D->OMAR    = (uint32_t)pDst;DMA2D->OOR     = OffLine;DMA2D->OPFCCR  = PixelFormat;DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;/* 启动传输 */DMA2D->CR   |= DMA2D_CR_START;   /* 等待 DMA2D 传输完成 */while (DMA2D->CR & DMA2D_CR_START) {} 
}

◆ 第 23 行,设置 DMA2D 采用寄存器往存储器传输数据模式,即 DMA2D 将 OCOLR 寄存器设置颜色
值填充到存储器里面。
◆ 第 24 行,OCOLR 寄存器用于设置输出颜色值,特别注意要跟第 27 行的输出颜色格式匹配。比如设
置的是 RGB565,那么设置的颜色值就要是 16 位色的。
◆ 第 25 行,设置输出填充区的首地址。
◆ 第 26 行,设置输出行偏移。
◆ 第 27 行,设置输出颜色格式,如果是输出到 LCD 显存,那么此格式要与 LCD 颜色格式一致,否则
显示不正常。
◆ 第 28 行,高 16 位用于设置每行的像素数,低 16 位用于设置行数,合并起来决定总传输次数。
◆ 第 31-34 行,启动传输,并等待传输完成。

举例

_DMA2D_Fill((void *)(SDRAM_LCD_BUF1 + g_LcdWidth*20*2 + 24*2), /* 显示起始地址(24, 20) */ 
128, /* 色块长 */ 
128, /* 色块高 */
g_LcdWidth-128, /* 色块行偏移 */
CL_RED, /* 色块颜色 */
LTDC_PIXEL_FORMAT_RGB565); /* 色块颜色格式 */

从前景层复制指定区域的颜色数据到目标区域

/*
2. ******************************************************************************************************
3. * 函 数 名: _DMA2D_Copy
4. * 功能说明: 通过 DMA2D 从前景层复制指定区域的颜色数据到目标区域
5. * 形 参: pSrc 颜色数据源地址
6. * pDst 颜色数据目的地址
7. * xSize 目的区域的 X 轴大小,即每行像素数
8. * ySize 目的区域的 Y 轴大小,即行数
9. * OffLineSrc 前景层图像的行偏移
10. * OffLineDst 输出的行偏移
11. * PixelFormat 目标区颜色格式
12. * 返 回 值: 无
13. ******************************************************************************************************
14. */
static void _DMA2D_Copy(void * pSrc, void * pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLineSrc, uint32_t OffLineDst, uint32_t PixelFormat) 
{/* DMA2D 采用存储器到存储器模式, 这种模式是前景层作为 DMA2D 输入 */DMA2D->CR      = 0x00000000UL | (1 << 9);DMA2D->FGMAR   = (uint32_t)pSrc;DMA2D->OMAR    = (uint32_t)pDst;DMA2D->FGOR    = OffLineSrc;DMA2D->OOR     = OffLineDst;/* 前景层和输出区域都采用的 RGB565 颜色格式 */DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_RGB565;DMA2D->OPFCCR  = LTDC_PIXEL_FORMAT_RGB565;DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;/* 启动传输 */DMA2D->CR   |= DMA2D_CR_START;   /* 等待 DMA2D 传输完成 */while (DMA2D->CR & DMA2D_CR_START) {} 
}

举例

_DMA2D_Copy((uint32_t *)_acmickey, /* 位图地址 */(uint32_t *)(SDRAM_LCD_BUF1 + g_LcdWidth*20*2 + 328*2), /* 显示起始地址(328, 20) */ 128, /* 位图长 */128, /* 位图高 */0, /* 位图行偏移 */g_LcdWidth-128, /* 目标区行偏移 */
LTDC_PIXEL_FORMAT_RGB565); /* 目标区颜色格式 */

前景层和目标区域颜色混合

/*
2. ******************************************************************************************************
3. * 函 数 名: _DMA2D_MixColorsBulk
4. * 功能说明: 前景层和目标区域的颜色混合
5. * 形 参: pColorFG 前景层数据源地址
6. * OffLineSrcFG 前景层图像的行偏移
7. * pColorDst 目标区数据地址
8. * OffLineDst 目标区的行偏移
9. * xSize 目的区域的 X 轴大小,即每行像素数
10. * ySize 目的区域的 Y 轴大小,即行数
11. * Intens 设置前景层的透明度,255 表示完全不透明,0 表示完全透明
12. * 返 回 值: 无
13. ******************************************************************************************************
14. */
static void _DMA2D_MixColorsBulk(uint32_t * pColorFG,  uint32_t OffLineSrcFG,uint32_t * pColorDst, uint32_t OffLineDst,uint32_t xSize, uint32_t ySize, uint8_t Intens)
{/* DMA2D 采用存储器到存储器模式, 这种模式前景层和背景层作为 DMA2D 输入,且支持颜色格式转换和颜色混合 */DMA2D->CR      = 0x00020000UL | (1 << 9);DMA2D->FGMAR   = (uint32_t)pColorFG;DMA2D->BGMAR   = (uint32_t)pColorDst;DMA2D->OMAR    = (uint32_t)pColorDst;DMA2D->FGOR    = OffLineSrcFG;DMA2D->BGOR    = OffLineDst;DMA2D->OOR     = OffLineDst;/* 前景层,背景层和输出区都是用的 RGB565 格式 */DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_RGB565| (1UL << 16)| ((uint32_t)Intens << 24);DMA2D->BGPFCCR = LTDC_PIXEL_FORMAT_RGB565;DMA2D->OPFCCR  = LTDC_PIXEL_FORMAT_RGB565;DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;/* 启动传输 */DMA2D->CR   |= DMA2D_CR_START;   /* 等待 DMA2D 传输完成 */while (DMA2D->CR & DMA2D_CR_START) {} 
}

举例

_DMA2D_MixColorsBulk((uint32_t *)_achuoying, /* 位图地址 */0, /* 位图行偏移 */ 
(uint32_t *)(SDRAM_LCD_BUF1 + g_LcdWidth*168*2 + 176*2), /* 显示起始地址(176, 168) */
g_LcdWidth-128, /* 目标区行偏移 */ 
128, /* 目标区长 */
128, /* 目标区高 */ 
200); /* 位图显示透明度 200 */

前景层和背景层的颜色混合,并输出到目标区

/*
2. ******************************************************************************************************
3. * 函 数 名: _DMA2D_AlphaBlendingBulk
4. * 功能说明: 前景层和背景层的颜色混合
5. * 形 参: pColorFG 前景层源数据地址
6. * OffLineSrcFG 前景层源数据行偏移
7. * pColorBG 背景层源数据地址
8. * OffLineSrcBG 背景层源数据行偏移
9. * pColorDst 目标区地址
10. * OffLineDst 目标区行偏移
11. * xSize 目标区域的 X 轴大小,即每行像素数
12. * ySize 目标区域的 Y 轴大小,即行数
13. * 返 回 值: 无
14. ******************************************************************************************************
15. */
static void _DMA2D_AlphaBlendingBulk(uint32_t * pColorFG,  uint32_t OffLineSrcFG,uint32_t * pColorBG,  uint32_t OffLineSrcBG,uint32_t * pColorDst, uint32_t OffLineDst,uint32_t xSize, uint32_t ySize) 
{  /* DMA2D 采用存储器到存储器模式, 这种模式前景层和背景层作为 DMA2D 输入,且支持颜色格式转换和颜色混合 */DMA2D->CR      = 0x00020000UL | (1 << 9);DMA2D->FGMAR   = (uint32_t)pColorFG;DMA2D->BGMAR   = (uint32_t)pColorBG;DMA2D->OMAR    = (uint32_t)pColorDst;DMA2D->FGOR    = OffLineSrcFG;DMA2D->BGOR    = OffLineSrcBG;DMA2D->OOR     = OffLineDst;/* 前景层,背景层采用 ARGB8888 格式,输出区采用 RGB565 格式 */DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;DMA2D->BGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;DMA2D->OPFCCR  = LTDC_PIXEL_FORMAT_RGB565;DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;/* 启动传输 */DMA2D->CR   |= DMA2D_CR_START;   /* 等待 DMA2D 传输完成 */while (DMA2D->CR & DMA2D_CR_START) {} 
}

举例

_DMA2D_AlphaBlendingBulk((uint32_t *)_aclufei, /* 前景层位图地址 */
0, /* 前景层行偏移 */ 
(uint32_t *)_acsuolong, /* 背景层位图地址 */ 
0, /* 背景层行偏移 */ 
(uint32_t *)(SDRAM_LCD_BUF1 + g_LcdWidth*168*2 + 24*2), /* 显示起始地址(24, 168) */ 
g_LcdWidth-128, /* 目标区行偏移 */
128, /* 目标区长 */
128); /* 目标区高 */

ARGB8888格式位图显示

/*
2. ******************************************************************************************************
3. * 函 数 名: _DMA2D_DrawAlphaBitmap
4. * 功能说明: ARGB8888 格式位图显示
5. * 形 参: pDst 目标区地址
6. * pSrc 源数据地址,即位图首地址
7. * xSize 目标区域的 X 轴大小,即每行像素数
8. * ySize 目标区域的 Y 轴大小,即行数
9. * OffLineSrc 源数据行偏移
10. * OffLineDst 目标区行偏移
11. * PixelFormat 目标区颜色格式
12. * 返 回 值: 无
13. ******************************************************************************************************
14. */
static void _DMA2D_DrawAlphaBitmap(void  * pDst, void  * pSrc, uint32_t xSize, uint32_t ySize, uint32_t OffLineSrc, uint32_t OffLineDst, uint32_t PixelFormat) 
{/* DMA2D 采用存储器到存储器模式, 这种模式前景层和背景层作为 DMA2D 输入,且支持颜色格式转换和颜色混合 */DMA2D->CR      = 0x00020000UL | (1 << 9);DMA2D->FGMAR   = (uint32_t)pSrc;DMA2D->BGMAR   = (uint32_t)pDst;DMA2D->OMAR    = (uint32_t)pDst;DMA2D->FGOR    = OffLineSrc;DMA2D->BGOR    = OffLineDst;DMA2D->OOR     = OffLineDst;/* 前景层颜色格式是 LTDC_PIXEL_FORMAT_ARGB8888,即位图的颜色格式,背景层和输出区颜色格式可配置 */DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;DMA2D->BGPFCCR = PixelFormat;DMA2D->OPFCCR  = PixelFormat;DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;/* 启动传输 */DMA2D->CR   |= DMA2D_CR_START;   /* 等待 DMA2D 传输完成 */while (DMA2D->CR & DMA2D_CR_START) {} 
}

举例

_DMA2D_DrawAlphaBitmap((void *)(SDRAM_LCD_BUF1 + g_LcdWidth*20*2 + 176*2), /* 显示起始地址(176, 20) */ 
(void *)_aclufei, /* 位图地址 */
128, /* 位图长 */
128, /* 位图高 */
0, /* 位图行偏移 */
g_LcdWidth-128, /* 目标区行偏移 */
LTDC_PIXEL_FORMAT_RGB565); /* 目标区颜色格式 */

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何理解李彦宏说的”不要卷模型,要卷应用
  • 绝区伍--2024年AI发展路线图
  • 模拟防止重复提交
  • 用智能方法设计量子点半导体光放大器
  • 数据结构第22节 堆排序优化
  • Hive的分区表分桶表
  • RKNN3588——利用推理YOLOv8推理图片
  • 浅析Nginx技术:开源高性能Web服务器与反向代理
  • [RK3566-Android11] 使用iPhone14/15出现的蓝牙断开重连无声音问题
  • duplicate key value violates unique constraint
  • 谷粒商城学习笔记-19-快速开发-逆向生成所有微服务基本CRUD代码
  • 科研绘图系列:R语言两组数据散点分布图(scatter plot)
  • 【Java16】多态
  • 【Cesium开发实战】火灾疏散功能的实现,可设置火源点、疏散路径、疏散人数
  • 修正版头像上传组件
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Cookie 在前端中的实践
  • Django 博客开发教程 16 - 统计文章阅读量
  • Java应用性能调优
  • JS函数式编程 数组部分风格 ES6版
  • python docx文档转html页面
  • 搭建gitbook 和 访问权限认证
  • 对超线程几个不同角度的解释
  • 飞驰在Mesos的涡轮引擎上
  • 如何学习JavaEE,项目又该如何做?
  • 学习ES6 变量的解构赋值
  • ​Java并发新构件之Exchanger
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #162 (Div. 2)
  • #if #elif #endif
  • #大学#套接字
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (SpringBoot)第二章:Spring创建和使用
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (四)进入MySQL 【事务】
  • (一)Linux+Windows下安装ffmpeg
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)socket Aio demo
  • 、写入Shellcode到注册表上线
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET企业级应用架构设计系列之技术选型
  • .NET轻量级ORM组件Dapper葵花宝典
  • ??在JSP中,java和JavaScript如何交互?
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @PreAuthorize与@Secured注解的区别是什么?
  • [ linux ] linux 命令英文全称及解释
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C++]拼图游戏