ESP32移植LVGL教程
- 效果图
- 下载lvgl
- 移植相关文件
- 更改相关配置文件
- lv_config.h
- main/CMakeLists.txt
- main.c
- 其它代码
- Src/bsp_lcd.c
- Include/bsp_lcd.h
- 工程文件下载
软件版本:
- lvgl -> 9.3.0
- idf -> 4.4.0
硬件需求:
- ESP32S3
- 一块调试好能够显示的屏幕,这里我使用的是ST7789 驱动的240×320TFT屏幕
效果图
下载lvgl
先下载lvgl点击这里,
下载完成之后,进行解压即可
移植相关文件
先在自己的项目目录下新建一个lvgl文件夹,做完之后看我的项目文件路径看是否正确:
->My_LVGL_Demo->main->Include #存放自己写的头文件->Src #存放自己写的源文件->lvgl #存放lvgl相关文件->main.c->CMakeLists.txt->CMakeLists.txt
然后就可以开始移植lvgl了,先看看解压之后我们需要什么文件,如下图所示。
文件夹的画只需要src文件夹,将它复制到项目中创建的lvgl目录下。
然后移植相关文件。如下图所示。
将lvgl.h
和lv_version.h
移植到lvgl目录下,然后将lv_conf_template.h
先改名为lv_conf.h
再移植到main目录下,即与lvgl目录同级下。
移植完成后的目录如下所示:
->My_LVGL_Demo->main->Include #存放自己写的头文件->Src #存放自己写的源文件->lvgl #存放lvgl相关文件->src->lv_version.h->lvgl.h->main.c->lv_conf.h->CMakeLists.txt->CMakeLists.txt
这样,lvgl的文件就相当于移植成功了。
更改相关配置文件
lv_config.h
首先是第15行的#if 0
要改成#if 1
然后就是第30行的#define LV_COLOR_DEPTH 16
要改成自己屏幕的颜色格式,这里我用是RGB565,所有就是16
如果你只需要这些基本改完,这里例如我自己增加了一种字体大小,就改了如下所示的地方,默认是只有14号字体大小,这里增加了30号字体。
还有一些其它的配置,可以去看官方文档点击这里。
main/CMakeLists.txt
main/CMakeLists.txt肯定是要改的,我们需要把lvgl需要的头文件和源文件增加进去,注意是main下面的CMakeLists.txt。
file(GLOB_RECURSE COMPONENT_SOURCES "Src/*.c")
file(GLOB_RECURSE LVGL_COMPONENT_SOURCES "lvgl/src/*.c")idf_component_register(SRCS ${COMPONENT_SOURCES}${LVGL_COMPONENT_SOURCES}"main.c"INCLUDE_DIRS ".""lvgl/""lvgl/src/""lvgl/src/core/""lvgl/src/display/""lvgl/src/draw/""lvgl/src/drivers/""lvgl/src/font/""lvgl/src/indev/""lvgl/src/layouts/""lvgl/src/libs/""lvgl/src/misc/""lvgl/src/osal/""lvgl/src/others/""lvgl/src/stdlib/""lvgl/src/themes/""lvgl/src/tick/""lvgl/src/widgets/""Include/"REQUIRES driver freertos)
main.c
最后就是main.c文件了
#include <stdio.h>
#include "bsp_lcd.h"
#include "lvgl/lvgl.h"
#include "lvgl/lv_version.h"
#include "esp_timer.h"spi_device_handle_t my_spi = NULL;
#define BYTES_PER_PIXEL (LV_COLOR_FORMAT_GET_SIZE(LV_COLOR_FORMAT_RGB565))
static uint8_t buf1[1024];uint32_t my_tick_get_cb(void)
{register uint32_t ms_result;ms_result = (uint32_t)esp_timer_get_time();return ms_result;
}void my_flush_cb(lv_display_t * display, const lv_area_t * area, uint8_t * px_map)
{lcd_full_area(my_spi, area, px_map);lv_display_flush_ready(display);
}void app_main(void)
{printf("LVGL Version: lvgl(%d.%d.%d)\n", LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR, LVGL_VERSION_PATCH);lv_init();my_spi = spi_init();lcd_init(my_spi);lv_tick_set_cb(my_tick_get_cb);lv_display_t * display1 = lv_display_create(LCD_W, LCD_H);lv_display_set_buffers(display1, buf1, NULL, sizeof(buf1), LV_DISPLAY_RENDER_MODE_PARTIAL);lv_display_set_flush_cb(display1, my_flush_cb);// 设置屏幕背景颜色为黑色lv_obj_set_style_bg_color(lv_scr_act(), lv_color_black(), LV_PART_MAIN);// 创建一个标签,设置父对象为屏幕,文本为"hello lvgl"lv_obj_t * label = lv_label_create(lv_scr_act());lv_label_set_text(label, "hello lvgl");// 设置标签的样式static lv_style_t style;lv_style_init(&style);lv_style_set_bg_color(&style, lv_color_black()); // 设置背景颜色为黑色lv_style_set_text_color(&style, lv_color_white()); // 设置文本颜色为白色lv_style_set_text_font(&style, &lv_font_montserrat_30); // 设置字体大小lv_obj_add_style(label, &style, 0); // 应用样式到标签// 设置标签对齐为中心lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);// 主循环需要运行 LVGL 的事件处理while (1){lv_timer_handler_run_in_period(5);// printf("hello world!!!\r\n");}
}
值得注意一下的是#define BYTES_PER_PIXEL (LV_COLOR_FORMAT_GET_SIZE(LV_COLOR_FORMAT_RGB565))
这里要换成自己的颜色深度。
void my_flush_cb(lv_display_t * display, const lv_area_t * area, uint8_t * px_map)
{lcd_full_area(my_spi, area, px_map);