VScode ESPIDF框架下LVGL移植教程

文章内容简介:

        本文针对ESPIDF环境,讲解如何使用ESPIDF的component manager下载最新LVGL源码适配自己的开发板。

        做这个之前我见了网上不少LVGL移植方法:
        1、自己从GitHub下载LVGL源码放入工程components路径。
        2、通过ESPIDF的component manager下载LVGL以及esp_lvgl_port或者lvgl_helper等工具。

但我考虑第二种方式受限制较多,LVGL版本同步慢,且尝试第一种方法出现编译问题等。所以在此推荐一种新方法,使用component manager下载LVGL源码,保持代码最新。

        下面讲述移植过程。

一、打开自己的工程,或者找一个样板工程。

我这里使用了官方的hello world工程,提前写好了LCD和触摸的驱动放在了components路径下

二、CTRL+shift+P找到ESP-IDF:欢迎

 三、打开Component manager

 四、搜索或者首页已经出现lvgl选项,点击install即可。

        这里注意,必须先有第一步才可以。

 

 安装完成后左侧工程目录增加idf_component.yml文件,描述了工程的依赖。

 这时候点击编译,IDF会把LVGL拷贝到managed_components路径下。注意。这个路径是不可以随意更改的,IDF编译时会检索路径下文件的哈希值,校验不对不会编译。

五、移植显示和触摸驱动

我们在这种情况下对LVGL的移植不能使用平时的方式比如拷贝lv_conf_template.h改名等等。

为了给lvgl配置显示和输入设备驱动,我们要打开你的工程目录下\managed_components\lvgl__lvgl\examples\porting文件夹。复制

lv_port_disp_template.c
lv_port_disp_template.h
lv_port_indev_template.c
lv_port_indev_template.h

到components路径下新建一个文件夹,我这里使用LVGL。在这里就可以修改文件名了。

六、修改components下的CMakeList.txt

 这里需要根据自己的文件夹来填写,我的路径对于的CMakeList.txt如下

 像这样把文件夹路径写进去就行了。

七、修改lv_port_xxxxx.c.h文件。

修改刚刚复制过来的.c.h文件与自己的硬件进行适配。

以lv_port_indev.h为例,这里默认的#include "lvgl.h"会报错。我们需要修改成

#include "../../managed_components/lvgl__lvgl/lvgl.h"

 同理,在其他文件,比如main.c或者自己的功能实现文件里要使用lvgl时,都需要使用这样的路径进行包含。


/**
 * @file lv_port_indev_templ.h
 *
 */

/*Copy this file as "lv_port_indev.h" and set this value to "1" to enable content*/
#if 1

#ifndef LV_PORT_INDEV_TEMPL_H
#define LV_PORT_INDEV_TEMPL_H

#ifdef __cplusplus
extern "C"
{
#endif
#define LV_LVGL_H_INCLUDE_SIMPLE
/*********************
 *      INCLUDES
 *********************/
#include "../../managed_components/lvgl__lvgl/lvgl.h"

    /*********************
     *      DEFINES
     *********************/

    /**********************
     *      TYPEDEFS
     **********************/

    /**********************
     * GLOBAL PROTOTYPES
     **********************/
    void lv_port_indev_init(void);

八、为LVGL创建定时器和基本演示

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "nvs_flash.h"
#include "esp_system.h"
#include "IIC.h"
#include "lcd.h"
#include "cst328.h"
#include "spi.h"
#include "esptim.h"
#include "../managed_components/lvgl__lvgl/lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"


TaskHandle_t LV_DEMOTask_Handler; /* 任务句柄 */


void lvgl_demo(void)
{
    // 创建一些内容
    lv_obj_t *label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello world!");
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
    printf("label created\n");

    // 创建一个进度条
    lv_obj_t *bar = lv_bar_create(lv_scr_act());
    lv_obj_set_size(bar, 200, 20);
    lv_obj_align(bar, LV_ALIGN_CENTER, 0, 50);
    lv_bar_set_range(bar, 0, 100);
    lv_bar_set_value(bar, 50, LV_ANIM_ON);
}



void app_main(void)
{
    esp_err_t ret;
    ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }

    esptim_int_init(1000);
    lv_init();
    lv_port_disp_init();
    lv_port_indev_init();

    lvgl_demo();

    while (1)
    {
        lv_timer_handler();
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}


void esptim_callback(void *arg); 

void esptim_int_init(uint64_t tps)
{
    esp_timer_handle_t esp_tim_handle; /* 定时器回调函数句柄 */

    /* 定义一个定时器结构体 */
    esp_timer_create_args_t tim_periodic_arg = {
        .callback = &esptim_callback, /* 设置回调函数 */
        .arg = NULL,                  /* 不携带参数 */
    };

    esp_timer_create(&tim_periodic_arg, &esp_tim_handle); /* 创建一个事件 */
    esp_timer_start_periodic(esp_tim_handle, tps);        /* 每周期内触发一次 */
}

void esptim_callback(void *arg)
{
    lv_tick_inc(1);
    // printf("esptim_callback\n");
}

到此,IDF框架下的LVGL移植和测试就已经完成了,各位有其他问题可以留言。

 

我才不要做一只白嫖怪~~争取输出写有用的东西给社区。

 

### 将LVGL图形库移植ESP-IDF框架中的方法 #### 1. 准备工作 为了成功将LVGL集成至ESP-IDF项目中,需先完成环境配置并获取必要的资源文件。通过命令 `cp -r ~/esp442/esp-idf/examples/get-started/sample_project/ ./esp32_lvgl833` 复制基础工程模板[^1]。 随后下载适用于目标版本的LVGL源码包,并将其解压至指定路径 `/components/lvgl/` 下。此操作可确保所有依赖项被正确加载于构建过程中[^3]。 #### 2. 修改配置文件 进入组件目录后编辑头文件 `lv_conf_internal.h` 来适配硬件特性与显示需求。例如设置屏幕分辨率、颜色深度以及触控支持等功能参数: ```c #define LV_COLOR_DEPTH 16 /* Color depth of the display */ #define USE_LV_GPU 1 /* Enable GPU acceleration if supported by hardware */ ``` 上述定义应依据实际开发板规格调整以获得最佳性能表现。 #### 3. 创建自定义初始化函数 在主应用程序入口处加入如下代码片段用于启动图形界面服务: ```c #include "lvgl/lvgl.h" void initialize_display(void){ // Initialize your display driver here... } static void lv_tick_task(void *arg) { lv_tick_inc(1); /* Inform LVGL about system ticks */ } void app_main(){ initialize_display(); /* Setup physical screen connection */ lv_init(); /* Start up Littlev Graphics Library core engine */ xTaskCreate(lv_task_handler, "lv_task", 4096, NULL, 5, NULL); xTimerHandle tick_timer = xTimerCreate("tick", pdMS_TO_TICKS(1), pdTRUE, NULL, lv_tick_task); xTimerStart(tick_timer, portMAX_DELAY); } ``` 以上实现包含了定时器回调机制来维持动画流畅度及交互响应速度[^2]。 #### 4. 测试运行效果 编译链接完成后上传固件至设备,在线调试工具如Wokwi可用于模拟验证最终成果是否满足预期设计标准。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Distance_90

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值