【LVGL源码移植】
LVGL源码移植
- ■ LVGL源码移植
- 一:下载LVGL源码
- 二:修改LVGL文件夹
- 1: 将这5个文件,复制到一个新的文件夹
- 2: 简化文件,减少内存消耗(去除不必要的文件)
- 3: 为了规范化,我们将下列文件进行重命名
- 三:开始移植
- 1: 在之前修改的触摸屏例程中新建LVGL文件夹,将修改后的文件复制进去。
- 2: 在MDK中包括LVGL的头文件和设置c99模式
- 3: 创建4个新的文件 (LVGL_SRC,LVGL_POR,LVGL_DEMO,LVGL_APP)
- 4: 工程中加入lvgl源码
- 4.1 LVGL_SRC中添加文件
- 4.2 LVGL_POR中添加文件
- 4.3 LVGL_DEMO中添加文件
- 四:移植显示驱动
- 4.1 使能LVGL
- 4.2 代码改错
- 4.3 修改lv_conf.h文件
- 4.4 修改lv_port_disp.c文件
- 4.5 显示测试
- 五:移植触摸驱动
- 5.1 修改lv_port_indev函数
- 5.2 再修改触摸状态返回和坐标返回
- 5.3 在主函数添加触摸按键扫描
- 5.4 下载验证
- ■ 视频链接
■ LVGL源码移植
一:下载LVGL源码
LVGL源码

我们以选择v8.2.0为例,选择8.2.0下载

二:修改LVGL文件夹
1: 将这5个文件,复制到一个新的文件夹
我们只需要关注这5个文件即可,把他们复制到一个新的文件夹里面

2: 简化文件,减少内存消耗(去除不必要的文件)
为了减少内存消耗,打开examples文件将port文件复制出来,打开demos文件将keypad_encoder lv_demos lv_demo.lv_demos.mk 文件复制出来我们只需要移植下面的文件即可

3: 为了规范化,我们将下列文件进行重命名
将lv_conf_template.h 文件改为 lv_conf.h(配置相关)将port文件里
lv_port_disp_template.c 文件改为 lv_port_disp.c (显示相关)
lv_port_disp_template.h 文件改为 lv_port_disp.h(显示相关)
lv_port_fs_template.c 文件改为 lv_port_fs.c(文件系统相关)
lv_port_fs_template.c 文件改为 lv_port_fs.h(文件系统相关)
lv_port_indev_template.c 文件改为 lv_port_indev.c(输入设备相关)
lv_port_indev_template.c 文件改为 lv_port_indev.c(输入设备相关)
三:开始移植
1: 在之前修改的触摸屏例程中新建LVGL文件夹,将修改后的文件复制进去。

要复制到LVGL的文件如下:

2: 在MDK中包括LVGL的头文件和设置c99模式

3: 创建4个新的文件 (LVGL_SRC,LVGL_POR,LVGL_DEMO,LVGL_APP)
LVGL_SRC (用来存放lvgl源码)
LVGL_POR(用来配置lvgl接口文件)
LVGL_DEMO(用来配置lvgl官方例程)
LVGL_APP(用来存放用户自己的lvgl代码)

4: 工程中加入lvgl源码
4.1 LVGL_SRC中添加文件
将lvgl中src文件全部都加进LVGL_SRC文件里

提示:src文件有点多,要一个一个文件点开,将里面的使用.c文件加进来,src中extra文件里面有许多子文件,要多留个心眼,小心移植

4.2 LVGL_POR中添加文件
将lvgl中porting 中.c .h文件全都加进LVGL_POR文件中

将lvgl.h lv_conf.h lv_demos.h也加进LVGL_POR中

4.3 LVGL_DEMO中添加文件
将keypad_encoder的文件加入到LVGL_DEMO

四:移植显示驱动
4.1 使能LVGL
将 lv_port_disp.c 、 lv_port_disp.h 、 lv_port_indev.c 、 lv_port_indev.h、 lv_conf.h中if 0改成 if 1
lv_port_fs.c暂时用不到,先不修改

4.2 代码改错
我们编译一下,有很多个error,不过问题,我们一个一个来修改
(1)将_template去掉,因为我们之前有修改过源文件
(2)将…/…/去掉
(3)将lvgl/lvgl.h改成

