ESP32在ESP-IDF框架下使用LVGL(v8.3)

开发环境

VSCode+ESP-IDF插件
说明:IDF版本为4.4.4,最新版的5.0.1弃用了些东西,而lvgl_esp32_drivers对5以上的版本未适配,所以不建议使用5以上的版本
安装:安装教程,建议整体看完在进行安装,以免安装失败,教程安装的是5.0.1,需要改为4.4.4
Arduino移植教程:点击此处

加载库

lvgl:github下载地址,选择8.3版本
lvgl_esp32_driver:gihub下载地址
说明:将两个压缩包解压,将lvgl-release-v8.3重命名为lvgl,lvgl_esp32_drivers_master重命名为lvgl_esp32_drivers,新建ESP-IDF项目,在根目录下创建components文件夹,并将上面两个文件夹放入components文件夹中。
操作:clean一下项目,重新build一下项目,此时界面下方导航栏齿轮按钮(SDK Configuration editor)中会生成lvgl和驱动相关的配置。首次编译会出现如下错误:

错误一:
lvgl_helpers.h:58:25: error: 'LV_HOR_RES_MAX' undeclared (first use in this 
function); did you mean 'LV_HOR_RES'?
解决方法:
ctrl+鼠标左键,选中上述错误语句,找到错误文件lvgl_helpers.h;在给文件的第25行插入下面两个定义,需要根据自己的屏幕尺寸修改。
#define LV_HOR_RES_MAX 240
#define LV_VER_RES_MAX 320

错误二:
lvgl_helpers.c:159:9: error: 'SPI_HOST_MAX' undeclared (first use in this function); did you mean 'GPIO_PORT_MAX'?
解决方法:
还是上面的文件中,添加如下定义
#define SPI_HOST_MAX 3

lvgl_esp32_drivers配置

屏幕:st7789 240*320 2.8寸屏幕,屏幕接线方式如下。

ESP32引脚屏幕引脚
13MOSI
14SCK
15CS
2DC
EN 或 RSTRST
未接MISO
VCCBL/LED(背光)

点解VSCode界面下方导航栏齿轮按钮,抖索 Display Pin Assigments 配置如下:

在这里插入图片描述

测试

下面的程序,根据lvgl_port_esp32主程序修改而来。
打开齿轮按钮,使能一个lvgl示例,如下使能Benchmark your system,并将下面代码直接覆盖原来的主程序。如果你想测试其它示例,可以在下面中文注释下面,调用ui部分的逻辑代码即可。
在这里插入图片描述

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_freertos_hooks.h"
#include "freertos/semphr.h"
#include "esp_system.h"
#include "driver/gpio.h"
#include "lvgl/lvgl.h"
#include "lvgl_helpers.h"
#include <lv_demos.h>
/*********************
 *      DEFINES
 *********************/
#define TAG "demo"
#define LV_TICK_PERIOD_MS 1

/**********************
 *  STATIC PROTOTYPES
 **********************/
static void lv_tick_task(void *arg);
static void guiTask(void *pvParameter);
static void create_demo_application(void);

/**********************
 *   APPLICATION MAIN
 **********************/
void app_main() {

    
    xTaskCreatePinnedToCore(guiTask, "gui", 4096*2, NULL, 0, NULL, 1);
}

SemaphoreHandle_t xGuiSemaphore;

static void guiTask(void *pvParameter) {

    (void) pvParameter;
    xGuiSemaphore = xSemaphoreCreateMutex();
    lv_init();
    lvgl_driver_init();
    lv_color_t* buf1 = heap_caps_malloc(DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA);
    assert(buf1 != NULL);
    static lv_color_t *buf2 = NULL;
    static lv_disp_draw_buf_t disp_buf;
    uint32_t size_in_px = DISP_BUF_SIZE;
    lv_disp_draw_buf_init(&disp_buf, buf1, buf2, size_in_px);
    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.flush_cb = disp_driver_flush;
    disp_drv.draw_buf = &disp_buf;
    lv_disp_drv_register(&disp_drv);
    const esp_timer_create_args_t periodic_timer_args = {
        .callback = &lv_tick_task,
        .name = "periodic_gui"
    };
    esp_timer_handle_t periodic_timer;
    ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
    ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000));
    /* 在这里更换自己的UI */
    lv_demo_benchmark();
    while (1) {
        /* Delay 1 tick (assumes FreeRTOS tick is 10ms */
        vTaskDelay(pdMS_TO_TICKS(10));

        /* Try to take the semaphore, call lvgl related function on success */
        if (pdTRUE == xSemaphoreTake(xGuiSemaphore, portMAX_DELAY)) {
            lv_task_handler();
            xSemaphoreGive(xGuiSemaphore);
       }
    }
    /* A task should NEVER return */
    free(buf1);
    vTaskDelete(NULL);
}

