026 - STM32学习笔记 - 液晶屏控制(三) - DMA2D快速绘制矩形、直线

news2024/11/19 23:28:16

026- STM32学习笔记 - 液晶屏控制(三) - DMA2D快速绘制矩形、直线等

在这里插入图片描述

上节直接操作LTDC在先视频上直接显示,我们直接操作显存地址空间中的内容,用来显示图形,但是相对来说,这种方法费时费力,这节使用DMA2D来快速绘制图形。首先看一下DMA2D的初始化结构体:

/** 
  * @brief  DMA2D初始化结构体 
  */
typedef struct
{
	uint32_t DMA2D_Mode;            /* 配置DMA2D模式,可选模式有:DMA2D_M2M、DMA2D_M2M_PFC、DMA2D_M2M_BLEND、DMA2D_R2M */
	uint32_t DMA2D_CMode;           /* 配置颜色模式,可选有:DMA2D_ARGB8888、DMA2D_RGB888、DMA2D_RGB565、DMA2D_ARGB1555、DMA2D_ARGB4444 */
	uint32_t DMA2D_OutputBlue;      /* 配置输出图像的蓝色通道值ARGB8888(0x00 - 0xFF)、RGB888(0x00 - 0xFF)、RGB565(0x00 - 0x1F)、
 													    ARGB1555(0x00 - 0x1F)、ARGB4444(0x00 - 0x0F) */
	uint32_t DMA2D_OutputGreen;     /* 配置输出图像的绿色通道值ARGB8888(0x00 - 0xFF)、RGB888(0x00 - 0xFF)、RGB565(0x00 - 0x2F)、
 													    ARGB1555(0x00 - 0x1F)、ARGB4444(0x00 - 0x0F)*/

	uint32_t DMA2D_OutputRed;       /* 配置输出图像的红色通道值ARGB8888(0x00 - 0xFF)、RGB888(0x00 - 0xFF)、RGB565(0x00 - 0x1F)、
 													    ARGB1555(0x00 - 0x1F)、ARGB4444(0x00 - 0x0F) */

	uint32_t DMA2D_OutputAlpha;     /* 配置输出图像的红色通道值ARGB8888(0x00 - 0xFF)、ARGB1555(0x00 - 0x01)、ARGB4444(0x00 - 0x0F) */
	uint32_t DMA2D_OutputMemoryAdd; /* 指定内存地址,地址范围应在0x00000000 - 0xFFFFFFFF */
	uint32_t DMA2D_OutputOffset;    /* 指定偏移值,取值范围为0x0000 - 0x3FFF */
	uint32_t DMA2D_NumberOfLine;    /* 配置传输区域行数,配置值为:0x0000 - 0xFFFF */   
	uint32_t DMA2D_PixelPerLine;    /* 配置要传输的区域的每行像素数,配置值为:0x0000 - 0x3FFF */
} DMA2D_InitTypeDef;

DMA2D_Mode

用于配置DMA2D的工作模式,可以设置的值如下:

说明
DMA2D_M2M从存储器到存储器(仅限FG获取数据源)
DMA2D_M2M_PFC存储器到存储器并执行 PFC(仅限FG PFC激活时的FG获 取)
DMA2D_M2M_BLEND存储器到存储器并执行混合(执行PFC和混合时的FG和BG获取)
DMA2D_R2M寄存器到存储器(无FG和BG,仅输出阶段激活)

以上这四种模式主要区分数据的来源、是否使能PFC以及是否使能混合器,使用DMA2D时,可以将数据从某个位置搬运到现存,源位置可以时DMA2D本身的寄存器,也可以是设置好的DMA2D前景地址、背景地址。如果是能了PFC,则存储器中的数据源会经过转换后在送到显存,如果使能混合器,DMA2D会把两个数据源中的数据混合后再送到显存。

若使用存储器到存储器模式,需要调用库函数DMA2D_FGConfig,使用初始化结构体DMA2D_FG_InitTypeDef配置数据源的格式、地址等参数。背景层使用函数DMA2D_BGConfig和结构体DMA2D_BG_InitTypeDef)

