ESP32 移植LVGL

因为有项目要用到屏幕,需要移植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
    }
    
}

        

要在ESP32移植LVGL,可以使用LVGL官方提供的lv_port_esp32项目,这是一个已经移植好的ESP32项目,只需要将其完整克隆下来后进行编译和运行即可。在自己创建的项目中,只需要克隆component文件夹中的文件。lv_examples文件夹中的演示demo在实际项目中可以选择不克隆。而lvgl文件夹则是LVGL库的源代码,使用LVGL必须要克隆。lvgl_esp32_drivers文件夹是基于ESP32的屏幕驱动,其中包含了多种屏幕驱动,可以直接使用。移植LVGLESP32的具体步骤可以参考LVGL官方提供的文档和移植指南。同时,还可以使用esp32_arduino_Lvgl驱动移植文件,其中包含了lvgl驱动库、TFT屏幕驱动库以及移植好的esp32_arduino_Lvgl工程文件,可以方便地进行LVGLESP32上的移植。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ESP32移植LVGL](https://blog.youkuaiyun.com/qq619203312/article/details/116013886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [esp32Lvgl移植文件](https://download.youkuaiyun.com/download/mengquaner/85209702)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值