利用ctrl+f使用替换功能可快速进行修改

如果有_sys_exit函数记得加上void

4.3 修改lv_conf.h文件
添加屏幕的分辨率
#define MY_DISP_HOR_RES 480
#define MY_DISP_VER_RES 320

4.4 修改lv_port_disp.c文件
将lv_port_disp_init函数里的2和3方式注释掉

添加上面修改的分辨率

修改disp_flush显示函数(记得包括LCD显示的头文件进来)

4.5 显示测试
修改主函数,删除之前的显示函数,只留下mian函数

打开使能demo的宏,在lv_conf里

在定时器中断函数中添加lvgl心跳(#include “lvgl.h”)
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否{TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 lv_tick_inc(1);//lvgl的1ms中断LED1=!LED1;}
}
在主函数中添加lvgl相关头文件
#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"
#include "lv_demo_keypad_encoder.h"
在主函数中添加初始化函数
lv_init();
lv_port_disp_init(); // lvgl显示接口初始化,放在lv_init()的后面
lv_port_indev_init(); // lvgl输入接口初始化,放在lv_init()的后面
lv_demo_keypad_encoder();
在主函数中添加初始化函数
lv_init();
lv_port_disp_init(); // lvgl显示接口初始化,放在lv_init()的后面
lv_port_indev_init(); // lvgl输入接口初始化,放在lv_init()的后面
lv_demo_keypad_encoder();
在while(1)调用lvgl事务处理函数
lv_task_handler(); // lvgl的事务处理
修改后的主函数

将堆栈改大一点

下载程序,显示正常(记得将屏幕改成横屏显示)

五:移植触摸驱动
5.1 修改lv_port_indev函数
将lv_port_indev_init函数里的其他输入设备注释掉,留下触摸

void lv_port_indev_init(void)
{static lv_indev_drv_t indev_drv;/*------------------* Touchpad* -----------------*//*Initialize your touchpad if you have*/touchpad_init();/*Register a touchpad input device*/lv_indev_drv_init(&indev_drv);indev_drv.type = LV_INDEV_TYPE_POINTER;indev_drv.read_cb = touchpad_read;indev_touchpad = lv_indev_drv_register(&indev_drv);
}
5.2 再修改触摸状态返回和坐标返回
/*Return true is the touchpad is pressed*/
static bool touchpad_is_pressed(void)
{/*Your code comes here*/if(PEN==0)//有按键按下{return true; // 有触摸操作 返回true}return false; // 没有触摸操作 返回false
}/*Get the x and y coordinates if the touchpad is pressed*/
/*Get the x and y coordinates if the touchpad is pressed*/
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
{/*Your code comes here*/(*x) = tp_dev.x[0]; // 赋值x坐标(*y) = tp_dev.y[0]; // 赋值y坐标
}
5.3 在主函数添加触摸按键扫描
tp_dev.scan(0);

5.4 下载验证

■ 视频链接
快速入门LVGL
相关文章:
【LVGL源码移植】
LVGL源码移植 ■ LVGL源码移植一:下载LVGL源码二:修改LVGL文件夹1: 将这5个文件,复制到一个新的文件夹2: 简化文件,减少内存消耗(去除不必要的文件)3: 为了规范化,我们将下列文件进行重命名 三&…...
双非本科准备秋招(14.2)—— 进程与线程
进程 进程是运行着的程序,是程序在操作系统的一次执行过程,进程是操作系统分配资源的基本单位。 启动一个java程序,操作系统就会创建一个java进程 进程也可以看作一个程序的实例,大部分程序可以运行多个实例进程,比如记…...
数据结构和算法笔记5:堆和优先队列
今天来讲一下堆,在网上看到一个很好的文章,不过它实现堆是用Golang写的,我这里打算用C实现一下: Golang: Heap data structure 1. 基本概念 满二叉树(二叉树每层节点都是满的): 完全二叉树&a…...
第8章 SpringBoot任务管理
学习目标 熟悉SpringBoot整合异步任务的实现 熟悉SpringBoot整合定时任务的实现 熟悉SpringBoot整合邮件任务的实现 开发web应用时,多数应用都具备任务调度功能。常见的任务包括异步任务,定时任务和发邮件任务。我们以数据库报表为例看看任务调度如何帮助改善系统设计。报表可…...
Qt5 基于OpenGL实现六轴机械臂三维仿真
需求 在Qt中通过OPenGL方式加载三维模型STL文件,然后将多个结构的STL文件类型的模型进行组装,形成6轴机械臂三维模型的显示,并且可以对每个关节进行关节角度的控制。 新建一个C类STLFileLoader,用于加载STL文件,并进…...
路由进阶
文章目录 1.路由的封装抽离2.声明式导航 - 导航链接3.声明式导航-两个类名自定义匹配的类名 4.声明式导航 - 跳转传参查询参数传参动态路传参两种传参方式的区别动态路由参数可选符 5.Vue路由 - 重定向6.Vue路由 - 4047.Vue路由 - 模式设置8.编程式导航 - 两种路由跳转9.编程式…...
分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别
分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCN-Adaboost随机配置网…...
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextPicker组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextPicker组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、TextPicker组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不…...
linux中vim的操作
(码字不易,关注一下吧w~~w) 命令模式: 当我们按下esc键时,我们会进入命令模式;当使用vi打开一个文件时也是进入命令模式。 光标移动: 1 保存退出:ZZ 2 代码格式化:ggG 3 光标移动ÿ…...
《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第5章 决策树
文章目录 第5章 决策树5.1 决策树模型与学习5.1.1 决策树模型5.1.2 决策树与if-then规则5.1.3 决策树与条件概率分布5.1.4 决策树学习5.2 特征选择5.2.1 特征选择问题5.2.2 信息增益5.2.3 信息增益比5.3.1 ID3算法5.3.2 C4.5的生成算法5.4 决策树的剪枝5.5 CART算法5.5.1 CART生…...
【C++11(一)】列表初始化and右值引用
一、 统一的列表初始化 1.1 {}初始化 在C98中,标准允许 使用花括号{}对数组或者结构体元素 进行统一的列表初始值设定 C11扩大了用大括号 括起的列表(初始化列表)的使用范围 使其可用于所有的内置类型和 用户自定义的类型 使用初始化列表时…...
为什么SSL会握手失败?SSL握手失败原因及解决方案
随着网络安全技术的发展,SSL证书作为网站数据安全的第一道防线,被越来越多的企业选择。SSL证书使用的是SSL协议,而SSL握手是SSL协议当中最重要的一部分。当部署SSL证书时,如果服务器和客户端之间无法建立安全连接,就会…...
STM32——智能小车
STM32——智能小车 硬件接线 B-1A – PB0 B-1B – PB1 A-1A – PB2 A-1B – PB10 其余接线参考51单片机小车项目。 1.让小车动起来 motor.c #include "motor.h" void goForward(void) {// 左轮HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO…...
开源:基于Vue3.3 + TS + Vant4 + Vite5 + Pinia + ViewPort适配..搭建的H5移动端开发模板
vue3.3-Mobile-template 基于Vue3.3 TS Vant4 Vite5 Pinia ViewPort适配 Sass Axios封装 vconsole调试工具,搭建的H5移动端开发模板,开箱即用的。 环境要求: Node:16.20.1 pnpm:8.14.0 必须装上安装pnpm,没装的看这篇…...
缩略图保持加密(thumbnail-preserving encryption, TPE)的理论基础
这涉及到一些视觉心理学等方面知识: 1、参考文献: 云存储图像缩略图保持的加密研究进展(中国图像图形学报) 一些视觉心理学的研究为TPE的成功实现提供了理论基础。Potter(1975, 1976)的研究表明人类的视觉系统能够在100 ms内从一个新场景中提取出相应的语义信息;250 ms内…...
nodejs+vue+mysql校园失物招领网站38tp1
本高校失物招领平台是为了提高用户查阅信息的效率和管理人员管理信息的工作效率,可以快速存储大量数据,还有信息检索功能,这大大的满足了用户和管理员这两者的需求。操作简单易懂,合理分析各个模块的功能,尽可能优化界…...
GEDepth:Ground Embedding for Monocular Depth Estimation
参考代码:gedepth 出发点与动机 相机的外参告诉了相机在世界坐标系下的位置信息,那么可以用这个外参构建一个地面基础深度作为先验,后续只需要在这个地面基础深度先验基础上添加offset就可以得到结果深度,这样可以极大简化深度估…...
校园圈子论坛系统--APP小程序H5,前后端源码交付,支持二开!uniAPP+PHP书写!
随着移动互联网的快速发展,校园社交成为了大学生们日常生活中重要的一部分。为了方便校园内学生的交流和互动,校园社交小程序逐渐走入人们的视野。本文将探讨校园社交小程序的开发以及其带来的益处。 校园社交小程序的开发涉及许多技术和设计方面。首先&…...
VMware vCenter告警:vSphere UI运行状况警报
vSphere UI运行状况警报 不会详细显示告警的具体内容,需要我们自己进一步确认告警原因。 vSphere UI运行状况警报是一种监控工具,用于检测vSphere环境中的潜在问题。当警报触发时,通常表示系统遇到了影响性能或可用性的问题。解决vSphere UI…...
C# 引用同一个dll不同版本的程序集
因为项目需要所以必须在项目中引用不同版本的同一程序集 我要引用的文件是newtonsoft.json.dll 两个版本为12.0.0.0 和4.0.0.0 1.如果已经先引入了newtonsoft.json 12.0.0.0版本的程序集,如果直接引入另一个版本的程序集的话会提示不成功,所以先将另一个…...
如何高效管理九大网盘文件:LinkSwift直链下载助手完整指南
如何高效管理九大网盘文件:LinkSwift直链下载助手完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …...
为Claude Code配置Taotoken解决账号封禁与Token不足痛点
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为Claude Code配置Taotoken解决账号封禁与Token不足痛点 对于频繁使用Claude Code作为编程助手的开发者而言,直接使用官…...
保姆级教程:用Python多进程+队列搞定海康/大华摄像头实时预览,告别卡顿延迟
Python多进程与队列优化:实现多路摄像头无延迟实时预览 在安防监控、智能识别等实时视频处理领域,开发者常遇到多路摄像头同时读取时的性能瓶颈。传统单线程方式处理视频流时,由于I/O阻塞和计算密集型操作交织,极易导致视频延迟累…...
别再乱调字体了!Qt界面开发中QSS字体属性(font-family, size, weight)的实战避坑指南
Qt界面开发中的QSS字体属性实战避坑指南 在Qt界面开发中,字体渲染问题就像是一个隐形的"坑王"——平时不显山露水,一到项目交付或跨平台测试时就开始疯狂刷存在感。我至今记得第一次看到精心设计的"微软雅黑"界面在客户Linux机器上变…...
第52篇:Vibe Coding时代:LangGraph + 审计日志实战,解决 Agent 做了什么无人可追的问题
第52篇:Vibe Coding时代:LangGraph + 审计日志实战,解决 Agent 做了什么无人可追的问题 一、问题场景:线上出问题后,没人知道 Agent 当时做了什么 当 Agent 具备代码修改、测试、提交、PR 创建能力后,必须有审计日志。 否则一旦出现问题: 某个接口突然返回异常 某个权…...
2025最权威的五大AI辅助写作平台实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下,学术研究不断深入,职业发展持续推进,在此进程中&am…...
如何永久保存微信聊天记录?3步实现数据自主掌控的完整方案
如何永久保存微信聊天记录?3步实现数据自主掌控的完整方案 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...
为什么92%的AI系统在L3自治阶段遭遇安全断层?奇点大会安全专家组深度拆解AI原生框架的4个不可绕过的设计拐点
更多请点击: https://intelliparadigm.com 第一章:AI原生安全框架:2026奇点智能技术大会安全专家解读 在2026奇点智能技术大会上,来自全球12家顶尖AI安全实验室的联合工作组正式发布《AI原生安全框架(AISF v1.0&#…...
基于Cloudflare Workers的Gemini模型OpenAI API兼容代理部署指南
1. 项目概述:将Google Gemini模型桥接到OpenAI生态 如果你和我一样,既想体验Google Gemini 2.5系列模型强大的推理和视觉能力,又早已习惯了OpenAI API那套简洁、标准化的调用方式,那么你肯定也遇到过“生态割裂”的烦恼。每次想用…...
5分钟快速上手:浏览器中直接查看SQLite数据库的终极免费工具
5分钟快速上手:浏览器中直接查看SQLite数据库的终极免费工具 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 想象一下这样的场景:你刚刚收到同事发来的一个SQLite数据库文件…...
