硬汉嵌入式论坛

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

[LVGL] emwin和LVGL对比

  [复制链接]

3

主题

34

回帖

43

积分

新手上路

积分
43
发表于 2023-2-16 11:16:32 | 显示全部楼层 |阅读模式
硬件:芯片是国产GD32F470,主频是240M.外部挂的是16位sdram.屏幕800*600.
GUI:emwin6.24   LVGL8.3
软件:都用了IPA模式(stm32叫DMA2D),LVGL三级缓存了。
--------------------------------------------------
界面刷新的时候LVGL肉眼可见的慢点。各位大佬有啥好的建议
下面的是视频文件


emWin:

LVGL:



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2023-2-16 11:41:01 | 显示全部楼层
帮楼主更新为在线查看方式。
回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-2-16 13:44:53 来自手机 | 显示全部楼层
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2023-2-17 10:25:33 | 显示全部楼层
非常关注,问题解决了吗?怎么优化的,方便分享一下吗?
回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-2-17 15:03:31 | 显示全部楼层
Nick333 发表于 2023-2-17 10:25
非常关注,问题解决了吗?怎么优化的,方便分享一下吗?

目前还没有,感觉LVGL是不是就是这么卡
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2023-2-17 15:27:27 | 显示全部楼层
看一下你 disp_flush 函数里面的代码?
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2023-2-17 16:02:21 | 显示全部楼层
西域海盗 发表于 2023-2-17 15:03
目前还没有,感觉LVGL是不是就是这么卡

性能应该比emwin差一点,毕竟纯C写的,跑高分辨率的屏估计对芯片和内存的性能都要求比较高
回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-2-17 17:34:40 来自手机 | 显示全部楼层
本帖最后由 西域海盗 于 2023-2-17 18:07 编辑
#define GLCD_WIDTH     480
#define GLCD_HEIGHT    272
#defineLCD_DB_ADDR   0xC0000000
#define LCD_DB_PTR    ((volatile uint16_t *)LCD_DB_ADDR)
int32_t GLCD_DrawBitmap (uint32_t x,
                         uint32_t y,
                         uint32_t width,
                         uint32_t height,
                         const uint8_t *bitmap)
{
volatileuint16_t*phwDes=LCD_DB_PTR+y*GLCD_WIDTH+x;
    const uint16_t *phwSrc = (const uint16_t *)bitmap;
    for (int_fast16_t i = 0; i < height; i++) {
        memcpy ((uint16_t *)phwDes, phwSrc, width * 2);
        phwSrc += width;
        phwDes += GLCD_WIDTH;
    }
return 0;
}

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    GLCD_DrawBitmap(area->x1,            
                    area->y1,              
                    area->x2 - area->x1 + 1,   
                    area->y2 - area->y1 + 1,   
(constuint8_t*)color_p);
    lv_disp_flush_ready(disp_drv);
}




回复

使用道具 举报

44

主题

564

回帖

701

积分

金牌会员

积分
701
发表于 2023-2-18 15:34:45 | 显示全部楼层
西域海盗 发表于 2023-2-17 17:34
#define GLCD_WIDTH     480
#define GLCD_HEIGHT    272
#defineLCD_DB_ADDR   0xC0000000

你这个没有用DMA2D啊
回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-2-19 18:59:34 | 显示全部楼层
DMA2D用不用差不多,我测试过了
[C] 纯文本查看 复制代码
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
	/*Return if the area is out the screen*/
	disp_drv_p = disp_drv;
	uint32_t h = area->y2 - area->y1;
	uint32_t w = area->x2 - area->x1;
	
	uint32_t OffLineSrc = 800 - (area->x2 - area->x1 +1);
	uint32_t addr = EXT_SDRAM_ADDR + 2*(800*area->y1 + area->x1);
	// -- 中断传输
	// 模式
	IPA_CTL = 0x00000000UL | (1 << 9);
	// 源地址
	IPA_FMADDR = (uint32_t)(uint16_t*)(color_p);
	// 目标地址
	IPA_DMADDR = (uint32_t)addr;
	// 输入偏移
	IPA_FLOFF = 0; 
	// 输出偏移
	IPA_DLOFF =  OffLineSrc;
	/* 前景层和输出区域都采用的RGB565颜色格式 */
	IPA_FPCTL = IPA_DPF_RGB565;
	IPA_DPCTL = IPA_DPF_RGB565;
	// 多少行
	IPA_IMS = (area->y2-area->y1+1) | ((area->x2 -area->x1 +1) << 16);
	// 开启中断
	IPA_CTL |= IPA_CTL_FTFIE|IPA_CTL_WCFIE|IPA_CTL_LACIE;
	/* 启动传输 */
	IPA_CTL |= IPA_CTL_TEN;
	g_gpu_state = 1;
}
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2023-2-20 10:03:39 | 显示全部楼层
本帖最后由 ghslfgkkl88 于 2023-2-20 10:06 编辑
西域海盗 发表于 2023-2-17 17:34
#define GLCD_WIDTH     480
#define GLCD_HEIGHT    272
#defineLCD_DB_ADDR   0xC0000000

