硬汉嵌入式论坛

 找回密码
 立即注册
查看: 377|回复: 4
收起左侧

[DMA2D] RGB屏幕DMA2D填充色块只能设置宽不能设置高是什么情况

[复制链接]

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2023-8-21 16:14:03 | 显示全部楼层 |阅读模式
我使用的硬件设备是ART-Pi加正点原子的7寸RGB分辨率为1024*600,今天在进行DMA2D填充色块实验的时候不知道为啥我照着原子的代码写的但是我的只能设置色块的宽度设置高度不起效果,这是为啥?求助社区大佬帮忙😭我把我LTDC初始化的代码贴出来
[C] 纯文本查看 复制代码
/* LTDC init function */这是初始LTDC的void MX_LTDC_Init(void){  /* USER CODE BEGIN LTDC_Init 0 */  /* USER CODE END LTDC_Init 0 */  LTDC_LayerCfgTypeDef pLayerCfg = {0};  /* USER CODE BEGIN LTDC_Init 1 */  /* USER CODE END LTDC_Init 1 */  hltdc.Instance = LTDC;  hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;  hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;  hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;  hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;  hltdc.Init.HorizontalSync = 1;  hltdc.Init.VerticalSync = 1;  hltdc.Init.AccumulatedHBP = 47;  hltdc.Init.AccumulatedVBP = 24;  hltdc.Init.AccumulatedActiveW = 1071;  hltdc.Init.AccumulatedActiveH = 624;  hltdc.Init.TotalWidth = 1261;  hltdc.Init.TotalHeigh = 646;  hltdc.Init.Backcolor.Blue = 0;  hltdc.Init.Backcolor.Green = 0;  hltdc.Init.Backcolor.Red = 0;  if (HAL_LTDC_Init(&hltdc) != HAL_OK)  {    Error_Handler();  }  pLayerCfg.WindowX0 = 0;  pLayerCfg.WindowX1 = 1024;  pLayerCfg.WindowY0 = 0;  pLayerCfg.WindowY1 = 600;  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB888;  pLayerCfg.Alpha = 255;  pLayerCfg.Alpha0 = 0;  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;  pLayerCfg.FBStartAdress = 0xC0000000;  pLayerCfg.ImageWidth = 0;  pLayerCfg.ImageHeight = 0;  pLayerCfg.Backcolor.Blue = 0;  pLayerCfg.Backcolor.Green = 0;  pLayerCfg.Backcolor.Red = 0;  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)  {    Error_Handler();  }  /* USER CODE BEGIN LTDC_Init 2 */  /* USER CODE END LTDC_Init 2 */}下面是填充色块的代码uint16_t framebuf[1280][800] __attribute__((at(0xC0000000)));    //定义最大屏分辨率时,LCD所需的帧缓存数组大小void dma2d_file(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint32_t color){    uint32_t addr;    uint32_t offlien=0;    addr=(uint32_t)framebuf+2*(1024*sy+sx);    offlien=1024-(ex-sx+1);    DMA2D->CR           &=    ~(DMA2D_CR_START);                        // 停止DMA2D    DMA2D->CR                =    DMA2D_R2M;                                        // 寄存器到SDRAM    DMA2D->OPFCCR        =    LTDC_PIXEL_FORMAT_RGB888;            // 设置颜色格式    DMA2D->OMAR            =    addr ;                                // 地址    DMA2D->OOR      = offlien;    DMA2D->NLR      =((ex-sx+1)<<16)|(ey-sy+1);    DMA2D->OCOLR        =    color;                                                // 颜色    DMA2D->CR          |=    DMA2D_CR_START;                                // 启动DMA2D    while ((DMA2D->ISR & DMA2D_FLAG_TC)==0) ;                        // 等待传输完成    DMA2D->IFCR |= DMA2D_FLAG_TC;}dma2d_file(0,0,200,200,0xff00ff00);


最后的效果是这样的


d67674c9f8c3a69a561bdb6e312f4587.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-22 08:54:58 | 显示全部楼层
楼主方便的话,整理下代码,代码没法查看
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-8-22 12:37:32 | 显示全部楼层
eric2013 发表于 2023-8-22 08:54
楼主方便的话,整理下代码,代码没法查看

