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(); // 初始化UI
lvgl_port_unlock(); // 解锁lvgl接口 //无限循环,用于持续更新UI
while (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(); // 初始化UI
lvgl_port_unlock(); // 解锁lvgl接口 //无限循环,用于持续更新UI
while (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/*.cpp
INCLUDE_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选择设置变量

绑定按钮与变量设置

Esp32s3(立创实战派)移植LVGL的更多相关文章

  1. 深度解析SDN——利益、战略、技术、实践(实战派专家力作,业内众多专家推荐)

    深度解析SDN——利益.战略.技术.实践(实战派专家力作,业内众多专家推荐) 张卫峰 编   ISBN 978-7-121-21821-7 2013年11月出版 定价:59.00元 232页 16开 ...

  2. Arduino+ESP32 之 驱动GC9A01圆形LCD(二),移植LVGL,跑示例程序,显示自制图片

    在前文Arduino+ESP32 之 驱动GC9A01圆形LCD(一), 我们已经移植好了arduino GFX库, 该库的示例程序内,还有LVGL的示例程序哦. arduino环境下移植lvgl是很 ...

  3. stm32h750移植lvgl

    之前没做过ui,只用过lcd画几条线写点字,如果按键.菜单什么的全用线画也太麻烦了,所以需要一个ui库. 听说lvgl用的人很多,就打算裸机移植一下用用.本文移植的lvgl版本是lvgl6.2,也移植 ...

  4. 卷积神经网络实战-----0001(移植卷积神经网络c++ to python or java)

    1. https://github.com/174high/simple_cnn  自己fork的 2. https://github.com/can1357/simple_cnn   最初始的 3. ...

  5. 实战派 | Java项目中玩转Redis6.0客户端缓存!

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 在前面的文章中,我们介绍了Redis6.0中的新特性客户端缓存client-side caching,通过tel ...

  6. 龙中华著《Spring Boot实战派》读书笔记之入门篇

    第一章 进入Spring Boot的世界 理念:默认大于配置.有很多集成好的方案,开箱即用.针对痛点:环境配置耗时. 1.1 Spring Boot 的特色: 使用简单 注解方式实现类的定义和功能开发 ...

  7. BI实战派:医疗BI项目落地方案

    任何BI项目面临的两大难题是项目价值和基础数据,BI项目应该给企业带来管理优化.业绩增长.医院面临的两大难题,一:绩效管理(奖金分配):二:医患关系:在医院开始自负盈亏时日常基本运营管理显得非常重要. ...

  8. 深度学习实战-----0001(移植反向传播Python to c++)

    1. https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/  老外教程 2. https://github. ...

  9. SpringBoot实战派读书笔记---响应式编程

    1.什么是WebFlux? WebFlux不需要Servlet API,在完全异步且无阻塞,并通过Reactor项目实现了Reactor Streams规范. WebFlux可以在资源有限的情况下提高 ...

  10. 龙中华著《Spring Boot实战派》读书笔记之基础篇

    第四章 Spring Boot 基础 4.1 了解Spring Boot 项目结构 src/main/java //入口类,等 src/main/resources //静态文件和配置文件 src/t ...

随机推荐

  1. Vue.js 文本交替滚动

    1.前言 当一段文本需要单行显示,但是又限于容器宽度无法完全展示时,我们需要对其滚动展示,所以就有了这个插件,如图: 2.封装思路 使用js模拟循环滚动的动画,容器宽度固定且超出隐藏,文本元素禁止换行 ...

  2. 【分块】LibreOJ 6278 数列分块入门2

    题目 https://loj.ac/p/6278 题解 将 \(n\) 个元素的数组 \(a\) 按块长 \(\sqrt{n}\) 进行分块处理.为每个块设置一个懒添加标记 \(add[i]\),代表 ...

  3. 虚拟机搭建FISCO BCOS的区块链浏览器

    一键搭建 注:根据官方文档搭建,大部分与官方文档相似.我自己修改了部分代码,并对部分报错进行了解决这次使用的是一键搭建,适合前后端同机部署,快速体验的情况使用 具体安装步骤 依赖环境 环境 版本 Ja ...

  4. 2021年最新js手机号正则验证 最全全部号段

    手机号验证正则 /^1[3-9]\d{9}$/ js的例子 isphone.html <html> <body> <input id="Tel" ty ...

  5. Qt音视频开发44-本地摄像头推流(支持分辨率/帧率等设置/实时性极高)

    一.前言 本地摄像头推流和本地桌面推流类似,无非就是采集的设备源头换成了本地摄像头设备而不是桌面,其他代码完全一样.采集本地摄像头实时视频要注意的是如果设置分辨率和帧率,一定要是设备本身就支持的,如果 ...

  6. Qt开发经验小技巧231-235

    关于c++中继承多态virtual和override的几点总结. 子类可以直接使用基类中的protected下的变量和函数. 基类函数没加virtual,子类有相同函数,实现的是覆盖.用基类指针调用时 ...

  7. 使用学生优惠创建 Azure Database for MySQL 数据库

    前言 在此之前,你需要拥有一个已通过学生认证的 Azure 账户.关于通过 Azure 学生认证,网上已有大量教程,此处不再赘述. 前些日子认证通过了 Azure 的学生认证,在部署此网站时发现 Az ...

  8. AI应用平台搭建之旅(上) - 框架篇(附:AICon大会阿里国际Agent应用平台分享)

    前言 LangEngine内源项目发起于阿里巴巴集团内部组织,LangEngine是类似LLM应用开发框架LangChain的纯Java版本.该框架现已正式对外开源:https://github.co ...

  9. 还不会 Cert Manager 自动签发证书?一文掌握

    相信很多小伙伴对于 Cert Manager 不陌生,Cert Manager 是 Kubernetes 上的证书管理工具,基于 ACME 协议与 Let's Encrypt 签发免费证书并为证书自动 ...

  10. 第三章 dubbo源码解析目录

    7.6 服务远程暴露 - 注册服务到zookeeper 为了安全:服务启动的ip全部使用10.10.10.10 远程服务的暴露总体步骤: 将ref封装为invoker 将invoker转换为expor ...