硬汉嵌入式论坛

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

[DMA2D] STM32H743 LVGL开启DMA后 屏幕显示异常

[复制链接]

3

主题

5

回帖

14

积分

新手上路

积分
14
发表于 2024-9-22 23:20:09 | 显示全部楼层 |阅读模式
程序在F407上,分别用了驱动自带的画点函数和DMA中断+SetWindows函数,都正常跑。
但在H743这里,用驱动画点函数正常,DMA中断SetWindows函数的方法,屏幕会显示异常。
以下是SetWindows

[C] 纯文本查看 复制代码
void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
{	
	LCD_WR_REG(lcddev.setxcmd);	
	LCD_WR_DATA(xStar>>8);
	LCD_WR_DATA(0x00FF&xStar);		
	LCD_WR_DATA(xEnd>>8);
	LCD_WR_DATA(0x00FF&xEnd);

	LCD_WR_REG(lcddev.setycmd);	
	LCD_WR_DATA(yStar>>8);
	LCD_WR_DATA(0x00FF&yStar);		
	LCD_WR_DATA(yEnd>>8);
	LCD_WR_DATA(0x00FF&yEnd);

	LCD_WriteRAM_Prepare();	//开始写入GRAM			
}   

其中LCD_WriteRAM_Prepare函数实际为LCD->LCD_REG=0x2C;

然后这是调用disp_flush函数的,上面被注释掉的部分是驱动自带画点函数
[C] 纯文本查看 复制代码
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
//    if(disp_flush_enabled) {
//        /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/

//        int32_t x;
//        int32_t y;
//        for(y = area->y1; y <= area->y2; y++) {
//            for(x = area->x1; x <= area->x2; x++) {
//                /*Put a pixel to the display. For example:*/
//                /*put_px(x, y, *color_p)*/
//				GUI_DrawPoint(x,y,*(uint16_t*)color_p);
//                color_p++;
//            }
//        }
//    }

//    /*IMPORTANT!!!
//     *Inform the graphics library that you are ready with the flushing*/
//    lv_disp_flush_ready(disp_drv);
	//启用DMA
	if(disp_flush_enabled) {
	disp_drv1 = disp_drv;
	LCD_SetWindows(area->x1,area->y1,area->x2,area->y2); //设置LCD屏幕的扫描区域
	HAL_DMA_Start_IT(&hdma_memtomem_dma1_stream0, (uint32_t)color_p, (uint32_t)&LCD->LCD_RAM,
		((area->x2+1) - area->x1) * ((area->y2+1) - area->y1));
	}
}


然后DMA回调函数是
[C] 纯文本查看 复制代码
void LVGL_LCD_FSMC_DMA_pCallback(DMA_HandleTypeDef *_hdma)
{
	lv_disp_flush_ready(disp_drv1);
}

在CubeMX中DMA配置如下:
PixPin_2024-09-22_23-15-56.jpg
并且根据网上查到的资料,需要开启MPU才行,我怀疑是开启MPU的配置问题?MPU+DMA有问题,MPU+驱动画点函数又没有问题。MPU配置如下:
PixPin_2024-09-22_23-16-04.jpg

最后附上出现问题的屏幕画面(使用DMA)和正常状态的屏幕画面(使用驱动画点函数)
_cgi-bin_mmwebwx-bin_webwxgetmsgimg__&MsgID=2421482441510562375&skey=@crypt_.jpg
_cgi-bin_mmwebwx-bin_webwxgetmsgimg__&MsgID=6735022157938217902&skey=@crypt_.jpg
排问题排了好久了,排下来感觉是MPU那块设置问题,因为从F4到H7其他的基本没变,就多了MPU设置这块,试过若不配置MPU屏幕就不显示。
求大佬们指点!感激!

