LVGL 是一个面向资源有限的微控制器的图形库。然而,它也可以用于在运行 Linux 操作系统的高端微处理器和开发板上创建嵌入式图形界面。最知名的处理器核心包括 ARM Cortex A9(例如 NXP i.MX6)和 ARM Cortex A53(例如 Raspberry PI 3)。你可以通过简单地使用 Linux 的帧缓冲设备(通常是 /dev/fb0)在这些单板计算机上创建嵌入式图形界面。如果你还不了解 LVGL,可以在这里了解更多信息:LVGL
为什么直接使用帧缓冲?#
帧缓冲设备是一个非常底层的接口,用于在屏幕上显示内容。 对于嵌入式图形界面来说,直接使用帧缓冲而不是窗口管理器有几个原因:
- 简单 - 只需将像素写入内存
- 快速 - 没有窗口管理器,这意味着启动快速且开销更少
- 可移植 - 独立于发行版,每个 Linux 系统都有帧缓冲设备,因此与所有发行版兼容
开始使用 Linux 帧缓冲#
也许你已经熟悉 Linux 帧缓冲设备。它是一个通常位于 /dev/fb0 的文件。此文件包含显示器的像素数据。如果你向帧缓冲文件写入内容,更改将显示在屏幕上。如果你在 PC 上使用 Linux,可以尝试使用终端:
- 按 Ctrl + Alt + F1 离开桌面并切换到简单的字符终端
- 输入
sudo su并输入密码 - 停止显示管理器(在 Ubuntu 上是 lightdm):
service lightdm stop重要提示:这将使你注销,因此所有窗口都将关闭 - 将随机数据写入帧缓冲设备:
cat /dev/urandom > /dev/fb0你应该在整个屏幕上看到随机彩色像素。 - 要返回正常的图形用户界面:
service lightdm start

它也应该可以在基于 Linux 的单板计算机上运行,例如:
获取 LVGL 来创建嵌入式图形界面#
现在你知道如何更改显示器上的像素了。但你仍然需要能够创建 GUI 元素而不是随机像素的东西。这就是 LVGL 的用武之地。这个软件库旨在在嵌入式系统的显示器上创建 GUI 元素(如标签、按钮、图表、滑块、复选框等)。在这里查看所有控件。图形库是用 C 语言编写的,因此你肯定可以在项目中采用它。为了使图形界面更具吸引力,可以添加不透明度、平滑动画、抗锯齿和阴影。
要使用 LVGL,你需要从 GitHub 克隆它或从开发者页面获取。 需要以下组件:
- lvgl - 图形库的核心
- lv_drivers - 包含 Linux 帧缓冲驱动程序
- lv_examples - 可选,用于加载演示应用程序进行测试
GUI 项目设置#
最简单的情况是在 Linux PC 上测试基于帧缓冲设备的 GUI。稍后你也可以将相同的代码应用到嵌入式设备上。
-
在你喜欢的 IDE 中创建一个新项目
-
将模板配置文件复制到 lvgl 和 lv_drivers 文件夹旁边:
- lvgl/lv_conf_templ.h 复制为 lv_conf.h
- lv_drivers/lv_drv_conf_templ.h 复制为 lv_drv_conf.h
-
在配置文件中删除第一个和最后一个 #if 和 #endif 以启用其内容。

- 在 lv_drv_conf.h 中设置 USE_FBDEV 1
- 在 lv_conf.h 中更改色深:LV_COLOR_DEPTH 32
- 将项目根文件夹添加为包含路径
创建嵌入式 GUI 应用程序#
在 main.c 中编写以下代码以创建一个 hello world 标签:
#include "lvgl/lvgl.h"
#include "lv_drivers/display/fbdev.h"
#include <unistd.h>
int main(void)
{
/*LVGL 初始化*/
lv_init();
/*Linux 帧缓冲设备初始化*/
fbdev_init();
/*为 LittlevGL 提供一个小缓冲区来绘制屏幕内容*/
static lv_color_t buf[DISP_BUF_SIZE];
/*初始化缓冲区的描述符*/
static lv_disp_draw_buf_t disp_buf;
lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE);
/*初始化并注册显示驱动程序*/
static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.draw_buf = &disp_buf;
disp_drv.flush_cb = fbdev_flush;
disp_drv.hor_res = 800;
disp_drv.ver_res = 480;
lv_disp_drv_register(&disp_drv);
/*创建一个 "Hello world!" 标签*/
lv_obj_t * label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "Hello world!");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
/*处理 LitlevGL 任务(无滴答模式)*/
while(1) {
lv_tick_inc(5);
lv_timer_handler();
usleep(5000);
}
return 0;
}c编译代码并返回字符终端模式(Ctrl + Alt + F1 和 service lightdm stop)。转到构建的可执行文件并输入:./file_name

通过将 Hello world 标签创建替换为 demo_create(); 来测试演示应用程序

下载即用型项目#
在 lv_port_linux_frame_buffer 仓库中,你可以找到一个 Eclipse CDT 项目,用于在 Linux PC 上尝试基于纯帧缓冲的 GUI。
还有一个 Makefile,可以在没有 IDE 的情况下在嵌入式硬件上编译项目。
其他注意事项#
隐藏光标#
可能会出现在屏幕上看到闪烁光标的情况。隐藏它的方法取决于平台,但作为示例,以下是在 Raspberry 上执行此操作的方法:
- 编辑
/boot/cmdline.txt文件 - 添加
vt.global_cursor_default=0
总结#
我希望你喜欢这个教程,并发现它对你的基于微处理器的嵌入式 Linux 项目有用。正如你所看到的,使用 LVGL 仅使用纯 Linux 帧缓冲创建嵌入式 GUI 是非常简单的。
要了解更多关于图形库的信息,请开始阅读文档。
如果你现在还没有嵌入式硬件,可以在 PC 上开始 GUI 开发。
如果你有问题,请使用 GitHub issue 跟踪器。
