在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.4,运行demo,显示label
在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.4
- 一、硬件平台
- 二、实现功能
- 三、移植步骤
- 1、下载LVGL-8.4
- 2、MDK中安装LVGL-8.4
- 3、配置RTE
- 4、配置头文件 lv_conf_cmsis.h
- 5、配置lv_port_disp_template
- 四、添加心跳相关文件
- 1、在STM32CubeMX中配置TIM7的参数
- 2、使能中断,中断优先级尽可能高
- 3、编写中断回调函数
- 4、在main函数中调用配置、初始化和使能中断的HAL库函数
- 五、修改main函数
- 1、对LVGL进行初始化
- 2、在while中,增加lv_task_handler函数。
- 3、运行lv_demo_benchmark
- 六、配置MDK编译选项
- 1、修改堆栈大小
- 2、增加预编译宏
- 3、注意:移植 LVGL 必须开启 C99 模式
- 七、在LVGL中显示字符串
- 1、修改lv_conf_cmsis.h
- 2、增加预编译宏
- 3、修改main函数
- 4、while中的lv_task_handler函数,在心跳的控制下处理事务
- 几点说明
一、硬件平台
核心板:正点原子 探索者 STM32F407ZGT6
4’3寸电容触摸屏
二、实现功能
1、运行lv_demo_benchmark.c这个demo实例;
2、在屏幕上显示字符串。
三、移植步骤
1、下载LVGL-8.4
下载的渠道很多:
- 微信公众号:裸机思维
这里有两个版本的 cmsis-pack:
- v8.4.0 : 官方的维护性更新,这是目前最稳定也最推荐的版本。
- v9.2.1: LVGL9 的稳定性更新。加入对ST-DMA2D的支持,加入对Ne maGFX的支持。加入新Demo eBike。
- gitee
lvgl/lvgl - Gitee.com
2、MDK中安装LVGL-8.4
直接通过MDK的Pack-Installer进行直接安装。
下载解压之后,得到pack包:
然后在Pack Installer中安装即可。
安装成功,可以在RTE中看到安装的LVGL。
为了确保工程文件的完整性,把C:\Keil_v5\ARM\PACK\LVGL\lvgl\8.4.0目录下的demo、examples、src、lvgl.h复制到自己的工程目录…\MDK-ARM\RTE\LVGL中。
3、配置RTE
在MDK中通过菜单 Project->Manage->Run-Time Enviroment 打开RTE配置窗口,找到LVGL将其展开,勾选benchmark、Essential、Extra Themes和porting。
单击“OK”,可以看到LVGL已经自动加入到工程列表中。
4、配置头文件 lv_conf_cmsis.h
是对lvgl组件进行配置,包括屏幕尺寸、颜色深度、RGB565模式等。具体请参考LVGL配置与移植指南-CSDN博客 。
重要的是
:将开头处 #if 0 修改为 #if 1,使整个头文件生效。
可以根据实际情况,修改其他参数,例如把所需内存改小一些:
#define LV_MEM_SIZE (16U * 1024U) /*[bytes]*/
5、配置lv_port_disp_template
- 打开
lv_port_disp_template.h
,将开头处#if 0
修改为#if 1
,使整个头文件生效。 - 包含lcd.h
#include lcd.h
- 打开
lv_port_disp_template.c
,将开头处#if 0
修改为#if 1
,使整个头文件生效。 - 修改屏幕分辨率
#define MY_DISP_HOR_RES 480#define MY_DISP_VER_RES 800
- 选择定义缓冲区的方式。LVGL提供了三种缓冲的方式:第一种只有一个缓冲区;第二种有2个缓冲区,用于DMA;第三种是2个全缓冲区。本次选择第一种,把其他2种定义缓冲区的代码删除或者注释掉。否则,可能在编译时出现容量不足的错误。
- 修改disp_init函数,增加LCD驱动中的初始化代码。
static void disp_init(void)
{/*You code here*/lcd_init();
}
- 修改disp_flush函数,增加正点原子的填充函数。
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{lcd_color_fill(area->x1, area->y1, area->x2, area->y2, (uint16_t *)color_p);/*IMPORTANT!!!*Inform the graphics library that you are ready with the flushing*/lv_disp_flush_ready(disp_drv);
}
- 在RTE_Components.h文件中,定义宏:
#define LV_LVGL_H_INCLUDE_SIMPLE
四、添加心跳相关文件
LVGL的 30ms 心跳 通过调用定时器7的中断来实现。
1、在STM32CubeMX中配置TIM7的参数
预分频8400-1,时钟计数300-1,那么30ms产生一次更新中断。
2、使能中断,中断优先级尽可能高
配置完成之后,自动生成TIM7的配置和初始化代码。
3、编写中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6) {//HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10); // LED1翻转 }else if(htim->Instance == TIM7) {lv_tick_inc(30); // 关键!通知LVGL时间流逝30ms }
}
4、在main函数中调用配置、初始化和使能中断的HAL库函数
MX_TIM7_Init();HAL_TIM_Base_Start_IT(&htim7);// 启动TIM7中断
五、修改main函数
1、对LVGL进行初始化
- 增加包含头文件
#include "RTE_Components.h"
#include "lv_port_disp_template.h"
- 在main函数中增加初始化函数
lv_init(); // lvgl系统初始化lv_port_disp_init(); // lvgl显示接口初始化,放在lv_init()的后面
2、在while中,增加lv_task_handler函数。
在 LVGL 中,lv_task_handler() 是 核心任务处理函数,负责执行 LVGL 的内部任务调度(如界面刷新、动画处理、输入设备事件处理等)。
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */delay_ms(1000);lv_task_handler(); // lvgl的事务处理}
3、运行lv_demo_benchmark
- 在main函数中增加头文件
#include "lv_demo_benchmark.h"
- 在“魔术棒”->“C/C++”->“Define”中,添加
LV_USE_DEMO_BENCHMARK
- 调用lv_demo_benchmark函数
lv_init(); // lvgl系统初始化lv_port_disp_init(); // lvgl显示接口初始化,放在lv_init()的后面lv_demo_benchmark();
六、配置MDK编译选项
1、修改堆栈大小
注意的是:要跑这个Demo,Stack(栈)和 Heap(堆)各自都不能小于 4K,切记,切记!
在STM32CubeMX中修改
2、增加预编译宏
在“魔术棒”->“C/C++”->“Define”中,添加LV_CONF_SKIP
和LV_LVGL_H_INCLUDE_SIMPLE
3、注意:移植 LVGL 必须开启 C99 模式
七、在LVGL中显示字符串
利用LVGL的Labe标签显示字符串。参考资料:
LVGL lv_label标签控件
1、修改lv_conf_cmsis.h
在\RTE\LVGL\lv_conf_cmsis.h文件中,修改成
#define LV_FONT_MONTSERRAT_32 1
2、增加预编译宏
在“魔术棒”->“C/C++”->“Define”中,添加LV_FONT_MONTSERRAT_32
3、修改main函数
lv_init(); // lvgl系统初始化lv_port_disp_init(); // lvgl显示接口初始化,放在lv_init()的后面lv_demo_benchmark();lv_obj_t * label = lv_label_create(lv_scr_act()); // 在活动屏幕上创建标签 lv_label_set_text(label, "Hello LVGL!"); // 设置文本 lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); // 居中显示 lv_obj_set_style_text_font(label, &lv_font_montserrat_32, LV_PART_MAIN);
-
lv_label_create(lv_scr_act())
创建一个标签对象,并绑定到当前活动屏幕(lv_scr_act() 返回默认屏幕)。
lv_obj_t* 是 LVGL 中所有控件的基类(类似面向对象中的父类)。 -
lv_label_set_text()
设置标签的文本内容(支持动态更新,如显示传感器数据)。 -
lv_obj_align()
将标签对齐到屏幕中心(LV_ALIGN_CENTER),后两个参数是偏移量(这里为 0)。 -
lv_obj_set_style_text_font()
设置字体为 lv_font_montserrat_32(32 像素高的 Montserrat 字体)。
4、while中的lv_task_handler函数,在心跳的控制下处理事务
编译下载运行结果如下:
几点说明
- 在移植LVGL之前,已经完成了正点原子的TFTLCD代码移植.本人使用STM32CubeMX自动生成初始化和配置代码,所以在移植正点原子的代码时,没有移植他的system、sys和usart.
- 在移植的过程中,主要出现的错误是包含头文件、delay_ms、delay_us的错误,本人用TIM6实现delay_us;重新定义delay_ms函数调用HAL_Delay实现ms延时.
相关文章:

在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.4,运行demo,显示label
在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.4 一、硬件平台二、实现功能三、移植步骤1、下载LVGL-8.42、MDK中安装LVGL-8.43、配置RTE4、配置头文件 lv_conf_cmsis.h5、配置lv_port_disp_template 四、添加心跳相关文件1、在STM32CubeMX中配置TIM7的参数2、使能…...

模块二:C++核心能力进阶(5篇) 篇一:《STL源码剖析:vector扩容策略与迭代器失效》
一、前言:重新认识vector的复杂性 在C开发者中,std::vector常被视为"动态数组"的简单实现,但其底层机制实则蕴含着深刻的工程智慧。本篇将通过: 多维度源码剖析(GCC/Clang/MSVC三平台实现对比)…...
计算机组成原理核心剖析:CPU、存储、I/O 与总线系统全解
引言 在当今数字化时代,计算机已经渗透到我们生活的方方面面,从智能手机到超级计算机,从智能家居到自动驾驶汽车。然而,你是否曾好奇过,这些功能强大的设备内部究竟是如何工作的?是什么让计算机能够执行各种…...
数据分类分级的实践与反思:源自数据分析、治理与安全交叉视角的洞察
在数据安全体系的构建中,数据分类分级无疑扮演着基石性的角色,其系统性与复杂性对从业者提出了极高要求。尽管个人并非专注于该领域的研究专家,但凭借在数据分析、数据治理及数据安全策略应用交叉地带的长期实践与系统性认知,得以…...