DMA2D_CMode

用于配置DMA2D的输出PFC颜色格式,也就是将要传输给显存的格式,可选的参数有:DMA2D_ARGB8888、DMA2D_RGB888、DMA2D_RGB565、DMA2D_ARGB1555、DMA2D_ARGB4444。

DMA2D_OutputBlue/DMA2D_OutputGreen/DMA2D_OutputRed/DMA2D_OutputAlpha

用于配置DMA2D的输出颜色值,如果DMA2D工作模式设置为寄存器到存储器模式,则此颜色值作为数据源,会被DA2D复制到显存空间,目标空间就会被填入这一种颜色,每个通道的参数取值范围,请参照结构体说明中的注释内容。。

DMA2D_OutputMemoryAdd

用于配置DMA2D的输出FIFO的地址,DMA2D的数据会被搬运到该空间,一般将此设置为传输显示位置的起始地址。

DMA2D_OutputOffset

用于配置行偏移,行偏移会被添加到各行的结尾,用于确定下一行的起始地址,如下,绿色表示要显示的像素列,黄色表示行偏移,,假如左边显示的是一条竖线,竖线的宽度为1像素,所以行偏移的值为7-1=6,右边的线宽为2像素,行偏移的值为7-2=5,这样可以总结
行偏移的值 = 行宽度 − 线宽 行偏移的值 = 行宽度 - 线宽 行偏移的值=行宽度线宽
在这里插入图片描述

DMA2D_NumberOfLine

用于配置 DMA2D 一共要传输多少行数,如上图中,一共有8行数据。

DMA2D_PixelPerLine

用于配置每行有多少个像素点,如上图左侧表示每行有1个像素点,右侧表示每行有2个像素点。

上节的程序中,我们在显示屏初始化时编写了一个显存初始化的函数void VRAM_Init(void),之后在其内部使用for循环对第二层的显存空间进行覆盖填写我们需要的颜色,如果只是填充一种颜色倒还好,若整个屏幕需要用颜色复杂度较高的图像,就会比较耗费CPU资源,因此这里采用DMA2D来传输,无需耗费CPU资源。

这里我们可以使用DMA2D来快速绘制矩形、直线等,可以在上面的程序中修改得到需要的功能如下:

绘制矩形

/**
  * @brief DMA2D绘制矩形
  * @param None
  * @retval None
  */
void DMA_Draw_Rect(void)
{
    /* 记得要开时钟!!!这里我在上节内容中已经在LCD_Layer_Init中开过DMA2D的时钟了,这里就不在开了 */
    DMA2D_InitTypeDef DMA2D_InitStruct;
    /* 传输模式设置位从寄存器到存储器 */
    DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;
    /* 颜色模式取决于上面我们设置的LTDC第二层的颜色模式 */
    DMA2D_InitStruct.DMA2D_CMode = DMA2D_ARGB8888;
    /* 配置透明通道 */
    DMA2D_InitStruct.DMA2D_OutputAlpha = 0xff;
    /* 配置蓝色通道 */
    DMA2D_InitStruct.DMA2D_OutputBlue = 0xff;
    /* 配置绿色通道 */
    DMA2D_InitStruct.DMA2D_OutputGreen = 0x00;
    /* 配置红色通道 */
    DMA2D_InitStruct.DMA2D_OutputRed = 0xff;
    /* 配置传输到第二层的显存首地址,此处是将矩形向右偏移350px,向下偏移200px  */
    DMA2D_InitStruct.DMA2D_OutputMemoryAdd = LCD_LAYER2_START_ADDR+LCD_WIDTH*200*4+350*4;
    /* 如果是整屏配置,这里无需偏移,偏移取决与行像素数 */
    DMA2D_InitStruct.DMA2D_OutputOffset = 800-100;
    /* 设置每行像素数,即矩形宽为100px */
    DMA2D_InitStruct.DMA2D_PixelPerLine = 100;
    /* 设置显示的行数,即矩形长为100px */
    DMA2D_InitStruct.DMA2D_NumberOfLine = 100;
    /* 初始化DMA2D */
    DMA2D_Init(&DMA2D_InitStruct);
    /* 启动DMA2D传输 */
    DMA2D_StartTransfer();
    /* 等待DMA2D传输完成 */
    while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC)== RESET);
}

