下载软件app排行榜,穆棱seo,建设工程资料下载网站,网站页面布局图026- STM32学习笔记 - 液晶屏控制#xff08;三#xff09; - DMA2D快速绘制矩形、直线等 上节直接操作LTDC在先视频上直接显示#xff0c;我们直接操作显存地址空间中的内容#xff0c;用来显示图形#xff0c;但是相对来说#xff0c;这种方法费时费力#xff0c;这节…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; /* 配置输出图像的蓝色通道值ARGB88880x00 - 0xFF、RGB8880x00 - 0xFF、RGB5650x00 - 0x1F、ARGB15550x00 - 0x1F、ARGB44440x00 - 0x0F */uint32_t DMA2D_OutputGreen; /* 配置输出图像的绿色通道值ARGB88880x00 - 0xFF、RGB8880x00 - 0xFF、RGB5650x00 - 0x2F、ARGB15550x00 - 0x1F、ARGB44440x00 - 0x0F*/uint32_t DMA2D_OutputRed; /* 配置输出图像的红色通道值ARGB88880x00 - 0xFF、RGB8880x00 - 0xFF、RGB5650x00 - 0x1F、ARGB15550x00 - 0x1F、ARGB44440x00 - 0x0F */uint32_t DMA2D_OutputAlpha; /* 配置输出图像的红色通道值ARGB88880x00 - 0xFF、ARGB15550x00 - 0x01、ARGB44440x00 - 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-16右边的线宽为2像素行偏移的值为7-25这样可以总结 行偏移的值 行宽度 − 线宽 行偏移的值 行宽度 - 线宽 行偏移的值行宽度−线宽
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_ADDRLCD_WIDTH*200*4350*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_ADDRLCD_WIDTH*200*4250*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_ADDRLCD_WIDTH*200*4250*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更深层次的内容。