自动化立体仓库WCS的设计与实现
导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。欢迎大家使用我们的仓储物流技术AI智能体。 新书《智能物流系统构成与技术实践》 新书《智能仓储项目出海-英语手册,必备!》 完整版文件和更多学习资料…...
百度蜘蛛池的作用是什么?技术@baidutopseo
百度蜘蛛池的作用 百度蜘蛛池是一种用于集中管理和调度百度搜索引擎蜘蛛(爬虫)的技术工具。其主要目的是优化网站内容的收录效率,帮助搜索引擎更高效地发现和抓取网页内容。技术baidutopseo 提升收录效率 通过集中大量百度蜘蛛的访问请求&…...
8.linux文件与文件夹内处理命令cp,mv,rm
cp 可以用于复制文件/文件夹 cp 【-r】 参数1 参数2 -r,用于复制文件夹使用,表示递归 mv 用于移动文件/文件夹,没有选项 参数2:表示移动去的地方,如果参数2不存在,则进行改名,保证目标存在…...
JavaScript性能优化:实战技巧提升10倍速度
JavaScript 性能优化实战技术文章大纲 基础优化策略 减少 DOM 操作:频繁的 DOM 操作会导致重绘和回流,影响性能。使用文档片段(DocumentFragment)或虚拟 DOM 技术优化批量操作。 避免全局变量污染:全局变量会增加内…...
核函数:解锁支持向量机的强大能力
在机器学习的世界中,支持向量机(SVM)是一种强大的分类算法,而核函数则是其背后的“魔法”,让 SVM 能够处理复杂的非线性问题。今天,我们就来深入探讨核函数的奥秘,看看它们是如何帮助 SVM 在高维…...

UE5 2D地图曝光太亮怎么修改
UE5 2D地图曝光怎么修改 在场景添加后期处理体积 修改后期处理体积Exposure曝光参数最大值最小值都改为0 勾选Infinite Extend 全地图范围应用此后期处理体积...

C# 类和继承(基类访问)
基类访问 如果派生类必须访问被隐藏的继承成员,可以使用基类访问(base access)表达式。基类 访问表达式由关键字base后面跟着一个点和成员的名称组成,如下所示: 例如,在下面的代码中,派生类Oth…...

帕金森带来的生活困境
当这种健康状况出现,行动不再自如成为最明显的改变。日常行走时,步伐会逐渐变小、变慢,甚至会出现 “小碎步” 往前冲,难以停下,简单的起身、转身都可能变得艰难。手部也会不受控制地颤抖,拿水杯、系纽扣这…...
集成测试的流程总结
首先我们的目的是进行自动化测试,也就是通过cl工具来对我们的项目用我们自己写的yaml文件中的命令来测试项目,这是我们的根本性目的,现在用github action cl工具以及maestro cli 云端作为例子通一遍流程。 首先用xcode创建我们的ios app应用程…...

Redis最佳实践——性能优化技巧之Pipeline 批量操作
Redis Pipeline批量操作在电商应用中的性能优化技巧 一、Pipeline核心原理与性能优势 1. 工作机制对比: sequenceDiagramtitle 常规请求 vs Pipeline请求# 常规模式Client->>Redis: 命令1Redis-->>Client: 响应1Client->>Redis: 命令2Redis--&g…...
Node.js 项目调试指南
Node.js 项目调试指南 🧭 一、调试工具和方式总览 方式难度场景说明console.log 调试★简单问题定位最常见,但效率低debug 模块★★模块化输出日志支持命名空间的调试日志VSCode 断点调试★★★跟踪函数调用、变量状态推荐使用node inspect / ndb★★★…...

win32相关(虚拟内存和物理内存)
虚拟内存和物理内存 在win32操作系统下,每个进程都有它自己独立的4GB空间,是window给它分配的一个虚拟空间,并不是真正的物理空间,这4GB空间中,分为高2G和低2G,高2G是应用程序的,低2G空间是给内…...

Linux操作系统安全管理概述与命令操作
前言: 1.本文将详细描述让读者了解Linux操作系统安全管理的概述和SELinux安全上下文以及基础操作命令; 2.本文将让读者掌握Linux操作系统防火墙firewall的结构和命令使用方法; 3.了解Iptables防火墙配置的结构与特点以及…...