你不是开启双缓冲了吗?干嘛又复制一遍?像下面这样直接送显示就行了:
static void disp_flush( lv_disp_drv_t* disp_drv , const lv_area_t* area , lv_color_t* color_p )
{
    lcd显示地址寄存器 = color_p;
    lv_disp_flush_ready( disp_drv );
}




1676858610877.png


回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-2-20 17:01:59 | 显示全部楼层
ghslfgkkl88 发表于 2023-2-20 10:03
你不是开启双缓冲了吗?干嘛又复制一遍?像下面这样直接送显示就行了:
static void disp_flush( lv_dis ...

这个方式不能刷新了,不能显示了
回复

使用道具 举报

13

主题

45

回帖

84

积分

初级会员

积分
84
发表于 2023-2-21 08:48:08 | 显示全部楼层
ghslfgkkl88 发表于 2023-2-20 10:03
你不是开启双缓冲了吗?干嘛又复制一遍?像下面这样直接送显示就行了:
static void disp_flush( lv_dis ...

他这个不是两个帧BUFFER的双缓冲,是两个段BUFFER。这种是需要刷的
回复

使用道具 举报

13

主题

45

回帖

84

积分

初级会员

积分
84
发表于 2023-2-21 08:52:17 | 显示全部楼层
西域海盗 发表于 2023-2-20 17:01
这个方式不能刷新了,不能显示了

整个LVGL移植接口贴出来看看
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2023-2-21 09:29:53 | 显示全部楼层
a3748622 发表于 2023-2-21 08:48
他这个不是两个帧BUFFER的双缓冲,是两个段BUFFER。这种是需要刷的

原来还有这个区别
回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-2-21 09:41:21 | 显示全部楼层
a3748622 发表于 2023-2-21 08:52
整个LVGL移植接口贴出来看看

显示接口文件和GD_IPA驱动文件


lv_port_disp.c

12.13 KB, 下载次数: 13

显示接口文件

lv_gpu_gd32_ipa.c

9.09 KB, 下载次数: 11

GD_ipa

回复

使用道具 举报

13

主题

45

回帖

84

积分

初级会员

积分
84
发表于 2023-2-21 13:42:11 | 显示全部楼层
西域海盗 发表于 2023-2-21 09:41
显示接口文件和GD_IPA驱动文件

[C] 纯文本查看 复制代码
volatile uint8_t abi = 0;

/*TCON中断*/
void TCON_ISR(void)
{
	//这里TCON_INT_REG0需要写0清除中断标志-参考数据手册183页
	C_BIT(TCON_Base_Address+0x04,15);//清除TCON0消隐中断
	
	abi = 0;
}

void wait_abi(void)
{
	abi = 1;
	
	while(abi == 1)
	{
	}
}


static ret_t lcd_mem_swap(lcd_t* lcd) 
{
	lcd_mem_t* mem = (lcd_mem_t*)lcd;
	uint8_t* tmp_fb = mem->offline_fb;
	
	wait_abi(); /* 调用系统API加入垂直同步等待来保证画面没有撕裂 */
	/*
	* 调用系统API把 offline_fb 设置为系统 LCD 使用的显存地址,
	* 随后交换 offline_fb 和 online_fb 地址。
	*/
	f1c100s_debe_set_address(lcd_pdat, mem->offline_fb);

	lcd_mem_set_offline_fb(mem, mem->online_fb);
	lcd_mem_set_online_fb(mem, tmp_fb);
	
	return RET_OK;
}

lcd_t* platform_create_lcd(wh_t w, wh_t h) 
{
	/* 根据 LCD 类型调用对应 lcd_mem_t 构造函数创建 lcd_t 对象 */
	lcd_t* lcd = lcd_mem_bgr565_create_double_fb(w, h, LcdBuffer1, LcdBuffer2);
	lcd->swap = lcd_mem_swap; /* 重载 swap 函数 */

	return lcd;
}


没找到LVGL的,这个是AWTK双BUFFER的移植,你可以参考
回复

使用道具 举报

13

主题

45

回帖

84

积分

初级会员

积分
84
发表于 2023-2-21 13:43:40 | 显示全部楼层
西域海盗 发表于 2023-2-21 09:41
显示接口文件和GD_IPA驱动文件

你使用了完整的双BUFFER,在“disp_flush”里面不需要复制数据的。直接切换MCU显示区域的地址就可以。因为你复制了数据,所以速度变慢了
回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-2-22 08:33:23 | 显示全部楼层
a3748622 发表于 2023-2-21 13:43
你使用了完整的双BUFFER,在“disp_flush”里面不需要复制数据的。直接切换MCU显示区域的地址就可以。因 ...

lcd显存地址切换??
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2023-8-2 13:32:49 | 显示全部楼层
mark
学习记录
!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 11:50 , Processed in 0.228361 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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