static void lv_tick_task(void *arg) {
    (void) arg;
    lv_tick_inc(LV_TICK_PERIOD_MS);
}

上面程序是在lvgl_port_esp32的主程序修改而来,源程序直接运行会报下图中的错误,需要将lv_disp_buf_t修改为lv_disp_draw_buf_t,lv_disp_buf_init修改为lv_disp_draw_buf_init,将 disp_drv.buffer修改为disp_drv.draw_buf。除此以外,删除了一些没用的#if、#endif等内容,让程序看起来比较简洁。
在这里插入图片描述

虽然编译通过了,但对于合宙的esp32s3来说还是没有画面显示。需要将lvgl_helpers.c的第180行,修改成如下代码,如果是其它芯片比如ESP32S2等,也要做相应的修改,网上有相关的教程。

 #if defined (CONFIG_IDF_TARGET_ESP32C3)|| defined (CONFIG_IDF_TARGET_ESP32S3)
    dma_channel = SPI_DMA_CH_AUTO;
 #endif

编写自己的UI界面

使用软件SquareLine Studio,版本1.2.2,该版本支持LVGL 8.2.0、8.3.3、8.3.4
1、设置屏幕尺寸,具体参数如下,注意红框内的内容。
在这里插入图片描述
2、随便拖拽两个控件。选择Export->Export UI Files,会导出.c和.h文件。
3、在VScode中使用ctrl+shift+p,选择ESP-IDF:创建新的ESP-IDF组件,输入组件文件夹的名字(例如:my_ui)
.h头文件放在include文件夹中,将其它.c文件放在include文件夹之外。
4、将下面CMakeList.txt文件中的内容覆盖原来生成的CMakeList.txt文件。可复制下面的c程序中的内容。否则,ui界面相关的程序不会得到编译。
在这里插入图片描述
5、在main.c文件中#include<ui.h>,在上面完整代码中文注释下面一行调用ui_init()函数。
6、将SDK Configuration editor的下面选项选中。
在这里插入图片描述
7、编译、下载。
8、设计图、与运行结果如下所示。

file(GLOB_RECURSE SOURCES 	./*.c )
idf_component_register(SRCS ${SOURCES}
                    INCLUDE_DIRS "include"
                    REQUIRES lvgl)

在这里插入图片描述

在这里插入图片描述

  • 9
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要下载ESP32 LVGL 8.2,首先需要进入官方网站(www.lvgl.io)并找到ESP32 LVGL库的下载页面。然后,可以在该页面上找到与ESP32兼容的LVGL版本。确保选择8.2版本。 一旦找到正确的版本,就可以下载ESP32 LVGL 8.2库的ZIP文件。点击下载按钮后,文件将被保存到计算机本地的指定位置。 下载完成后,解压缩ZIP文件,并将解压缩后的文件夹重命名为“ESP32 LVGL 8.2”或其他有意义的名称。 现在,打开Arduino IDE(如果尚未安装,请先安装)。在Arduino IDE中,打开“文件”菜单,然后选择“首选项”。在首选项对话框中,复制并粘贴以下链接到“附加开发板管理器网址”中: https://dl.espressif.com/dl/package_esp32_index.json 保存设置并关闭对话框。接下来,打开“工具”菜单,然后选择“开发板”下的“开发板管理器”选项。 在开发板管理器中,使用搜索栏查找并安装“esp32”开发板支持。找到“esp32 by Espressif Systems”并点击“安装”按钮。 安装完成后,选择“工具”菜单下的“开发板”选项,在开发板列表中找到“ESP32 Dev Module”并选择。 现在,打开“文件”菜单,然后选择“示例”,在下拉菜单中找到“ESP32 LVGL 8.2”文件夹。可以在这个文件夹中找到不同的示例。 选择要运行的示例,并点击“上传”按钮。此时,编译和上传过程将开始。 如果一切正常,示例将成功上传到ESP32开发板上,并且在串行监视器中可以看到示例运行的输出。 这样,我们就完成了ESP32 LVGL 8.2的下载和运行。现在可以开始使用这个强大的图形库来开发各种精美的用户界面了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小魏先森

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

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

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

打赏作者

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

抵扣说明:

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

余额充值