ESP-IDF 环境搭建

目前提供的是两个IDF环境,也都能实现编译,这次主要是想重新弄TLT液晶屏下的LVGL,所以从头再弄一次!期间也有挺多问题需要解决,不过Ubuntu环境做的次数相对多一些,所以弄起来顺手点,不过最后发现VSCODE环境更加无脑安装更加方便,就是编译的速度慢了好多,最终还是选择使用Ubuntu

Ubuntu环境搭建

这个参考 ESP32开发SDK-IDF环境搭建(Ubuntu) 即可
基本上能安装并运行demo

Windows 环境下通过 VSCODE 搭建

之前没有尝试过,这次感觉使用Ubuntu麻烦,就想着直接使用一个Windows环境看看,这样查代码什么的也方便!

使用SPI总线驱动LCD(st7789驱动)

参考文章 ESP32使用SPI总线驱动LCD

移植LVGL

手上的TFT液晶屏是 ST7789 的屏幕,但是默认demo是 ILI9341 这款,虽然跑的时钟 demo 没问题,但是使用 GUI-Guider 生成的UI导入后颜色不对,仔细看才发现使用颜色深度不同,demo驱动使用的8bit,而GUI-Guider只有16或者32,所以就不合适,最后找到了lvgl_esp32_drivers 组件并且修改后才能适配使用,很多地方报错,就拿文件中找不到 drive 目录下gpio.h报错问题来说,其实就是因为 ESP-IDF 从4升级到5后需要在cmake中声明才能使用,不能隐式使用,也算是一种改变,所以还是需要多看官方文档才行!迁移构建系统至 ESP-IDF v5.0

ESP32S3移植GUI-Guider下的LVGL(v8.3)

GUI-Guider安装网上很多,之前自己也记录过文章 LVGL模拟器NXP GUI Guider使用

一、新建工程

复制 ESP-IDF 下example/get-started/sample_project 示例作为基础工程模板,将其拷贝到work目录下并改名为lvgl_base

二、移植LVGL

  1. 引入LVGL库

1.1 创建组件文件夹

1
2
3
mkdir components

cd components

1.2. 引入LVGL相关库

1
2
3
4
//这里引入的是release/v8.3版本的库,也可以选择其它版本
git submodule add -b release/v8.3 https://github.com/lvgl/lvgl.git lvgl
//引入esp32工程库,这个库实现了对lcd显示设备的注册,当然也可以使用自己的方式实现
git submodule add https://github.com/lvgl/lvgl_esp32_drivers.git lvgl_esp32_drivers

如果在引入库时报下面的问题,则只需要在工程中初始化git 仓库即可

1
2
3
cd lvgl_base

git init

1.3. 查看工程结构

  1. 编译工程

2.1 配置LCD

1
2
3
idf.py set-target esp32s3

idf.py menuconfig

1)设置控制器类型为ST7789
2)根据屏幕特性选择反色(一些屏幕不需要)
2)配置LCD引脚
3)配置背光引脚及电平

2.2 配置LVGL

1)根据屏幕特性选择交换颜色字节(一些屏幕不需要)
2)使能一些demo用到的字体
3)使能music demo

  1. 主函数代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include "esp_log.h"
#include "esp_system.h"
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "lvgl.h"
#include "lvgl_helpers.h"

#include "demos/lv_demos.h"


#define TAG "main"


void lv_tick_task(void *arg)
{
lv_tick_inc(1);
}

void app_main(void)
{

/* Initialize SPI or I2C bus used by the drivers */
lvgl_driver_init();

lv_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.hor_res = LV_HOR_RES_MAX;
disp_drv.ver_res = LV_VER_RES_MAX;
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, 1 * 1000));

// lvgl demo演示
lv_demo_music();
// lv_demo_stress();

while (1)
{
/* Delay 1 tick (assumes FreeRTOS tick is 10ms */
vTaskDelay(pdMS_TO_TICKS(10));
lv_task_handler();
}


}

三、报错修改

1.error: ‘LV_HOR_RES_MAX’ undeclared

解决方式:在lvgl_helpers.h 中增加如下代码

1
2
3
#define LV_HOR_RES_MAX 320
#define LV_VER_RES_MAX 240
//#define SPI_HOST_MAX 3 在最新的IDF驱动中已经有这个了,加这个会报错误重复

2.E (384) spi: spi_bus_initialize(762): invalid dma channel, chip only support spi dma channel auto-alloc

解决方式:在lvgl_helpers.c 中增加如下代码

在这次实验中并没有报这个错误,所以不需要改 IDF-5.2

3. 找不到 driver 文件下的 gpio.h 和 ledc.h

解决办法:修改使用cmake文件,让组件能找到位置

根据 迁移构建系统至 ESP-IDF v5.0 说明迁移后需要在cmake明确指定组件依赖

idf_component_register 新增加 REQUIRES driver 即可

2_light_drivers esp-idf5.x报错 Failed to resolve component ‘esp_adc_cal‘

4. 报了 gpio等其他

本次就直接把错误的部分代码屏蔽掉即可

例如 st7789.c 文件中的 gpio_pad_select_gpio(ST7789_DC); 就报错了,直接屏蔽后使用也正常

总结

在驱动LCD屏幕方面,lvgl_esp32_drivers 库目前只支持了spi以及I2C的方式,对于8080接口是没有支持的,这时候可以使用esp-who 的screen 组件来实现驱屏。


相关链接(侵删)

  1. ESP32系列之LVGL(二):ESP32S3移植LVGL(v8.3)

  2. LVGL库

  3. ESP-WHO库

  4. ESP32 ESP-IDF LVGL8.3.3移植

  5. 迁移构建系统至 ESP-IDF v5.0

  6. 在esp32上使用tftLCD屏幕(st7789驱动)


=================我是分割线=================

欢迎到公众号来唠嗑: