①如何创造一个屏幕并显示
在hal_init()函数中写入一下代码
/*Create a display buffer*/
static lv_disp_draw_buf_t disp_buf1;
static lv_color_t buf1_1[MONITOR_HOR_RES * 100];
static lv_color_t buf1_2[MONITOR_HOR_RES * 100];
lv_disp_draw_buf_init(&disp_buf1, buf1_1, buf1_2, MONITOR_HOR_RES * 100);
/*Create a display*/
static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
disp_drv.draw_buf = &disp_buf1;
disp_drv.flush_cb = monitor_flush;
disp_drv.hor_res = MONITOR_HOR_RES;
disp_drv.ver_res = MONITOR_VER_RES;
disp_drv.antialiasing = 1;
lv_disp_t * disp = lv_disp_drv_register(&disp_drv);
②lvgl显存方式分为3种
单buffer
画面会被拆分成buffer的size大小,分块刷新,当只有局部刷新时,比如说点击了一个按钮按钮变高亮,那么他就只会刷局部画面。
官方推荐大小 1/10 screen size,拆分太小,刷屏接口又慢的话,不仅帧率低,还会有感人的拉窗帘。
static lv_disp_buf_t disp_buf;
static lv_color_t buf[LV_HOR_RES_MAX * LV_VER_RES_MAX / 10]; /*Declare a buffer for 1/10 screen size*/
lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * LV_VER_RES_MAX / 10); /*Initialize the display buffer*/
非全尺寸双buffer
顾名思义,两个buffer,实际上就是PING-PONG模式,这种情况适合有dma或者其他显存加速设备的芯片,在一块buffer使用dma等外设后台刷屏时,lvgl可以再前台渲染显示进另一块显存,也就是说渲染和刷屏并发执行,理论是比单显存要好的,不过跟硬件和屏幕大小有关。
static lv_disp_buf_t draw_buf_dsc_2; //两个半屏缓存
static lv_color_t draw_buf_2_1[LV_HOR_RES_MAX * LV_VER_RES_MAX/2]; /*A buffer for 10 rows*/
static lv_color_t draw_buf_2_2[LV_HOR_RES_MAX * LV_VER_RES_MAX/2]; /*An other buffer for 10 rows*/
lv_disp_buf_init(&draw_buf_dsc_2,draw_buf_2_2, draw_buf_2_1, LV_HOR_RES_MAX *LV_VER_RES_MAX/2); /*Initialize the display buffer*/
全尺寸双buffer
两个全尺寸buffer,虽然直觉看上去和非全尺寸双buffer应该区别不大,但实际上,这个是专门为带TFT驱动的MCU准备的。双全尺寸与前两种不同,在任何时候,给出的buffer都是全屏大小的buffer,而不是局部刷新只提供刷新部分的buffer窗口,这么做的的好处是刷屏,只需要更改TFT驱动的显存地址,而不需要将LVGL的buffer再搬运到TFT驱动的显存,就可完成刷屏动作。
F429带LTDC,也就是TFT驱动,理论上应当使用该类型。
不过实测帧没有提升反而大幅下降。。。。有点奇怪。
刷屏修改LTDC的显存地址, 当LTDC刷到最后一行,中断回调提示LVGL屏幕刷完。代码如下
static lv_disp_buf_t draw_buf_dsc_2; //两个全屏缓存
static lv_color_t draw_buf_2_1[LV_HOR_RES_MAX * LV_VER_RES_MAX]; /*A buffer for 10 rows*/
static lv_color_t draw_buf_2_2[LV_HOR_RES_MAX * LV_VER_RES_MAX]; /*An other buffer for 10 rows*/
lv_disp_buf_init(&draw_buf_dsc_2,draw_buf_2_2, draw_buf_2_1, LV_HOR_RES_MAX *LV_VER_RES_MAX); /*Initialize the display buffer*/