系列文章目录
ESP32系列之LVGL(一):ESP32S3+ST7789点屏
文章目录
目录
前言
第一次使用lvgl做ui,屏幕类的外设之前也鲜有使用,所以也讲不出个一二三四的原理来,只是站在前辈们的肩膀上摸索一下。本系列文章基于ESP32系列ESP-IDF框架下对lcd屏和lvgl的使用,仅用于笔者使用过程记录和参考,如果在使用过程中遇到了一些问题也会提出来希望各路大神不吝赐教。
一、新建工程
这里使用ESP-IDF(v4.4)下example/get-started/sample_project 示例作为基础工程模板,将其拷贝到work目录下并改名为lvgl_base
二、移植LVGL
1.引入LVGL库
1.创建组件文件夹
mkdir components
cd components
2.引入库
//这里引入的是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 仓库即可
cd lvgl_base
git init
3.查看工程结构
2.编译工程
1.配置LCD
idf.py set-target esp32s3
idf.py menuconfig
1)设置控制器类型为ST7789
2)根据屏幕特性选择反色(一些屏幕不需要)
2)配置LCD引脚
3)配置背光引脚及电平
2.配置LVGL
1)根据屏幕特性选择交换颜色字节(一些屏幕不需要)
2)使能一些demo用到的字体
3)使能music demo
3. 主函数代码
#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();
}
}
3.报错修改
1.error: 'LV_HOR_RES_MAX' undeclared
解决方式:在lvgl_helpers.h 中增加如下代码
#define LV_HOR_RES_MAX 320
#define LV_VER_RES_MAX 240
#define SPI_HOST_MAX 3
2.E (384) spi: spi_bus_initialize(762): invalid dma channel, chip only support spi dma channel auto-alloc
解决方式:在lvgl_helpers.c 中增加如下代码
三、演示效果
四、其它
在驱动LCD屏幕方面,lvgl_esp32_drivers 库目前只支持了spi以及I2C的方式,对于8080接口是没有支持的,这时候可以使用esp-who 的screen 组件来实现驱屏。
总结
本章主要讲述了在点亮屏幕的基础上进行lvgl库的移植及demo演示。
参考
ESP-WHO库:
参考博客:
ESP32 ESP-IDF LVGL8.3.3移植_晨之清风的博客-CSDN博客https://blog.csdn.net/chentuo2000/article/details/128269394