STM32通过KEIL pack包轻松移植LVGL,并学会使用GUI guider

news2025/7/22 11:26:12

先展示最终实现的功能效果如下:

在这里插入图片描述

1.目的与意义

之前在学习STM32移植LVGL图形库的时候,搜到的很多教程都是在官网下载LVGL的文件包,然后一个个文件包含进去,还要添加路径,还要给文件改名字,最后才能修改程序实现效果,十分繁琐,编译时还容易报错缺少各种文件,而采用KEIL的pack包直接进行移植,则可以直接跳过这些繁琐的环节,直接对文件程序进行修改。

2.LVGL pack包的获取及移植到KEIL-STM32工程上

LVGL pack包下载网址:
https://www.keil.arm.com/packs/?q=LVGL&pack-search=

在这里插入图片描述

下载之后通过keil的pack installer>file>import导入pack包即可,然后通过keil的Manage Run-Time Environment即可看到LVGL已经可以供我们移植了:
在这里插入图片描述
然后我们只是为了满足基础的使用(显示屏的显示,触摸屏的输入),所以只需要选择Essential(核心模块)和Porting(移植)即可。

其中最关键的就是2个c文件,3个h文件,我们只需要对这5个文件进行修改即可。
在这里插入图片描述
lv_conf_cmsis.h相当于LVGL提供给用户设置各种参数及使能各种功能的界面;
lv_port_disp_template为显示屏的移植部分,
lv_port_indev_template为输入设备的移植部分,其中包含鼠标、键盘、触屏等,
lv_port_fs_template为移植文件系统提供支持,里面提供了WIN、FATFS等文件系统。

首先我们打开lv_conf_cmsis.h文件进行修改:
在这里插入图片描述
LV_COLOR_DEPTH根据你屏幕显示的颜色格式进行匹配,RGB565则设为16,RGB888则设为32;
LV_COLOR_16_SWAP根据TFTLCD跟MCU的通讯方式进行设置,我采用的是FSMC 16位数据,所以置0,若使用SPI 8位数据进行通讯则置1。

在这里插入图片描述
这里可以看到LV_MEM_CUSTOM置0时由LVGL帮助申请堆(heap)内存作为LVGL的可执行内存,这里建议大于12Kb。

在这里插入图片描述
这里分别是调整显示刷新频率和输入设备检测频率,调小可以加快屏幕刷新速度和触摸屏的灵敏度,但是不宜过大,这里可以调整为5ms左右。

至此lv_conf_cmsis.h文件就修改完成了。

接下来修改lv_port_disp_template.h和.c文件对接显示屏驱动:
在这里插入图片描述
这样lv_port_disp_template.h文件就修改完成;

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这样lv_port_disp_template.c文件就修改完成。

这里将我的画矩形图程序也提供给你们作参考:

void Lcd_SetRegion(uint16_t x_start,uint16_t y_start,uint16_t x_end,uint16_t y_end)
{
	LCD_WRITE_REG=CMD_SetCoordinateX; 
	LCD_WRITE_DATA=(x_start>>8); 
	LCD_WRITE_DATA=(x_start&0XFF);     
	LCD_WRITE_DATA=(x_end>>8); 
	LCD_WRITE_DATA=(x_end&0XFF);    
	LCD_WRITE_REG=CMD_SetCoordinateY; 
	LCD_WRITE_DATA=(y_start>>8); 
	LCD_WRITE_DATA=(y_start&0XFF);
	LCD_WRITE_DATA=(y_end>>8); 
	LCD_WRITE_DATA=(y_end&0XFF);

}

void LCD_Draw_Picture(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t *color)
{  
    uint16_t height,width;
    uint16_t i,j;
    width=ex-sx+1;                 //得到图片的宽度
    height=ey-sy+1;                //得到图片的高度
    Lcd_SetRegion(sx,sy,ex,ey);
    ILI9341_Write_Cmd ( CMD_SetPixel );	    //开始写入GRAM,ili9341对应的命令值是0x2C
     for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {          
            LCD_WRITE_DATA=*color;//写入颜色值
            color++;
        }
    }      
} 

接下来修改lv_port_indev_template.h和.c文件对接触摸屏驱动:
在这里插入图片描述
这样lv_port_indev_template.h文件就修改完成;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
GT911触摸屏初始化我也放在main函数初始化那里执行了。