《操作系统真相还原》——中断
可以毫不夸张的说,操作系统离不开中断 此时我们将中断处理程序放在了汇编文件中了,很显然我们不能很方便的编写中断处理程序,不如在汇编程序里调用c函数。 在这个感觉过可以在c语言中直接内联汇编完成这些。 定时器 将时钟中断的频率提高后…...

[yolov11改进系列]基于yolov11引入特征融合注意网络FFA-Net的python源码+训练源码
【FFA-Net介绍】 北大和北航联合提出的FFA-net: Feature Fusion Attention Network for Single Image Dehazing图像增强去雾网络,该网络的主要思想是利用特征融合注意力网络(Feature Fusion Attention Network)直接恢复无雾图像,…...

助力活力生活的饮食营养指南
日常生活中,想要维持良好的身体状态,合理的营养补充至关重要。对于易受身体变化困扰的人群来说,更需要从饮食中摄取充足养分。 蛋白质是身体的重要 “建筑材料”,鱼肉、鸡肉、豆类制品富含优质蛋白,易于消化吸收&am…...
【软件测试】测试框架(unittest/pytest)
本文介绍了Python 中最常用的两个测试框架:unittest 和 pytest,帮助你编写更规范、可维护的自动化测试用例。 一、unittest 框架 unittest 是 Python 内置的标准库,无需额外安装,适合初学者入门。它借鉴了 JUnit 的设计理念&…...
Kotlin 中 companion object 扩展函数详解
companion object 的扩展函数是 Kotlin 中一个强大但稍显复杂的特性,它允许你为类的伴随对象添加新的函数。下面我会通过清晰的示例和解释帮助你理解这个概念。 基本概念 扩展函数允许你为已有的类添加新函数,而无需继承或修改原始类。当这个扩展函数是…...
MySQL半同步复制配置和参数详解
目录 1 成功配置主从复制 2 加载插件 3 半同步复制监控 4 半同步复制参数 1 成功配置主从复制 操作步骤参考:https://blog.csdn.net/zyb378747350/article/details/148309545 2 加载插件 #主库上 MySQL 8.0.26 之前版本: mysql>INSTALL PLUGIN rpl_semi_syn…...
使用FastAPI构建车牌检测识别服务
概述 FastAPI FastAPI是一个现代的高性能 Web 框架,用于使用 Python 构建 API。它可以让开发者轻松快速高效地构建 API,同时提供 API 的自动验证、序列化和文档记录等功能,是构建 Web 服务和微服务的热门选择。 YOLO YOLO(YOLO(You Only Look Once)是一种流行的物体检…...

pikachu通关教程-File Inclusion
文件包含漏洞 本地文件包含 http://127.0.0.1:1000/pikachu/vul/fileinclude/fi_local.php?filenamefile1.php&submit%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 首先我们把file1改成file2,发现切换成功 那我们可不可以上传本地文件呢,答案是肯定的&a…...
CppCon 2014 学习:Defensive Programming Done Right.
这段摘要讲的是: 在组件化开发中,每个开发者负责让自己写的软件易懂且好用,且不易被误用。常见误用之一是调用库函数时未满足前置条件,导致未定义行为。未定义行为的契约(contract)不一定不好,…...

《机器学习数学基础》补充资料:韩信点兵与拉格朗日插值法
本文作者:卓永鸿 19世纪的伟大数学家高斯,他对自己做的数学有非常高的要求,未臻完美不轻易发表。于是经常有这样的情况:其他也很厉害的数学家提出自己的工作,高斯便拿出自己的文章说他一二十年前就做出来了࿰…...

Spring Boot中保存前端上传的图片
在Spring Boot中保存前端上传的图片可以通过以下步骤实现: 1. 添加依赖 确保在pom.xml中已包含Spring Web依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifact…...
【HTML-15.2】HTML表单按钮全面指南:从基础到高级实践
表单按钮是网页交互的核心元素,作为用户提交数据、触发操作的主要途径,其重要性不言而喻。本文将系统性地介绍HTML表单按钮的各种类型、使用场景、最佳实践以及高级技巧,帮助开发者构建更高效、更易用的表单交互体验。 1. 基础按钮类型 1.1…...

2025最新 MacBook Pro苹果电脑M系列芯片安装zsh教程方法大全
2025最新 MacBook Pro苹果电脑M系列芯片安装zsh教程方法大全 本文面向对 macOS 环境和终端操作尚不熟悉的“小白”用户。我们将从最基础的概念讲起,结合实际操作步骤,帮助你在 2025 年最新 MacBook Pro(搭载苹果 M 系列芯片)的环境…...