Esp32s3(立创实战派)移植LVGL

Esp32s3(立创实战派)移植LVGL

移植:

使用软件EEZ studio

创建工程选择带EEZ Flow的,可以使用该软件更便捷的功能

image-20250203165712599

根据屏幕像素调整画布为320*240

image-20250203171037604

复制ui文件至工程

将生成的ui文件夹复制到main文件夹同级目录(ui文件夹在工程文件src中)

工程结构:

image-20250201163651669

修改声明头文件路径

首先将ui文件夹中的所有声明头文件由:

image-20250201155442505

改成

image-20250201155513168

因为组件的路径已经声明,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我添加了图片和键盘,移植成功后烧录效果:

image-20250201192907232

基于立创改,适用立创例程:

#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)
  1. 设置一个变量UI_DIR,其值为./ui,表示UI源文件的目录。
  2. 使用file(GLOB_RECURSE ...)命令递归地搜索${UI_DIR}目录下的所有.c.cpp文件,并将这些文件的路径存储在UI_SRCS变量中。
  3. 使用idf_component_register(...)命令注册一个组件,该组件包含源文件esp32_s3_szp.cmain.cpp以及UI_SRCS中的所有文件。同时,指定了该组件的头文件目录为当前目录.${UI_DIR}
  4. 使用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文件夹下的文件添加进工程编译执行

使用

图片:

在侧边栏找到

image-20250203171145901

点击后在顶栏找到加号添加图片(jpg,png)

图片命名遵守变量规则,不能以数字开头

image-20250201190342780

色彩格式选择真色彩TRUE COLORE(真色彩),TRUE COLORE ALPAH(透明背景)

界面切换

image-20250203163729567

按键设置:

添加触发事件

image-20250203163822977

Handler type必须是Flow

添加Action(LVGL)

image-20250203163948500

选中编辑Action

image-20250203164102438

page2是我的页面二,

image-20250203164043142

需在eez-flow.cpp和eez-flow.h添加

#define LV_LVGL_H_INCLUDE_SIMPLE

缘由:

image-20250203165847642

避免头文件报错

变量:

新建变量:

image-20250204165025642
  • Global:全局变量,可以被用户使用
  • Local:本地变量,作用范围仅限每个页,无法被用户使用
  • Structs:全局结构体
  • Enums:全局枚举
image-20250204165214087

分别为设置变量名,变量类型,初始值

变量显示:使用widgets下的Label

image-20250204154435808

Text设置:第一个写全变量名,第二个框选择显示变量

image-20250204154622523

用户控件Action选择设置变量

image-20250204155323105

绑定按钮与变量设置

image-20250204164953785

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/878634.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字节系AI代码编辑器Trae:免费双模大模型+「Builder模式」

字节跳动技术团队近日正式推出AI代码编辑器Trae(官网:https://www.trae.ai/),这款定位为「自适应AI IDE」的开发工具,凭借其创新功能组合在技术圈引发关注。作为面向下一代开发者的智能编程平台,Trae正在重新定义人机协作的编码体验。 一、核心亮点解析双模大模型免费开放…

RocketMQ实战—3.基于RocketMQ升级订单系统架构

大纲 1.基于MQ实现订单系统核心流程的异步化改造 2.基于MQ实现订单系统和第三方系统的解耦 3.基于MQ实现将订单数据同步给大数据团队 4.秒杀系统的技术难点以及秒杀商详页的架构设计 5.基于MQ实现秒杀系统的异步化架构 6.全面引入MQ的订单系统架构的思维导图1.基于MQ实现订单系…

昆明理工大学2025通信复试真题及答案-通信核心课程综合

0854通信工程信号与系统 吴大正信号与线性系统分析昆工昆明理工大学通信工程817信号与系统考研信号与信息处理通信与信息系统通信工程F002通信核心课程综合通信工程(含宽带网络、移动通信等)

pytorch | softmax(x,dim=-1)参数dim的理解

转自:https://zhuanlan.zhihu.com/p/525276061 首先说一下Softmax函数,公式如下:1. 三维tensor(C,H,W) 一般会设置成dim=0,1,2,-1的情况(可理解为维度索引)。其中2与-1等价,相同效果。 用一张图片来更好理解这个参数dim数值变化:当dim=0时, 是对每一维度相同位置的数值进行…

私人订制新功能——日常

最近开发了一个新功能,以前我都是用纸质笔记做记录的日常生活,后来发现有点麻烦,比如写英语日记的时候,哪天的日记忘记写了还得往前翻太麻烦了,现在打算制作一个功能把这个事情记录下来;功能:是否已经写英语日记记录、举哑铃记录、锻炼握力器记录;

2025 PVC

短线有波上涨

静态代理模式:代码世界的“替身演员”

静态代理是代理模式的一种**实现方式**,其特点是**代理类在编译时就已经确定**,代理类的代码是在程序编译阶段生成的,而不是运行时动态生成。一、关于静态代理 1.1 简介 静态代理是代理模式的一种实现方式,其特点是代理类在编译时就已经确定,代理类的代码是在程序编译阶段…

一个 .NET 开源、免费、功能强大的Windows应用卸载神器

前言 今天大姚给大家分享一个基于 .NET 开源(Apache License)、免费、功能强大的Windows应用卸载神器:Bulk Crap Uninstaller。 项目介绍 Bulk Crap Uninstaller 是一款基于 .NET 开源(Apache License)、免费、功能强大的Windows应用卸载工具,旨在帮助用户快速且有效地移…

强化学习驱动的自适应模型选择与融合用于监督学习

图片来源:Unsplash 上的 Agence Olloweb引言 机器学习模型的选择一直是一个挑战。无论是预测股票价格、诊断疾病,还是优化营销活动,问题始终是:哪个模型最适合我的数据? 传统上,我们依赖交叉验证来测试多个模型——XGBoost、LGBM、随机森林等——然后根据验证性能选择最佳…

Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践

title: Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践 date: 2025/2/4 updated: 2025/2/4 author: cmdragon excerpt: PostgreSQL 作为开源关系型数据库的佼佼者,因其强大的功能与性能被广泛应用于各种项目中。而 Python 则因其简洁易用的语法、丰富的库和强大的数…

Gitea Enterprise 23.0.0 (Linux, macOS, Windows) - 本地部署的企业级 Gti 服务

Gitea Enterprise 23.0.0 (Linux, macOS, Windows) - 本地部署的企业级 Gti 服务Gitea Enterprise 23.0.0 (Linux, macOS, Windows) - 本地部署的企业级 Gti 服务 The Premier Enterprise Solution for Self-Hosted Git Service 请访问原文链接:https://sysin.org/blog/gitea/…

【跟着阿舜学音乐-笔记】2.4电鼓及其他打击乐器

2.4电鼓及其他打击乐器 滚镲:使用滚奏的方式打击吊镲(由弱到强不断打击在自然地由强到弱) 2.4.1电鼓 电鼓分为两种来源,一种为合成器合成,另一种则是由架子鼓发出后进行电声的处理。 电鼓的军鼓会稍显薄弱,有时由采取再垫一轨的方式。此外,电鼓的踩镲在一些风格曲目中打…