在这里插入图片描述

绘制横直线:

/**
  * @brief DMA2D绘制线宽为1px,线长为100px的横线
  * @param None
  * @retval None
  */
void DMA_Draw_Horiz_Line(void)
{
    DMA2D_InitTypeDef DMA2D_InitStruct;
    /* 传输模式设置位从寄存器到存储器 */
    DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;
    /* 颜色模式取决于上面我们设置的LTDC第二层的颜色模式 */
    DMA2D_InitStruct.DMA2D_CMode = DMA2D_ARGB8888;
    /* 配置透明通道 */
    DMA2D_InitStruct.DMA2D_OutputAlpha = 0xff;
    /* 配置蓝色通道 */
    DMA2D_InitStruct.DMA2D_OutputBlue = 0x00;
    /* 配置绿色通道 */
    DMA2D_InitStruct.DMA2D_OutputGreen = 0x00;
    /* 配置红色通道 */
    DMA2D_InitStruct.DMA2D_OutputRed = 0xff;
    /* 配置传输到第二层的显存首地址,此处是将矩形向右偏移250px,向下偏移200px */
    DMA2D_InitStruct.DMA2D_OutputMemoryAdd = LCD_LAYER2_START_ADDR+LCD_WIDTH*200*4+250*4;
    /* 如果是整屏配置,这里无需偏移,偏移取决与行像素数 */
    DMA2D_InitStruct.DMA2D_OutputOffset = 800-100;
    /* 设置每行像素数 */
    DMA2D_InitStruct.DMA2D_PixelPerLine = 100;
    /* 设置显示的行数 */
    DMA2D_InitStruct.DMA2D_NumberOfLine = 1;
    /* 初始化DMA2D */
    DMA2D_Init(&DMA2D_InitStruct);
    /* 启动DMA2D传输 */
    DMA2D_StartTransfer();
    /* 等待DMA2D传输完成 */
    while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC)== RESET);
}

效果图:晚上拍的照,颜色显示不是很明显

在这里插入图片描述

绘制竖直线:

/**
  * @brief DMA2D绘制线宽为1px,线长为100px的竖线
  * @param None
  * @retval None
  */
void DMA_Draw_Vertical_Line(void)
{
    DMA2D_InitTypeDef DMA2D_InitStruct;
    /* 传输模式设置位从寄存器到存储器 */
    DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;
    /* 颜色模式取决于上面我们设置的LTDC第二层的颜色模式 */
    DMA2D_InitStruct.DMA2D_CMode = DMA2D_ARGB8888;
    /* 配置透明通道 */
    DMA2D_InitStruct.DMA2D_OutputAlpha = 0xff;
    /* 配置蓝色通道 */
    DMA2D_InitStruct.DMA2D_OutputBlue = 0x00;
    /* 配置绿色通道 */
    DMA2D_InitStruct.DMA2D_OutputGreen = 0x00;
    /* 配置红色通道 */
    DMA2D_InitStruct.DMA2D_OutputRed = 0xff;
    /* 配置传输到第二层的显存首地址,此处是将矩形向右偏移250px,向下偏移200px */
    DMA2D_InitStruct.DMA2D_OutputMemoryAdd = LCD_LAYER2_START_ADDR+LCD_WIDTH*200*4+250*4;
    /* 如果是整屏配置,这里无需偏移,偏移取决与行像素数 */
    DMA2D_InitStruct.DMA2D_OutputOffset = 800-1;
    /* 设置每行像素数 */
    DMA2D_InitStruct.DMA2D_PixelPerLine = 1;
    /* 设置显示的行数 */
    DMA2D_InitStruct.DMA2D_NumberOfLine = 100;
    /* 初始化DMA2D */
    DMA2D_Init(&DMA2D_InitStruct);
    /* 启动DMA2D传输 */
    DMA2D_StartTransfer();
    /* 等待DMA2D传输完成 */
    while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC)== RESET);
}

