Esp32s3(立创实战派)移植LVGL
移植:
使用软件EEZ studio
创建工程选择带EEZ Flow的,可以使用该软件更便捷的功能
根据屏幕像素调整画布为320*240
复制ui文件至工程
将生成的ui文件夹复制到main文件夹同级目录(ui文件夹在工程文件src中)
工程结构:
修改声明头文件路径
首先将ui文件夹中的所有声明头文件由:
改成
因为组件的路径已经声明,lvgl作为组件添加进工程,所以在目录中可以直接索引。
main.c文件
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "driver/gpio.h"
#include "freertos/task.h"#include "IOadd_PCA9557.h"// IO扩展芯片
#include "BSP_IIC.h"
#include "LCD.h"
#include "esp_log.h"#include "lvgl_lcd_port.h" // 自己编写的lvgl液晶屏接口#include "ui.h"//EEZ生成的UI文件void app_main(void)
{i2c_master_init(); // I2C初始化pca9557_init(); // IO扩展芯片初始化bsp_lvgl_start(); // 初始化液晶屏lvgl接口(初始化lcd+touch,添加lvgl接口)//锁定LVGL接口以防止在UI初始化过程中发生并发访问。//初始化UI后,解锁LVGL接口。lvgl_port_lock(0); // 锁定lvgl接口ui_init(); // 初始化UIlvgl_port_unlock(); // 解锁lvgl接口//无限循环,用于持续更新UIwhile (1){lvgl_port_lock(0); // 锁定lvgl接口,以保护UI更新过程。ui_tick(); // UI刷新lvgl_port_unlock(); // 解锁lvgl接口以允许其他任务访问。vTaskDelay(pdMS_TO_TICKS(1)); // 函数延迟1毫秒,以避免过度占用CPU资源。}
}
main.c添加:
声明ui头文件#include "ui.h"//EEZ生成的UI文件
初始化ui
while循环刷新ui:ui_tick(); // UI刷新
安全机制:
lvgl_port_lock(0); // 锁定lvgl接口,以保护UI更新过程。
ui_tick(); // UI刷新
lvgl_port_unlock(); // 解锁lvgl接口以允许其他任务访问。
vTaskDelay(pdMS_TO_TICKS(1)); // 函数延迟1毫秒,以避免过度占用CPU资源。
修改CMakeLists.txt,
修改CMakeLists.txt,添加ui文件夹至工程编译路径
set(UI_DIR ../ui)
file(GLOB_RECURSE UI_SRCS ${UI_DIR}/*.c ${UI_DIR}/*.cpp)
idf_component_register(SRCS "lvgl_lcd_port.c"
"BSP_IIC.c"
"main.c"
"IOadd_PCA9557.c""LCD.c" "lvgl_lcd_port.c"
${UI_SRCS}INCLUDE_DIRS "." ${UI_DIR})
逻辑:
1、set(UI_DIR ../ui):
设置一个变量
UI_DIR
,其值为../ui
,表示UI源文件的目录在main.c的上层文件夹的ui目录。2、file(GLOB_RECURSE UI_SRCS ${UI_DIR}/.c ${UI_DIR}/.cpp) :
使用
file(GLOB_RECURSE ...)
命令递归地搜索${UI_DIR}
目录下的所有.c
和.cpp
文件,并将这些文件的路径存储在UI_SRCS
变量中。3、idf_component_register(SRCS "lvgl_lcd_port.c" ...... ${UI_SRCS}:
命令注册一个组件,该组件包含源文件
lvgl_lcd_port.c
、......以及UI_SRCS
中的所有文件(../ui/*c,../ui/*cpp)4、INCLUDE_DIRS "." ${UI_DIR}):
指定了该组件的头文件目录:当前目录(main.c路径下)
.
和${UI_DIR}
(../ui路径下)
在EEZ我添加了图片和键盘,移植成功后烧录效果:
基于立创改,适用立创例程:
#include <stdio.h>
#include "esp32_s3_szp.h"
#include "logo_en_240x240_lcd.h"
#include "yingwu.h"#include "ui.h"extern "C" void app_main(void)
{bsp_i2c_init(); // I2C初始化pca9557_init(); // IO扩展芯片初始化bsp_lvgl_start(); // 初始化液晶屏lvgl接口//锁定LVGL接口以防止在UI初始化过程中发生并发访问。//初始化UI后,解锁LVGL接口。lvgl_port_lock(0); // 锁定lvgl接口ui_init(); // 初始化UIlvgl_port_unlock(); // 解锁lvgl接口//无限循环,用于持续更新UIwhile (1){lvgl_port_lock(0); // 锁定lvgl接口,以保护UI更新过程。ui_tick(); // UI刷新lvgl_port_unlock(); // 解锁lvgl接口以允许其他任务访问。vTaskDelay(pdMS_TO_TICKS(1)); // 函数延迟1毫秒,以避免过度占用CPU资源。}
}
# Search for src files
set(UI_DIR ./ui)
file(GLOB_RECURSE UI_SRCS ${UI_DIR}/*.c ${UI_DIR}/*.cpp) idf_component_register(SRCS "esp32_s3_szp.c" "main.cpp" ${UI_SRCS}INCLUDE_DIRS "." ${UI_DIR})
add_compile_definitions (LV_LVGL_H_INCLUDE_SIMPLE)
- 设置一个变量
UI_DIR
,其值为./ui
,表示UI源文件的目录。 - 使用
file(GLOB_RECURSE ...)
命令递归地搜索${UI_DIR}
目录下的所有.c
和.cpp
文件,并将这些文件的路径存储在UI_SRCS
变量中。 - 使用
idf_component_register(...)
命令注册一个组件,该组件包含源文件esp32_s3_szp.c
、main.cpp
以及UI_SRCS
中的所有文件。同时,指定了该组件的头文件目录为当前目录.
和${UI_DIR}
。 - 使用
add_compile_definitions(...)
命令添加一个编译定义LV_LVGL_H_INCLUDE_SIMPLE
,这可能在编译时用于控制某些编译选项或宏定义。
直观写成:
# Search for src files
set(UI_DIR ./ui)
file(GLOB_RECURSE UI_SRCS ./ui/*.c ./ui/*.cpp) idf_component_register(SRCS "esp32_s3_szp.c" "main.cpp" ./ui/*.c ./ui/*.cppINCLUDE_DIRS "." ./ui)
add_compile_definitions (LV_LVGL_H_INCLUDE_SIMPLE)
设置ui路径下的*.c文件添加到工程执行,头文件路径为/ui
目的是将ui文件夹下的文件添加进工程编译执行
使用
图片:
在侧边栏找到
点击后在顶栏找到加号添加图片(jpg,png)
图片命名遵守变量规则,不能以数字开头
色彩格式选择真色彩TRUE COLORE(真色彩),TRUE COLORE ALPAH(透明背景)
界面切换
按键设置:
添加触发事件
Handler type必须是Flow
添加Action(LVGL)
选中编辑Action
page2是我的页面二,
需在eez-flow.cpp和eez-flow.h添加
#define LV_LVGL_H_INCLUDE_SIMPLE
缘由:
避免头文件报错
变量:
新建变量:
- Global:全局变量,可以被用户使用
- Local:本地变量,作用范围仅限每个页,无法被用户使用
- Structs:全局结构体
- Enums:全局枚举
分别为设置变量名,变量类型,初始值
变量显示:使用widgets下的Label
Text设置:第一个写全变量名,第二个框选择显示变量
用户控件Action选择设置变量
绑定按钮与变量设置