在这里插入图片描述
这里我也直接给出我对应的程序函数供参考(触摸屏我选用的是GT911驱动IC,通过STM32的硬件IIC进行通讯):

uint8_t Is_TP_Pressed(void)
{
  if(flag_touch == 1)
  {
    flag_touch = 0;
    return 1;
  }
  return flag_touch;
}
uint16_t getTP_X_Info()
{
	static uint16_t tx;
  uint8_t clear_buf = 0;        //用于清除寄存器
  uint8_t xy_temp[40];          //用于接受坐标
  
  //读取触摸的坐标
  HAL_I2C_Mem_Read(&hi2c2, GT911_ADDR, GT911_STATUS_ADD, 2, xy_temp, 40, 0xFFF);
  //通知GT911已读取完坐标,清除寄存器
  HAL_I2C_Mem_Write(&hi2c2, GT911_ADDR, GT911_STATUS_ADD, 2, &clear_buf, 1, 0xFF);
  //输出第一个触摸点的坐标
  tx = ((uint16_t)xy_temp[3] << 8) + xy_temp[2];
	return tx;
}

uint16_t getTP_Y_Info()
{
	static uint16_t ty;
  uint8_t clear_buf = 0;        //用于清除寄存器
  uint8_t xy_temp[40];          //用于接受坐标
  
  //读取触摸的坐标
  HAL_I2C_Mem_Read(&hi2c2, GT911_ADDR, GT911_STATUS_ADD, 2, xy_temp, 40, 0xFFF);
  //通知GT911已读取完坐标,清除寄存器
  HAL_I2C_Mem_Write(&hi2c2, GT911_ADDR, GT911_STATUS_ADD, 2, &clear_buf, 1, 0xFF);
  //输出第一个触摸点的坐标
  ty = ((uint16_t)xy_temp[5] << 8) + xy_temp[4];
	return ty;
}
void ILI9341_DrawPointPixel ( uint16_t usX, uint16_t usY, uint16_t color )//画点函数	
{	
	if ( ( usX < LCD_X_LENGTH ) && ( usY < LCD_Y_LENGTH ) )
  {
		ILI9341_SetCursor ( usX, usY );
		
		ILI9341_FillColor ( 1, color );
	}
	
}

至此lv_port_indev_template.c文件就修改完成。

接下来在main.c文件里面添加对应头文件,然后对显示和触摸进行初始化,对LVGL进行初始化及开启LVGL的心跳包和任务管理函数:
在这里插入图片描述
在这里插入图片描述
请添加图片描述
在这里插入图片描述
成功之后就可以进行程序编译了,编译完成后烧录进硬件,对屏幕进行触摸应该可以看到在触摸处会留下一个个蓝色的点,这是因为我们在lv_port_indev_template.c文件的触摸点坐标获取函数里面加入了画点函数,这样便可以验证到显示和触摸已经成功跟lvgl图形库完成对接,接下来就可以畅玩LVGL了,记得验证完LVGL成功对接之后把触摸点坐标获取函数里面的画点函数删掉,否则后面一触摸就会执行画点了。

3.使用NXP的GUI Guider实现显示及触摸响应功能

在这里插入图片描述

选择一个空白模板:
在这里插入图片描述
在这里插入图片描述
由于我是要打竖显示,而默认320*240是打横显示,所以我进行了自定义宽度240和高度320:
在这里插入图片描述

首先先给背景上个底色,白色太单调了:
在这里插入图片描述

接着在左边的组件里面随便选择个控件进行测试,我选择了仪表盘:
在这里插入图片描述

接着再放一个按钮组件,并创建按钮事件,这里我们实现按钮被按下时变大且颜色变为红色,按钮松开后恢复为原来颜色:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后信息栏就会开始显示生成的过程及结果,若没有问题就会自动跳出仿真界面,同时C代码也会生成在对应的地址。
在这里插入图片描述

第一次使用的时候如果信息栏报了一行乱码的错误,那大概率是因为电脑缺失java语言环境,该软件仿真需要java环境的支持,可以通过键盘按下 win+R,然后在运行窗口输入cmd进入下面该界面,然后输出java,如果电脑具有java环境,会输出java的信息,如下图,否则会输出不是内部或外部命令。。。。。。
在这里插入图片描述

