因为有项目要用到屏幕,需要移植LVGL,现将移植过程总结如下:
移植前:驱动文件准备
1. 确保屏幕的驱动可用,需要先初始化,并且可以实现在屏幕上画点和矩形填充功能。初始化步骤:
1.1 先初始化通信协议,然后根据供应商提供的初始化配置初始化屏幕,然后验证配置
2.2 验证颜色,全0为黑,全1为白,再找中间色确认
2.3 验证XY轴,验证边界 ,然后验证居中,无误后方可移植
2.确保触摸驱动可用,并实现获取触摸的XY坐标的功能;
将驱动文件放在/driver/lcd文件夹里,在实现上面函数功能以后,再进行下一步
移植中:LVGL文件准备
1. 添加LVGL组件:在命令端输入:idf.py add-dependency "lvgl/lvgl^9.4.0" ,然后重新编译项目,此时会添加对应版本的LVGL组件,而且在整个移植过程中,LVGL组件里的文件保持不变;
2. 添加驱动移植对接文件:将LVGL组件 -> examples -> porting文件夹下的的移植示例文件复制到/driver/lcd文件夹下,并改名(将_templeate去掉即可):
lv_port_disp_template.h/.c : 显示驱动移植示例(必须) -> lv_port_disp.h/.c
lv_port_indev_template.h/.c:输入设备驱动移植示例(一般必须) -> lv_port_indev.h/.c
lv_port_fs_template.h/.c:文件系统移植示例(非必须) -> lv_port_fs.h/.c
3. 添加配置文件:如果使用菜单配置就无需单独添加配置文件。如果单独使用lv_conf.h配置文件,要先在命令端进入菜单idf.py menuconfig -> Componet config -> LVGL configuration -> 取消 Check this to not use custom lv_conf.h选项,保存后退出。然后将LVGL组件下lv_conf_template.h文件复制到/driver/lcd文件夹下,然后改名为lv_conf.h。
4. 添加引用路径:先在/driver/lcd里的CMakeList文件里添加lv_port_disp.c和lv_port_indev.c,然后在项目文件夹下的CmakeList.txt文件里添加lv_conf.h的文件路径,方便LVGL引用:include_directories(${CMAKE_CURRENT_LIST_DIR}/driver/lcd)
移植后:修改移植文件
1. lv_port_disp.c更改:
1.1 条件编译#if 0 改为 #if 1启用该文件,然后添加需要的头文件;
1.2 设置屏幕分辨率:MY_DISP_HOR_RES和MY_DISP_VER_RES;
1.3 配置显存缓冲区:在lv_port_disp_init()函数里,一种三种缓存模式,选择其中一种,然后屏蔽其它模式即可;
1.4 显示屏驱动初始化:在disp_init()函数里添加驱动的初始化函数;
1.5 配置刷屏回调函数:更新disp_flush()函数的刷屏方式。两种方式:打点方式或填充方式,打点方式比较慢,建议使用矩形填充方式,如果可以启动DMA更好
2. lv_port_disp.h更改:将条件编译#if 0 改为 #if 1启用该文件即可。
3. lv_port_indev.c更改:
3.1 条件编译#if 0 改为 #if 1启用该文件,然后添加需要的头文件;
3.2 根据所使用的输入设备类型,添加对应的驱动文件,包括init、read、is_pressed、get_xy等不同的函数。
3.3 注释掉没有用到的输入设备代码,否则可能会导致输入设备失效!!!
4. lv_port_indev.h更改:将条件编译#if 0 改为 #if 1启用该文件即可。
5. 配置LVGL时基,直接在自己文件里添加如下代码,
#include "esp_timer.h"
#include "lvgl.h"
static esp_timer_handle_t lvgl_tick_timer = NULL;
// 定时回调函数,每 1ms 触发
static void lv_tick_task(void *arg) {
lv_tick_inc(1);
}
// 初始化 LVGL Tick 定时器
void lvgl_tick_timer_init(void) {
const esp_timer_create_args_t timer_args = {
.callback = &lv_tick_task,
.arg = NULL,
.dispatch_method = ESP_TIMER_TASK,
.name = "lv_tick_timer"
};
esp_timer_create(&timer_args, &lvgl_tick_timer);
esp_timer_start_periodic(lvgl_tick_timer, 1000); // 1ms 触发
}
6. lv_conf.h更改:
6.1 条件编译#if 0 改为 #if 1启用该文件;
6.2 设置颜色格式:LV_COLOR_DEPTH和LV_COLOR_16_SWAP
7. 在主程序里调用所有初始化函数:
void app_main(void)
{
lvgl_tick_timer_init(); // 初始化 LVGL 时基
lv_init(); /* 初始化LVGL图形库 */
lv_port_disp_init(); /* lvgl显示接口初始化,放在lv_init()的后面 */
lv_port_indev_init(); /* lvgl输入接口初始化,放在lv_init()的后面 */
/*在屏幕中间创建一个120*50大小的按钮,测试用*/
lv_obj_t* switch_obj = lv_switch_create(lv_scr_act());
lv_obj_set_size(switch_obj, 120, 50);
lv_obj_align(switch_obj, LV_ALIGN_CENTER, 0, 0);
while (1)
{
lv_task_handler(); // LVGL 任务管理
vTaskDelay(pdMS_TO_TICKS(10)); // 延迟 10ms
}
}
3296

被折叠的 条评论
为什么被折叠?