好,不知道啥情况是这样的
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-8-22 12:39:42 | 显示全部楼层
[C] 纯文本查看 复制代码
void MX_LTDC_Init(void)
{

  /* USER CODE BEGIN LTDC_Init 0 */

  /* USER CODE END LTDC_Init 0 */

  LTDC_LayerCfgTypeDef pLayerCfg = {0};

  /* USER CODE BEGIN LTDC_Init 1 */

  /* USER CODE END LTDC_Init 1 */
  hltdc.Instance = LTDC;
  hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
  hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
  hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
  hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
  hltdc.Init.HorizontalSync = 1;
  hltdc.Init.VerticalSync = 1;
  hltdc.Init.AccumulatedHBP = 47;
  hltdc.Init.AccumulatedVBP = 24;
  hltdc.Init.AccumulatedActiveW = 1071;
  hltdc.Init.AccumulatedActiveH = 624;
  hltdc.Init.TotalWidth = 1261;
  hltdc.Init.TotalHeigh = 646;
  hltdc.Init.Backcolor.Blue = 0;
  hltdc.Init.Backcolor.Green = 0;
  hltdc.Init.Backcolor.Red = 0;
  if (HAL_LTDC_Init(&hltdc) != HAL_OK)
  {
    Error_Handler();
  }
  pLayerCfg.WindowX0 = 0;
  pLayerCfg.WindowX1 = 1024;
  pLayerCfg.WindowY0 = 0;
  pLayerCfg.WindowY1 = 600;
  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
  pLayerCfg.Alpha = 255;
  pLayerCfg.Alpha0 = 0;
  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
  pLayerCfg.FBStartAdress = 0xC0000000;
  pLayerCfg.ImageWidth = 0;
  pLayerCfg.ImageHeight = 0;
  pLayerCfg.Backcolor.Blue = 0;
  pLayerCfg.Backcolor.Green = 0;
  pLayerCfg.Backcolor.Red = 0;
  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN LTDC_Init 2 */

  /* USER CODE END LTDC_Init 2 */

}

下面是填充颜色的代码
void dma2d_file(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint32_t color)
{
	
	uint32_t addr;
	uint32_t offlien=0;
	addr=(uint32_t)framebuf+2*(1024*sy+sx);
	
	offlien=1024-(ex-sx+1);
	
	DMA2D->CR	  	 &=	~(DMA2D_CR_START);						// 停止DMA2D
	DMA2D->CR				=	DMA2D_R2M;										// 寄存器到SDRAM
	DMA2D->OPFCCR		=	LTDC_PIXEL_FORMAT_RGB565;			// 设置颜色格式
	
	DMA2D->OMAR			=	addr ;								// 地址
	DMA2D->OOR      = offlien;
	
	DMA2D->NLR      =((ex-sx+1)<<16)|(ey-sy+1);
	
	DMA2D->OCOLR		=	color;												// 颜色
	
	DMA2D->CR	  	|=	DMA2D_CR_START;								// 启动DMA2D
		
	while ((DMA2D->ISR & DMA2D_FLAG_TC)==0) ;						// 等待传输完成
	DMA2D->IFCR |= DMA2D_FLAG_TC;
}
使用的方式
dma2d_file(0,0,200,200,0xf800);
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-23 08:20:20 | 显示全部楼层
这个是我的,供参考


下载.png


[C] 纯文本查看 复制代码
/* DMA2D颜色填充功能 */
static void _DMA2D_Fill(void * pDst, 
	                    uint32_t xSize, 
                        uint32_t ySize, 
                        uint32_t OffLine, 
                        uint32_t ColorIndex, 
                        uint32_t PixelFormat);

/* 通过DMA2D从前景层复制指定区域的颜色数据到目标区域 */
static void _DMA2D_Copy(void * pSrc, 
	                    void * pDst, 
						uint32_t xSize, 
						uint32_t ySize, 
						uint32_t OffLineSrc, 
						uint32_t OffLineDst, 
						uint32_t PixelFormat);

/* 前景层和目标区域的颜色混合 */
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);

/* 前景层和背景层的颜色混合 */
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); 
/* ARGB8888格式位图显示 */
static void _DMA2D_DrawAlphaBitmap(void  * pDst, 
	                               void  * pSrc, 
								   uint32_t xSize, 
								   uint32_t ySize, 
								   uint32_t OffLineSrc, 
								   uint32_t OffLineDst, 
								   uint32_t PixelFormat);

/* 图片数据 */
extern const uint32_t _aclufei[128*128*4];
extern const uint32_t _acsuolong[128*128*4];
extern const uint16_t _achuoying[128*128*2];
extern const uint16_t _acmickey[128*128*2];