接下来就去生成工程的地址下,拷贝custom和generated两个文件夹到你的STM32工程文件夹内:
在这里插入图片描述
然后在KEIL工程里面新建一个GUI文件组,将对应的C文件添加进去,然后再把custom和generated及其下属文件夹的路径进行添加:
在这里插入图片描述
在这里插入图片描述

最后在main.c文件里面添加头文件与执行函数即可:
在这里插入图片描述
在这里插入图片描述

之后就可以编译然后进行烧录到硬件进行验证了,若编译的时候报错缺少了各种lv_font、lv_meter等文件,直接去生成GUI guider工程的路径下进行查找然后复制到STM32工程所包含的路径下即可:
在这里插入图片描述
最后硬件跑起来的结果就如仿真的一致,也就是跟开头展示的功能效果差不多。

4.结语

通过LVGL来建立图形交互界面确实很方便,而且LVGL里面也自带了各种图片格式、包括GIF格式的解码库,还可以对接Win、FATFS等各种文件系统,在使用SD卡或Nor flash的内部图片进行读取显示时就显得更加轻松,希望这篇文章也能让各位学到一点关于LVGL的应用方法。

感谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL的查询优化

1. 查询优化器 1.1. SQL语句执行需要经历的环节 解析阶段&#xff1a;语法分析和语义检查&#xff0c;确保语句正确&#xff1b;优化阶段&#xff1a;通过优化器生成查询计划&#xff1b;执行阶段&#xff1a;由执行器根据查询计划实际执行操作。 1.2. 查询优化器 查询优化器…

MCU如何从向量表到中断服务

目录 1、中断向量表 2、编写中断服务例程 中断处理的核心是中断向量表&#xff08;IVT&#xff09;&#xff0c;它是一个存储中断服务例程&#xff08;ISR&#xff09;地址的内存结构。当中断发生时&#xff0c;MCU通过IVT找到对应的ISR地址并跳转执行。本文将深入探讨MCU&am…

Linux线程同步实战:多线程程序的同步与调度

个人主页&#xff1a;chian-ocean 文章专栏-Linux Linux线程同步实战&#xff1a;多线程程序的同步与调度 个人主页&#xff1a;chian-ocean文章专栏-Linux 前言&#xff1a;为什么要实现线程同步线程饥饿&#xff08;Thread Starvation&#xff09;示例&#xff1a;抢票问题 …

【MySQL】事务及隔离性

目录 一、什么是事务 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;事务的四大属性 &#xff08;三&#xff09;事务的作用 &#xff08;四&#xff09;事务的提交方式 二、事务的启动、回滚与提交 &#xff08;一&#xff09;事务的启动、回滚与提交 &am…

yolo目标检测助手:具有模型预测、图像标注功能

在人工智能浪潮席卷各行各业的今天&#xff0c;计算机视觉模型&#xff08;如 YOLO&#xff09;已成为目标检测领域的标杆。然而&#xff0c;模型的强大能力需要直观的界面和便捷的工具才能充分发挥其演示、验证与迭代优化的价值。为此&#xff0c;我开发了一款基于 WPF 的桌面…

2022 RoboCom 世界机器人开发者大赛(睿抗 caip) -高职组(国赛)解题报告 | 科学家

前言 题解 2022 RoboCom 世界机器人开发者大赛(睿抗 caip) -高职组&#xff08;国赛&#xff09;。 最后一题还考验能力&#xff0c;需要找到合适的剪枝。 RC-v1 智能管家 分值: 20分 签到题&#xff0c;map的简单实用 #include <bits/stdc.h>using namespace std;int…

基于物联网(IoT)的电动汽车(EVs)智能诊断

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 做到欲望极简&#xff0c;了解自己的真实欲望&#xff0c;不受外在潮流的影响&#xff0c;不盲从&#x…

JDBC+HTML+AJAX实现登陆和单表的CRUD

JDBCHTMLAJAX实现登陆和单表的CRUD 导入maven依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocatio…

【C++】位图详解(一文彻底搞懂位图的使用方法与底层原理)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 目录 1.位图的概念 2.位图的使用方法 定义与创建 设置和清除 位访问和检查 转换为其他格式 3.位图的使用场景 1.快速…

【笔记】开源通用人工智能代理 Suna 部署全流程准备清单(Windows 系统)

