项目(3) - LVGL 图形用户界面(GUI)库
LVGL
常见的端侧的 UI 开发框架
- Qt:支持 C++、Python,跨平台特性好,开源
- LVGL:基于 C 语言,适用于单片机 + 嵌入式设备,开源、免费
- Winform(C#)、MFC(C++)、WPF(C#)
LVGL 是一个多用于嵌入式的图形界面开发库
动态库与静态库:
- 优势:快速完成代码编译及开发;可在看不到源代码的情况下使用库文件
- 静态库(
lib库名.a
):
- 编译时加载到程序中
- 会使代码体积增大
- 每个程序独有一份,删除静态库不影响程序运行
- 动态库(
lib库名.so
):
- 运行时加载到程序中
- 不会使代码体积增大
- 可多个程序共用一份,删除动态库会导致程序无法执行
LVGL 的移植
- 移植触摸屏驱动代码:
- 修改并更新设备树
- 编译驱动并配置系统启动后自动加载
- 依赖 input 子系统生成
/dev/event1
节点(精度有限)- 移植 tslib 库(生成校准文件)以产生校准后的坐标
- 在 LVGL 中指定读取触摸屏坐标的节点,由 tslib 库自动校准后传递给 LVGL
- LVGL 支持按下、松开、滑动等事件
- 在 LVGL 中指定 LCD 屏幕显示节点,LVGL 基于 framebuffer 技术将显示数据写入显存完成界面显示
- 移植需完成的工作:
- LCD 驱动:静态编译到 zImage 中
- 触摸屏驱动:动态编译为
gt9147.ko
文件,需配置开机自启动(通过insmod
加载到系统)- 移植 tslib 库
- 适配 LVGL 代码
- 编写 LVGL 代码(设计 UI 界面)
- 编译 LVGL 代码
- 将编译后的程序放入开发板中执行
LVGL 的界面开发
一、LVGL
LVGL9.4文档:
https://docs.lvgl.io/master/intro/getting_started/
LVGL(全称 Light and Versatile Graphics Library,意为 “轻量且通用的图形库”)是一款开源的嵌入式图形用户界面(GUI)库,主要用于为资源受限的嵌入式设备(如微控制器、嵌入式系统)构建美观、交互丰富的图形界面。
1.核心特点:
-
轻量级与高效性设计上针对嵌入式场景优化,内存占用低(最低仅需数十 KB RAM 和 Flash),可在性能有限的硬件(如 STM32、ESP32 等单片机)上流畅运行。
-
跨平台兼容性不依赖特定硬件,支持多种处理器架构(ARM、RISC-V、x86 等)和操作系统(FreeRTOS、Linux、裸机系统等),也可在 PC 端通过模拟器开发。
-
丰富的 UI 组件内置大量现成的界面元素,如按钮、滑块、图表、列表、进度条、菜单等,且支持自定义样式(颜色、字体、动画等),便于快速搭建个性化界面。
-
强大的交互能力支持触摸、按键、鼠标等多种输入设备,提供平滑的动画效果(过渡、缩放、旋转等),提升用户体验。
-
开源与活跃社区基于 MIT 许可证开源,可免费商用;社区活跃,文档完善,开发者可获取丰富的示例和技术支持。
2.适用场景:
LVGL 广泛应用于需要图形界面的嵌入式设备,例如:
- 智能手表、手环等可穿戴设备
- 家电控制面板(如洗衣机、冰箱)
- 车载系统、导航设备
- 工业控制终端、医疗设备
- 物联网(IoT)设备的本地交互界面
3. 与framebuffer关系
framebuffer作为LVGL的底层基础,二者有紧密的关系
framebuffer:是Linux系统提供的一块内存区域,直接对应屏幕像素。它提供了画点、画线等最基础的绘图能力,相当于一张“画布”
LVGL:是一个高级的图形库,建立在framebuffer(或其他显示驱动)上,提供按钮、标签、滑块等现成的UI组件和动画效果,通过调用framebuffer接口将图像显示到屏幕上
二、LVGL移植
可在此查看相关步骤
解压LVGL-V8_3.tar
LVGL框架 用于移植的模板
lvgl库的核心 图形库的核心代码 (控件)
相关驱动
1、 相关函数
1. main.c
2. lv_init
3. fbdev_init
3. 修改参数
接口选择:800 * 480 色深:RGB888
打开二维码:
4. 快捷操作
ctrl + f 查找
ctrl+d 复制光标所在行插入到下一行
ctrl+p 通过文件名查找
ctrl+g 跳转到指定行
2、修改makefile
编译 j8 ----并行编译 速度快
三、makefile代码功能说明
这个 Makefile 是一个用于交叉编译 LVGL 图形库应用程序的构建脚本,主要针对 ARM 架构的嵌入式系统。下面分部分解析其功能和各参数的作用:
一、基础变量定义(工具链与路径配置)
CC = arm-linux-gnueabihf-gcc # 指定交叉编译器:用于在x86主机编译ARM架构的程序
LVGL_DIR_NAME ?= lvgl # LVGL库的目录名(默认lvgl)
LVGL_DIR ?= ${shell pwd} # LVGL库的根路径(默认当前目录,可通过外部传入覆盖)
CFLAGS ?= -O3 -g0 -I$(LVGL_DIR)/ -std=gnu99 # 编译选项
LDFLAGS ?= -lm -lpthread # 链接选项
BIN = demo # 最终生成的可执行文件名
CC
:指定交叉编译器为arm-linux-gnueabihf-gcc
,说明目标平台是 ARM 架构的嵌入式系统(而非 x86 主机)。LVGL_DIR
:定义 LVGL 库的根目录,默认是当前目录(${shell pwd}
获取当前路径),方便后续引用 LVGL 的头文件和源文件。CFLAGS
:编译参数详解:-O3
:最高级别的代码优化(加速程序运行,减小体积)。-g0
:关闭调试信息(减少可执行文件大小,发布时常用)。-I$(LVGL_DIR)/
:添加 LVGL 库的头文件搜索路径(确保编译器能找到lvgl.h
等头文件)。-std=gnu99
:使用 GNU C99 标准编译(兼容 C99 语法)。- 注释中的大量
-W
选项是编译警告开关(目前被注释,未启用),启用后可检测代码潜在问题。
LDFLAGS
:链接参数:-lm
:链接数学库(libm
,LVGL 可能用到数学运算)。-lpthread
:链接线程库(libpthread
,支持多线程,LVGL 的部分功能依赖线程)。
二、源文件与依赖配置
MAINSRC = ./main.c # 主程序源文件(用户编写的应用入口)# 包含LVGL库和驱动的Makefile(核心依赖)
include $(LVGL_DIR)/lvgl/lvgl.mk
include $(LVGL_DIR)/lv_drivers/lv_drivers.mkCSRCS += $(LVGL_DIR)/mouse_cursor_icon.c # 额外添加的C源文件(鼠标光标图标)
MAINSRC
:指定用户编写的主程序文件(main.c
,包含main
函数,是程序入口)。include
指令:引入 LVGL 库自带的lvgl.mk
和lv_drivers.mk
,这两个文件是 LVGL 官方提供的,内部定义了 LVGL 核心库和驱动(如显示驱动、输入驱动)的源文件列表、编译规则等,避免用户手动列举所有 LVGL 源文件。CSRCS
:汇总所有 C 源文件(包括 LVGL 库的源文件和用户添加的mouse_cursor_icon.c
,后者是鼠标光标的图标资源)。
三、目标文件与编译规则
OBJEXT ?= .o # 目标文件扩展名(默认.o)# 生成目标文件列表(将源文件后缀替换为.o)
AOBJS = $(ASRCS:.S=$(OBJEXT)) # 汇编源文件对应的目标文件
COBJS = $(CSRCS:.c=$(OBJEXT)) # C源文件对应的目标文件
MAINOBJ = $(MAINSRC:.c=$(OBJEXT)) # 主程序对应的目标文件SRCS = $(ASRCS) $(CSRCS) $(MAINSRC) # 所有源文件汇总
OBJS = $(AOBJS) $(COBJS) $(MAINOBJ) # 所有目标文件汇总
- 这部分通过变量替换,将所有源文件(
.c
、.S
)转换为对应的目标文件(.o
),方便后续批量编译。
四、核心编译与链接规则
# 编译规则:将.c文件编译为.o目标文件
%.o: %.c@$(CC) $(CFLAGS) -c $< -o $@ # 执行编译:$<是源文件,$@是目标文件@echo "CC $<" # 打印编译信息(如"CC main.c")# 默认目标:编译并链接生成可执行文件
default: $(AOBJS) $(COBJS) $(MAINOBJ)$(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS) # 链接所有目标文件# 清理规则:删除生成的文件
clean: rm -f $(BIN) $(AOBJS) $(COBJS) $(MAINOBJ) # 删除可执行文件和所有目标文件
%.o: %.c
:通用编译规则,对所有.c
文件生效,将其编译为.o
目标文件(使用CC
和CFLAGS
参数)。default
:默认执行的目标,依赖所有目标文件,执行时会将所有.o
文件链接成最终的可执行文件demo
(使用LDFLAGS
指定链接选项)。clean
:清理目标,用于删除编译生成的可执行文件和目标文件,方便重新编译。
总结
这个 Makefile 的核心作用是:通过交叉编译器,将用户的 LVGL 应用程序(main.c
)与 LVGL 库、驱动代码一起编译链接,生成可在 ARM 嵌入式设备上运行的 GUI 程序(demo
)。
使用时,只需在终端执行make
即可编译,执行make clean
可清理编译产物。如果需要修改 LVGL 路径或编译选项,可通过外部传入变量(如make LVGL_DIR=/path/to/lvgl
)覆盖默认配置。
四、相关操作
1、屏幕上显示字
ctrl + P 查找文件
./demo 运行
实现功能: 屏幕上可显示 hello aaaaaaaaaaaaaaaa
2、电容触摸屏GT9147
1、修改设备树
2、修改
insmod touch.ko
3、触摸屏上显示点击次数
跳转到----
驱动资料包_zhao 里面有详细步骤
3、Gui Guider人机交互界面设计
“GUI” 是 Graphical User Interface(图形用户界面) 的缩写,指通过图形(窗口、按钮、图标等)而非纯文字命令与计算机交互的界面(比如手机 App、电脑桌面都属于 GUI)。
Gui Guider-1.6.1-GA
NXP GUI Guider—— 恩智浦开发的一款嵌入式系统 GUI 开发工具。它基于开源 LVGL 图形库,提供 “拖放式可视化设计” 功能,能帮开发者快速为智能手表、工业设备等嵌入式产品设计人机交互界面,支持 Windows/Linux/macOS 多平台,还能无缝集成到 QNX 实时操作系统中。
1. 新建画布
1. 版本选择
v8.3.5
2. 开发板
simulator模拟器
3. 模板选择
emptyUI空
4. 配置信息
2、图形设计
背景 - 文字 - 图表 - 图片 - 二维码 - 按钮
1. window寻找字体
C盘 - Windows - Fonts
2. 选择字体复制到工程目录下
工程目录下import - font
3. 导入字体
资源管理 - 字体 - 导入字体
4. 添加文字时选择字体
3、代码修改
1.导出
2.将文件拷贝到 mylvgl 的同级目录下
3. 将 main.c 代码中相关部分添加到 mylvgl 的 main.c 中
添加头文件和全局变量