一、必须要调用的函数
1、lv_init():LVGL的初始化入口,负责每部数据结构、内存分配和默认的初始化。必须在其他LVGL函数调用前执行。
2、lv_tick_inc(x):提供时间基准,需要在定时器中断中每隔x毫秒(通常1≤x≤10)调用一次,此函数维护LVGL内部动画、事件处理时的时序逻辑。
3、lv_timer_handler():主循环中周期性调用(推荐5~10ms),负责处理渲染、事件分发和定时任务。未调用此函数会导致页面冻结。
4、lv_disp_drv_init(&disp_drv)显示驱动注册函数:需要实现dis_flush_cb回调,将LVGL渲染的像素数据发送到屏幕。未正确注册显示驱动会导致黑屏
static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.flush_cb = my_flush_cb; // 必须实现的刷新函数
lv_disp_drv_register(&disp_drv);
二、必须修改的宏定义
-
关键宏:lv_conf.h
的启用与配置
将lv_conf_template.h
重命名为lv_conf.h
,并将#if 0
改为#if 1
启用文件LV_COLOR_DEPTH
:颜色深度(16 或 32),需与屏幕硬件匹配。LV_MEM_SIZE
:动态内存池大小(至少 16KB,复杂界面需 48KB)。LV_HOR_RES_MAX
和LV_VER_RES_MAX
:屏幕分辨率定义。
-
显示缓冲区配置
在lv_port_disp.c
中定义缓冲区大小和模式(单缓冲/双缓冲)#define MY_DISP_HOR_RES 320 // 水平分辨率 #define MY_DISP_VER_RES 240 // 垂直分辨率 static lv_color_t buf1[MY_DISP_HOR_RES * 10]; // 行缓冲
三、底层逻辑解析
-
事件循环机制
关键数据结构:
LVGL 通过lv_timer_handler()
遍历定时器链表(_lv_timer_ll
),处理渲染、输入事件和用户注册的定时任务。typedef struct _lv_timer_t { uint32_t period; // 执行周期 lv_timer_cb_t timer_cb; // 回调函数 void *user_data; // 用户数据 } lv_timer_t;
-
脏矩形渲染优化
流程:
LVGL 通过lv_refr
模块计算脏矩形区域,仅刷新变化部分,减少数据传输量。- 标记脏区域 → 合并重叠区域 → 调用
disp_flush_cb
局部刷新。
- 标记脏区域 → 合并重叠区域 → 调用