硬汉嵌入式论坛

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

[LTDC] H743+LTDC+SDRAM+DMA2D,矩形刷新会覆盖整个Y轴问题。

[复制链接]
回帖奖励 2 个金币 回复本帖可获得 1 个金币奖励! 每人限 1 次(中奖概率 50%)

5

主题

13

回帖

28

积分

新手上路

积分
28
发表于 2024-7-6 20:18:54 | 显示全部楼层 |阅读模式
本帖最后由 救世主 于 2024-7-6 20:20 编辑

移植正点原子的代码,使用LcdColorFill(0, 0, 500, 1, (uint16_t*)0xDDDD);                               



即刷新屏幕起点到(500,1)只刷新一行500个点,但是效果确实这样 6614fd88d0639f25546b5095c3dd51cc.jpg ,经过debug测试,发现是把Y轴铺满了,并且逐个验证了DMA2D的寄存器与0XC0000000的内存地址,DMA2D的寄存器数据正常,内存也是我代码输入应该显示的数据,也就是说内存里面只有一行的数据,但是显示出来的效果却是这样,。很疑惑,猜测是LTDC的问题。贴上LTDC的配置吧

谢谢大佬们帮忙看一下 QQ截图20240706201947.png QQ截图20240706201804.png




回复

使用道具 举报

5

主题

13

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2024-7-6 21:03:46 | 显示全部楼层
最新尝试了一下,我直接改显存数组,发现屏幕并无变化
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-7-8 09:26:43 | 显示全部楼层
供参考:

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*
*	模块名称 : 主程序模块
*	文件名称 : main.c
*	版    本 : V1.0
*	说    明 : DMA2D功能测试。
*              实验目的:
*                1. 学习DMA2D显示色块,位图,Alpha混合和图片混合等。
*              实验内容:
*                1. 启动1个200ms的自动重装定时器,让LED2每200ms翻转一次。
*                2. 第1个图:使用DMA2D刷色块。
*                3. 第2个图:显示ARGB8888位图。
*                4. 第3个图:显示RGB565位图。
*                5. 第4个图:两个位图混合。
*                6. 第5个图:Alpha透明度200的位图显示。
*                7. 第6个图:Alpha透明度100的位图显示。
*              注意事项:
*                1. 本实验推荐使用串口软件SecureCRT查看打印信息,波特率115200,数据位8,奇偶校验位无,停止位1。
*                2. 务必将编辑器的缩进参数和TAB设置为4来阅读本文件,要不代码显示不整齐。
*
*	修改记录 :
*		版本号   日期         作者        说明
*		V1.0    2019-04-26   Eric2013     1. CMSIS软包版本 V5.4.0
*                                         2. HAL库版本 V1.3.0
*		V1.1    2020-12-31   Eric2013     1. CMSIS软包版本 V5.7.0
*                                         2. HAL库版本 V1.9.0
*                                         
*	Copyright (C), 2020-2030, 安富莱电子 [url]www.armfly.com[/url]
*
*********************************************************************************************************
*/	
#include "bsp.h"			 /* 底层硬件驱动 */



/* 定义例程名和例程发布日期 */
#define EXAMPLE_NAME	"V7-DMA2D功能测试(显示色块,位图,Alpha混合和图片混合等)"
#define EXAMPLE_DATE	"2019-04-26"
#define DEMO_VER		"1.0"


static void PrintfHelp(void);
static void PrintfLogo(void);

/* 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) {} 
}

/*
*********************************************************************************************************
*	函 数 名: PrintfHelp
*	功能说明: 打印操作提示
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
static void PrintfHelp(void)
{
	printf("操作提示:\r\n");
	printf("1. 第1个图:使用DMA2D刷色块\r\n");
	printf("2. 第2个图:显示ARGB8888位图\r\n");
	printf("3. 第3个图:显示RGB565位图\r\n");
	printf("4. 第4个图:两个位图混合\r\n");
	printf("5. 第5个图:Alpha透明度200\r\n");
	printf("6. 第6个图:Alpha透明度100\r\n");
}

/*
*********************************************************************************************************
*	函 数 名: PrintfLogo
*	功能说明: 打印例程名称和例程发布日期, 接上串口线后,打开PC机的超级终端软件可以观察结果
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
static void PrintfLogo(void)
{
	printf("*************************************************************\n\r");
	
	/* 检测CPU ID */
	{
		uint32_t CPU_Sn0, CPU_Sn1, CPU_Sn2;
		
		CPU_Sn0 = *(__IO uint32_t*)(0x1FF1E800);
		CPU_Sn1 = *(__IO uint32_t*)(0x1FF1E800 + 4);
		CPU_Sn2 = *(__IO uint32_t*)(0x1FF1E800 + 8);

		printf("\r\nCPU : STM32H743XIH6, BGA240, 主频: %dMHz\r\n", SystemCoreClock / 1000000);
		printf("UID = %08X %08X %08X\n\r", CPU_Sn2, CPU_Sn1, CPU_Sn0);
	}

	printf("\n\r");
	printf("*************************************************************\n\r");
	printf("* 例程名称   : %s\r\n", EXAMPLE_NAME);	/* 打印例程名称 */
	printf("* 例程版本   : %s\r\n", DEMO_VER);		/* 打印例程版本 */
	printf("* 发布日期   : %s\r\n", EXAMPLE_DATE);	/* 打印例程日期 */

	/* 打印ST的HAL库版本 */
	printf("* HAL库版本  : V1.9.0 (STM32H7xx HAL Driver)\r\n");
	printf("* \r\n");	/* 打印一行空格 */
	printf("* QQ    : 1295744630 \r\n");
	printf("* 旺旺  : armfly\r\n");
	printf("* Email : [email]armfly@qq.com[/email] \r\n");
	printf("* 微信公众号: armfly_com \r\n");
	printf("* 淘宝店: armfly.taobao.com\r\n");
	printf("* Copyright [url]www.armfly.com[/url] 安富莱电子\r\n");
	printf("*************************************************************\n\r");
}

/***************************** 安富莱电子 [url]www.armfly.com[/url] (END OF FILE) *********************************/



23456.png



评分

参与人数 1金币 +2 收起 理由
救世主 + 2 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-15 02:16 , Processed in 0.057776 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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