回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2024-9-23 08:17:51 | 显示全部楼层
早上起来折腾了会,问题完美解决。就是开启了缓存的缘故,参考该帖子https://forum.anfulai.cn/forum.php?mod=viewthread&tid=107622
解决方法:解决数据一致性的问题,在启用DMA中断前后均调用一次SCB_CleanInvalidateDCache();即可
具体是在disp_flush函数中,添加两行SCB_CleanInvalidateDCache();
[C] 纯文本查看 复制代码
if(disp_flush_enabled) {
	disp_drv1 = disp_drv;
		//有问题 开启DMA后屏幕显示有误
	LCD_SetWindows(area->x1,area->y1,area->x2,area->y2); //设置LCD屏幕的扫描区域
	SCB_CleanInvalidateDCache();
	HAL_DMA_Start_IT(&hdma_memtomem_dma1_stream0, (uint32_t)color_p, (uint32_t)&LCD->LCD_RAM,
		((area->x2+1) - area->x1) * ((area->y2+1) - area->y1));
	SCB_CleanInvalidateDCache();
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-9-23 08:29:26 | 显示全部楼层
这种的一般是Cache问题,省事些,这个地方直接Disable,看看是不是正常了

123.png


回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2024-9-23 18:12:28 | 显示全部楼层
eric2013 发表于 2024-9-23 08:29
这种的一般是Cache问题,省事些,这个地方直接Disable,看看是不是正常了

谢谢,关闭这个之后确实正常了,不过对比了下,发现开启DCache加那两行代码后帧数能提高不少。H7加的Cache真是好东西。有空细细研究一下MPU
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-9-24 09:49:08 | 显示全部楼层
vrxiaojie 发表于 2024-9-23 18:12
谢谢,关闭这个之后确实正常了,不过对比了下,发现开启DCache加那两行代码后帧数能提高不少。H7加的Cach ...

可以开启,然后手动调用Cache的Clean和无效化操作,会好不少。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2024-11-8 17:08:26 | 显示全部楼层
你好,你的这个STM32H743的FMC驱动的LCD LVGL刷屏的程序能参考下吗?我也是FMC驱动的LCD,LVGL刷屏的时候屏幕一直花屏,不正点是什么原因。

























回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-11-9 09:23:48 | 显示全部楼层
jiangyouzhi 发表于 2024-11-8 17:08
你好,你的这个STM32H743的FMC驱动的LCD LVGL刷屏的程序能参考下吗?我也是FMC驱动的LCD,LVGL刷屏的时候屏 ...

参考我这个试试,不过是F407的FSMC

STM32F407+LVGL8+RA8875+外部SRAM,视频展示800*480做滑动效果流畅度也不错(2023-07-18)
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=120162
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-11-14 11:24:00 | 显示全部楼层
jiangyouzhi 发表于 2024-11-8 17:08
你好,你的这个STM32H743的FMC驱动的LCD LVGL刷屏的程序能参考下吗?我也是FMC驱动的LCD,LVGL刷屏的时候屏 ...

我觉得花屏是因为数据传输异常,多穿或者重复传了
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-11-15 14:41:52 | 显示全部楼层
eric2013 发表于 2024-9-23 08:29
这种的一般是Cache问题,省事些,这个地方直接Disable,看看是不是正常了

硬汉哥,使用硬件SPI+DMA驱动OLED显示屏,这个硬件SPI意味着我MCU的    spi_init_struct.nss                  = SPI_NSS_HARD;以及MCU的NSS和显示屏的NSS脚要接在一起吗?因为我目前接受的代码是    spi_init_struct.nss                  = SPI_NSS_SOFT;然后两个脚没接在一起,我启动DMA,传输的时候,CLK之间的时间间隔非常大
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-11-16 10:41:53 | 显示全部楼层
学知识 发表于 2024-11-15 14:41
硬汉哥,使用硬件SPI+DMA驱动OLED显示屏,这个硬件SPI意味着我MCU的    spi_init_struct.nss             ...

1、是硬件SPI的NSS片选的话,每个数据间隔可以调节。有个参数可以配置。设置到最小值也是有间隙的。
2、如果使用软件SPI片选,无论是连接还是没有连接,也是有间隙的,你测试下你的这个间隙时间是多少
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-11-22 21:32:17 | 显示全部楼层
vrxiaojie 发表于 2024-9-23 08:17
早上起来折腾了会,问题完美解决。就是开启了缓存的缘故,参考该帖子https://forum.anfulai.cn/forum.php?mod= ...

感谢,解决了
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-12-2 11:28:16 | 显示全部楼层
您好,您这个lv_disp_flush_ready(disp_drv1); 是如何被其它.C调用的啊?我在lv_port_disp.c里面定义lv_disp_drv_t * disp_drv1;.h里面extern,extern lv_disp_drv_t * disp_drv1;同样在static void disp_flush里面复制一下指针,当我的DMA分批次传输完成之后,调用lv_disp_flush_ready(disp_drv1); 结果每次都卡死在draw_buf_flush里面的draw_buf_flush
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-7-2 15:10:11 | 显示全部楼层
你这个DMA程序可以方便借鉴一下吗?我目前也遇到了H7 DMA驱动屏幕显示问题,不过是局部会出现画面撕裂
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 03:53 , Processed in 0.049203 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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