移植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