效果图:晚上拍的照,颜色显示不是很明显

在这里插入图片描述

OK,本节内容就学习到这里,下一节继续学习关于LCD更深层次的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1062347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

矩阵的c++实现(2)

上一次我们了解了矩阵的运算和如何使用矩阵解决斐波那契数列&#xff0c;这一次我们多看看例题&#xff0c;了解什么情况下用矩阵比较合适。 先看例题 1.洛谷P1939 【模板】矩阵加速&#xff08;数列&#xff09; 模板题应该很简单。 补&#xff1a;1<n<10^9 10^9肯定…

进程调度算法之时间片轮转调度(RR),优先级调度以及多级反馈队列调度

1.时间片轮转调度算法(RR) round Robin 1.算法思想 公平地、轮流地为各个进程服务&#xff0c;让每个进程在一定时间间隔内都可以得到响应。 2.算法规则 按照各进程到达就绪队列的顺序&#xff0c;轮流让各个进程执行一个时间片&#xff08;如100ms&#xff09;。 若进程未…

项目_游戏|外星人入侵

导入pygame&#xff0c;设定游戏屏幕&#xff08;大小、颜色&#xff09;&#xff0c;及游戏循环、退出机制 创建设置类 导入ship&#xff0c;绘制飞船 图灵官网&#xff0c;源代码文件没法下载&#xff0c;从网上找图片&#xff0c;更改尺寸及后缀&#xff0c;存入文件导入。 …

JS-前端在dom中预览pdf等文件

1、将pdf等文件显示到dom元素中预览 pdf文件可以是blob、url、file类型等只要使用URL.createObjectURL(file)全部转为URL即可使用无需借助任何插件&#xff0c;只需要使用<object></object>标签即可实现 1.1、html <template><div class"home"…

【数据结构与算法】树、二叉树的概念及结构(详解)

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--树以及二叉树的概念与结构 目录 一.树概念及结构 1.树的概念 1.1树与非树 树的特点&#xff1…

几分钟就搞定网站速度慢、网站卡等问题

为了改善网站加载速度&#xff0c;你可以考虑以下方法&#xff1a; 优化资源压缩&#xff1a;采用gzip或其他压缩算法来压缩网页的HTML、CSS和JavaScript等资源&#xff0c;从而减小数据传输的大小&#xff0c;提高加载速度。 精心挑选图片&#xff1a;选择适当的图片格式&…

7-2 图着色问题

输入样例&#xff1a; 6 8 3 2 1 1 3 4 6 2 5 2 4 5 4 5 6 3 6 4 1 2 3 3 1 2 4 5 6 6 4 5 1 2 3 4 5 6 2 3 4 2 3 4 输出样例&#xff1a; Yes Yes No No idea 注意合理的方案需满足&#xff1a;用到的颜色数 给定颜色数 solution #include <cstdio> #include &l…

防御—IPsecVPN

目录 1. 什么是数据认证&#xff0c;有什么作用&#xff0c;有哪些实现的技术手段&#xff1f; 数据认证的主要作用包括&#xff1a; 实现数据认证的主要手段包括&#xff1a; 2. 什么是身份认证&#xff0c;有什么作用&#xff0c;有哪些实现的技术手段&#xff1f; 3. 什…

Java小游戏:趣味猜数字

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、游戏介绍二、输入输出1、输出的控制台2、从键盘上输入 三、随机数生成四、游戏实现 Hello&#xff01;我们来用前面学过的东…

python执行pip指令时,提示“You should consider upgrading……”的解决方法

警告信息如下&#xff1a; WARNING: You are using pip version 21.1.2; however, version 21.3.1 is available. You should consider upgrading via the C:\Users\PycharmProjects\pythonProject\venv\Scripts\python.exe -m pip install --upgrade pip command.解决方法&am…

PsychoPy Coder 心理学实验 斯特鲁普效应