#工作记录 一、基础工具与环境 开发工具 Git 或 GitHub Desktop&#xff08;代码管理&#xff09;Docker Desktop&#xff08;需启用 WSL2&#xff0c;容器化部署&#xff09;Python 3.11&#xff08;推荐版本&#xff0c;需添加到系统环境变量&#xff09;Node.js LTS&#xf…

海康工业相机SDK二次开发(VS+QT+海康SDK+C++)

前言 工业相机在现代制造和工业自动化中扮演了至关重要的角色&#xff0c;尤其是在高精度、高速度检测中。海康威视工业相机以其性能稳定、图像质量高、兼容性强而受到广泛青睐。特别是搞机器视觉的小伙伴们跟海康打交道肯定不在少数&#xff0c;笔者在平常项目中跟海康相关人…

深度学习|pytorch基本运算-乘除法和幂运算

【1】引言 前序学习进程中&#xff0c;已经对pytorch张量数据的生成和广播做了详细探究&#xff0c;文章链接为&#xff1a; 深度学习|pytorch基本运算-CSDN博客 深度学习|pytorch基本运算-广播失效-CSDN博客 上述探索的内容还止步于张量的加减法&#xff0c;在此基础上&am…

4.2.4 Spark SQL 数据写入模式

在本节实战中&#xff0c;我们详细探讨了Spark SQL中数据写入的四种模式&#xff1a;ErrorIfExists、Append、Overwrite和Ignore。通过具体案例&#xff0c;我们演示了如何使用mode()方法结合SaveMode枚举类来控制数据写入行为。我们首先读取了一个JSON文件生成DataFrame&#…

论文笔记: Urban Region Embedding via Multi-View Contrastive Prediction

AAAI 2024 1 INTRO 之前基于多视图的region embedding工作大多遵循相同的模式 单独的单视图表示多视图融合 但这种方法存在明显的局限性&#xff1a;忽略了不同视图之间的信息一致性 一个区域的多个视图所携带的信息是高度相关的&#xff0c;因此它们的表示应该是一致的如果能…

初学者如何微调大模型?从0到1详解

本文将手把手带你从0到1&#xff0c;详细解析初学者如何微调大模型&#xff0c;让你也能驾驭这些强大的AI工具。 1. 什么是大模型微调&#xff1f; 想象一下&#xff0c;预训练大模型就像一位博览群书但缺乏专业知识的通才。它掌握了海量的通用知识&#xff0c;但可能无法完美…

西瓜书第十一章——降维与度量学习

文章目录 降维与度量学习k近邻学习原理头歌实战-numpy实现KNNsklearn实现KNN 降维——多维缩放&#xff08;Multidimensional Scaling, MDS&#xff0c;MDS&#xff09;提出背景与原理重述1.**提出背景**2.**数学建模与原理推导**3.**关键推导步骤** Principal Component Analy…

Portainer安装指南:多节点监控的docker管理面板-家庭云计算专家

背景 Portainer 是一个轻量级且功能强大的容器管理面板&#xff0c;专为 Docker 和 Kubernetes 环境设计。它通过直观的 Web 界面简化了容器的部署、管理和监控&#xff0c;即使是非技术用户也能轻松上手。Portainer 支持多节点管理&#xff0c;允许用户从一个中央控制台管理多…

vscode实用配置

前端开发安装插件&#xff1a; 1.可以更好看的显示文件图标 2.用户快速打开文件 使用步骤&#xff1a;在html文件下右键点击 open with live server 即可 刷力扣&#xff1a; 安装这个插件 还需要安装node.js即可

React 项目中封装 Excel 导入导出组件:技术分享与实践

文章目录 前言一、为什么需要封装 Excel 组件&#xff1f;二、技术选型三、核心实现1. 安装依赖2. 封装Excel导出3. 封装导入组件 &#xff08;UploadExcel&#xff09; 总结 前言 在 React 项目中&#xff0c;处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数…

【2025CCF中国开源大会】RISC-V 开源生态的挑战与机遇分论坛重磅来袭!共探开源芯片未来

点击蓝字 关注我们 CCF Opensource Development Committee 开源浪潮正从软件席卷硬件领域&#xff0c;RISC-V作为全球瞩目的开源芯片架构&#xff0c;正在重塑计算生态的版图&#xff01;相较于成熟的x86与ARM&#xff0c;RISC-V生态虽处爆发初期&#xff0c;却蕴藏着无限可能。…