当前位置: 代码迷 >> 综合 >> 【LittleVGL】移植闪屏
  详细解决方案

【LittleVGL】移植闪屏

热度:67   发布时间:2023-10-21 01:42:59.0

移植LittleVGL-V7的过程中遇到一些问题,最严重的是闪屏,而且不是一般的闪屏,是点一下控件,界面变花、变黑,再点一下其他空白处才正常。

最后定位是缓存设置有问题。缓存是在外部sdram的,用的LPC54628官方探索板,有16M的内存,开始定义是:

    static lv_disp_buf_t disp_buf;memset((void *)DEMO_BUFFER0_ADDR, 0, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL);memset((void *)DEMO_BUFFER1_ADDR, 0, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL);lv_disp_buf_init(&disp_buf, DEMO_BUFFER0_ADDR, DEMO_BUFFER1_ADDR, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL);disp_drv.buffer = &disp_buf;

头文件:

#define LCD_WIDTH 480
#define LCD_HEIGHT 272
#define LCD_FB_BYTE_PER_PIXEL 2#define DEMO_BUFFER0_ADDR 0xa0000000
#define DEMO_BUFFER1_ADDR (DEMO_BUFFER0_ADDR + LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL)

但是,官方给出的例程里面并没有超越一帧需求 LCD_WIDTH * LCD_HEIGHT 这个大小的需求。

官方给出的三种形式如下:

    /* Example for 1) */static lv_disp_buf_t disp_buf_1;static lv_color_t buf1_1[LV_HOR_RES_MAX * 10];                      /*A buffer for 10 rows*/lv_disp_buf_init(&disp_buf_1, buf1_1, NULL, LV_HOR_RES_MAX * 10);   /*Initialize the display buffer*//* Example for 2) */static lv_disp_buf_t disp_buf_2;static lv_color_t buf2_1[LV_HOR_RES_MAX * 10];                        /*A buffer for 10 rows*/static lv_color_t buf2_2[LV_HOR_RES_MAX * 10];                        /*An other buffer for 10 rows*/lv_disp_buf_init(&disp_buf_2, buf2_1, buf2_2, LV_HOR_RES_MAX * 10);   /*Initialize the display buffer*//* Example for 3) */static lv_disp_buf_t disp_buf_3;static lv_color_t buf3_1[LV_HOR_RES_MAX * LV_VER_RES_MAX];            /*A screen sized buffer*/static lv_color_t buf3_2[LV_HOR_RES_MAX * LV_VER_RES_MAX];            /*An other screen sized buffer*/lv_disp_buf_init(&disp_buf_3, buf3_1, buf3_2, LV_HOR_RES_MAX * LV_VER_RES_MAX);   /*Initialize the display buffer*/

可见最大就是 LCD_WIDTH * LCD_HEIGHT 了。

但是问题来了,我设置

#define LCD_FB_BYTE_PER_PIXEL 1

的时候也不行,会出现重影,明显就是缓存不够。后来发现个问题,565组织形式是16位(即2字节)那memset必定要设置为LCD_WIDTH * LCD_HEIGHT * 2,但例程说第三章缓存开辟必须是长宽数量,不能带上颜色深度考虑:

lv_disp_buf_init(&disp_buf_3, buf3_1, buf3_2, LV_HOR_RES_MAX * LV_VER_RES_MAX);

那没办法,只能这样:

	static lv_disp_buf_t disp_buf;memset((void *)DEMO_BUFFER0_ADDR, 0, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL*2);memset((void *)DEMO_BUFFER1_ADDR, 0, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL*2);lv_disp_buf_init(&disp_buf, DEMO_BUFFER0_ADDR, DEMO_BUFFER1_ADDR, LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL);disp_drv.buffer = &disp_buf;

 然后,问题就解决了,perfect!

按照这个逻辑565的RGB屏幕,16M内存能驱动最低标准的4K(3820*1080)啊!甚至888的RGB屏幕,16M内存也能完美驱动所有2K标准,包括最大的2048 × 1080