选题&#xff1a;斯特鲁普效应实验 选题来源&#xff1a;你知道的「有趣的心理学实验」有哪些&#xff1f; - 知乎 (zhihu.com) 测试目标&#xff1a;探索斯特鲁普效应&#xff0c;即被试在判断文字颜色时&#xff0c;当文字的颜色与其所表示的颜色名称不一致时&#xff0c;是…

JS-Dom转为图片,并放入pdf中进行下载

1、将dom转换为图片 这里我们使用html2canvas工具插件先将dom转为canvas元素然后canvas拥有一个方法可以将绘制出来的图形转为url然后下载即可注意&#xff1a;如果元素使用了渐变背景并透明的话&#xff0c;生成的图片可能会有点问题。我下面这个案例使用了渐变背景实现元素对…

LLM下半场之Agent基础能力概述:Profile、Memory、Plan、Action、Eval学习笔记

一.Agent发展将会是LLM的下半场 目前大家都在讨论LLM&#xff0c;LLM解决的问题是帮助机器像人类一样理解彼此的意图&#xff0c;本质上来讲&#xff0c;LLM更像是一个技术或者工具。但是人类社会发生变革的引线&#xff0c;往往是一个产品或者解决方案&#xff0c;比如电池技…

润滑油泵控制(博途SCL源代码)

有关博途PLC定时器的各种使用方法请参考下面文章链接: 博途PLC IEC定时器编程应用(SCL语言)_博图 定时器-CSDN博客博途PLC定时器支持数据类型TIME 类型 ,写法支持T#2M10S 、T#10S等,时基是MS所以如果设置1M用 DINT数据类型就是60000,大部分HMI上数据类型很多不支持IEC的…

IDEA中maven无法下载依赖解决方案

如果你尝试了很多网上的办法 仍然没有解决 那么很有可能和我一样碰到**了&#xff0c;解决办法千奇百怪&#xff0c; 解决之前&#xff08;山丹丹的那个红艳艳&#xff09;都没我屏幕红&#xff0c;本人试了一下几种 1、检查maven配置 settings.xml(应该都没问题)&#xff0c…

微信公众号模板消息First,Remark字段不显示,备注字段不见了

今天在开发公众号过程中有个需求发模板消息我设置的如下 成绩单打印通知&#xff01;姓名&#xff1a;{{name.DATA}} 学号&#xff1a;{{stuid.DATA}}状态&#xff1a;{{status.DATA}}时间&#xff1a;{{date.DATA}} 备注&#xff1a;{{remark.DATA}} 然后发完通知发现《…

AtCoder Beginner Contest 232(A-G)

A - QQ solver (atcoder.jp)直接按题意模拟即可。 B - Caesar Cipher (atcoder.jp)按题意模拟即可 C - Graph Isomorphism (atcoder.jp)按题意模拟即可 D - Weak Takahashi (atcoder.jp) 一个非常套路的网格dp E - Rook Path (atcoder.jp) &#xff08;1&#xff09;题意 有…

C++ stack和queue及优先级队列

stack的介绍 stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;并提供一组特定的成员函数来访问其元素&#xff0c;将特定类作为其底层的&#xff0c;元素特定容器的尾部(即栈顶)被压入和弹出 stack的底层容器可以是任何标准…

基于SpringBoot的ElasticSearch操作(超详细教程)

一、ElasticSearch 简介 1、简介 ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多员工能力的全文搜索引擎&#xff0c;基于 RESTful web 接口。Elasticsearch 是用 Java 语言开发的&#xff0c;并作为 Apache 许可条款下的开放源码发布&#xff0c;是一种…

Vue中如何进行文件浏览与文件管理

Vue中的文件浏览与文件管理 文件浏览与文件管理是许多Web应用程序中常见的功能之一。在Vue.js中&#xff0c;您可以轻松地实现文件浏览和管理功能&#xff0c;使您的应用程序更具交互性和可用性。本文将向您展示如何使用Vue.js构建文件浏览器和文件管理功能&#xff0c;以及如…