/*
*********************************************************************************************************
*	函 数 名: main
*	功能说明: c程序入口
*	形    参: 无
*	返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{
	uint16_t ucBright;	   	/* 背光亮度(0-255) */
    FONT_T tFont;		    /* 定义一个字体结构体变量,用于设置字体参数 */


	/* 设置字体参数 */
	{
		tFont.FontCode = FC_ST_16;		/* 字体代码 16点阵 */
		tFont.FrontColor = CL_WHITE;	/* 字体颜色 */
		tFont.BackColor = CL_BLUE;		/* 文字背景颜色 */
		tFont.Space = 0;				/* 文字间距,单位 = 像素 */
	}	
	
	bsp_Init();		/* 硬件初始化 */
	PrintfLogo();	/* 打印例程名称和版本等信息 */
	PrintfHelp();	/* 打印操作提示 */

	/* 延迟200ms再点亮背光,避免瞬间高亮 */
	bsp_DelayMS(200); 
	
	LCD_ClrScr(CL_BLUE);

	/* 界面整体显示完毕后,再打开背光,设置为缺省亮度 */
	bsp_DelayMS(100); 
	ucBright = BRIGHT_DEFAULT;
	LCD_SetBackLight(ucBright);
	
	/* 第1个图:使用DMA2D刷色块 ##############################################################*/
	LCD_DispStr(24, 2, "DMA2D刷色块", &tFont);
	_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个图:显示ARGB8888位图 ##############################################################*/
	LCD_DispStr(176, 2, "刷ARGB8888位图", &tFont);
    _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);                          /* 目标区颜色格式 */

	/* 第3个图:显示RGB565位图 ##############################################################*/
	LCD_DispStr(328, 2, "刷RGB565位图", &tFont);
	_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);                                    /* 目标区颜色格式 */


	/* 第4个图:两个位图混合 ##############################################################*/
	LCD_DispStr(24, 150, "两个位图混合", &tFont);						 
	_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);                                           /* 目标区高 */

	/* 第5个图:Alpha透明度200的位图显示 #######################################################*/
	LCD_DispStr(176, 150, "Alpha透明度200", &tFont);
	_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 */

	/* 第6个图:Alpha透明度100的位图显示 ####################################################*/
	LCD_DispStr(328, 150, "Alpha透明度100", &tFont);
	_DMA2D_MixColorsBulk((uint32_t *)_achuoying,                                  /* 位图地址 */
	                     0,                                                       /* 位图行偏移 */                     
					     (uint32_t *)(SDRAM_LCD_BUF1 + g_LcdWidth*168*2 + 328*2), /* 显示起始地址(328, 168) */
					     g_LcdWidth-128,                                          /* 目标区行偏移 */                                    
					     128,                                                     /* 目标区长 */
					     128,                                                     /* 目标区高 */          
					     100);                                                    /* 位图显示透明度200 */						 

	bsp_StartAutoTimer(0, 200); /* 启动1个200ms的自动重装的定时器,软件定时器0 */
	
	while (1)
	{
       bsp_Idle();
         
		/* 判断软件定时器0是否超时 */
		if(bsp_CheckTimer(0))
		{
			/* 每隔200ms 进来一次 */  
			bsp_LedToggle(2);
		}
	}
}

/*
*********************************************************************************************************
*	函 数 名: _DMA2D_Fill
*	功能说明: DMA2D颜色填充功能
*	形    参: pDst          颜色数据目的地址
*             xSize         色块X轴大小,即每行像素数
*             ySize         色块Y轴大小,即行数
*             OffLine       前景层图像的行偏移
*             ColorIndex    色块颜色值
*             PixelFormat   目标区颜色格式
*	返 回 值: 无
*********************************************************************************************************
*/
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) {} 
}

/*
*********************************************************************************************************
*	函 数 名: _DMA2D_Copy
*	功能说明: 通过DMA2D从前景层复制指定区域的颜色数据到目标区域
*	形    参: pSrc          颜色数据源地址
*             pDst          颜色数据目的地址
*             xSize         目的区域的X轴大小,即每行像素数
*             ySize         目的区域的Y轴大小,即行数
*             OffLineSrc    前景层图像的行偏移
*             OffLineDst    输出的行偏移
*             PixelFormat   目标区颜色格式
*	返 回 值: 无
*********************************************************************************************************
*/
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_MixColorsBulk
*	功能说明: 前景层和目标区域的颜色混合
*	形    参: pColorFG      前景层数据源地址
*             OffLineSrcFG  前景层图像的行偏移
*             pColorDst     目标区数据地址
*             OffLineDst    目标区的行偏移
*             xSize         目的区域的X轴大小,即每行像素数
*             ySize         目的区域的Y轴大小,即行数
*             Intens        设置前景层的透明度,255表示完全不透明,0表示完全透明
*	返 回 值: 无
*********************************************************************************************************
*/
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_AlphaBlendingBulk
*	功能说明: 前景层和背景层的颜色混合
*	形    参: pColorFG      前景层源数据地址
*             OffLineSrcFG  前景层源数据行偏移
*             pColorBG      背景层源数据地址
*             OffLineSrcBG  背景层源数据行偏移
*             pColorDst     目标区地址
*             OffLineDst    目标区行偏移
*             xSize         目标区域的X轴大小,即每行像素数
*             ySize         目标区域的Y轴大小,即行数
*	返 回 值: 无
*********************************************************************************************************
*/
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_DrawAlphaBitmap
*	功能说明: ARGB8888格式位图显示
*	形    参: pDst        目标区地址
*             pSrc        源数据地址,即位图首地址
*             xSize       目标区域的X轴大小,即每行像素数
*             ySize       目标区域的Y轴大小,即行数
*             OffLineSrc  源数据行偏移
*             OffLineDst  目标区行偏移
*             PixelFormat 目标区颜色格式
*	返 回 值: 无
*********************************************************************************************************
*/
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) {} 
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 18:34 , Processed in 0.202648 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表