试用 LVGL Pro,一套完整的工具包,助您高效构建、测试、分享和交付 UI!
LVGL
教程

使用 Linux 帧缓冲和 LVGL 创建嵌入式图形界面

学习如何在 Linux 系统上使用帧缓冲设备配合 LVGL 创建简单、快速且可移植的嵌入式图形界面。

加博尔·基什-瓦莫希加博尔·基什-瓦莫希8 分钟阅读

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,可以尝试使用终端:

  1. Ctrl + Alt + F1 离开桌面并切换到简单的字符终端
  2. 输入 sudo su 并输入密码
  3. 停止显示管理器(在 Ubuntu 上是 lightdm):service lightdm stop 重要提示:这将使你注销,因此所有窗口都将关闭
  4. 将随机数据写入帧缓冲设备:cat /dev/urandom > /dev/fb0 你应该在整个屏幕上看到随机彩色像素。
  5. 要返回正常的图形用户界面:service lightdm start
从 urandom 在屏幕上显示的随机像素
使用随机数据测试帧缓冲设备

它也应该可以在基于 Linux 的单板计算机上运行,例如:

获取 LVGL 来创建嵌入式图形界面#

现在你知道如何更改显示器上的像素了。但你仍然需要能够创建 GUI 元素而不是随机像素的东西。这就是 LVGL 的用武之地。这个软件库旨在在嵌入式系统的显示器上创建 GUI 元素(如标签、按钮、图表、滑块、复选框等)。在这里查看所有控件。图形库是用 C 语言编写的,因此你肯定可以在项目中采用它。为了使图形界面更具吸引力,可以添加不透明度、平滑动画、抗锯齿和阴影。

要使用 LVGL,你需要从 GitHub 克隆它或从开发者页面获取。 需要以下组件:

  • lvgl - 图形库的核心
  • lv_drivers - 包含 Linux 帧缓冲驱动程序
  • lv_examples - 可选,用于加载演示应用程序进行测试

GUI 项目设置#

最简单的情况是在 Linux PC 上测试基于帧缓冲设备的 GUI。稍后你也可以将相同的代码应用到嵌入式设备上。

  1. 在你喜欢的 IDE 中创建一个新项目

  2. 将模板配置文件复制到 lvgllv_drivers 文件夹旁边:

    • lvgl/lv_conf_templ.h 复制为 lv_conf.h
    • lv_drivers/lv_drv_conf_templ.h 复制为 lv_drv_conf.h
  3. 在配置文件中删除第一个和最后一个 #if#endif 以启用其内容。

带有 LVGL 配置文件的项目文件结构
LVGL 帧缓冲项目所需的文件
  1. lv_drv_conf.h 中设置 USE_FBDEV 1
  2. lv_conf.h 中更改色深:LV_COLOR_DEPTH 32
  3. 将项目根文件夹添加为包含路径

创建嵌入式 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

使用 LVGL 帧缓冲显示的 Hello world 标签
在帧缓冲上运行的 Hello world 测试应用程序

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

在 Linux 帧缓冲上运行的 LVGL 演示应用程序
在帧缓冲设备上运行的完整 LVGL 演示

下载即用型项目#

lv_port_linux_frame_buffer 仓库中,你可以找到一个 Eclipse CDT 项目,用于在 Linux PC 上尝试基于纯帧缓冲的 GUI。

还有一个 Makefile,可以在没有 IDE 的情况下在嵌入式硬件上编译项目。

其他注意事项#

隐藏光标#

可能会出现在屏幕上看到闪烁光标的情况。隐藏它的方法取决于平台,但作为示例,以下是在 Raspberry 上执行此操作的方法:

  1. 编辑 /boot/cmdline.txt 文件
  2. 添加 vt.global_cursor_default=0

总结#

我希望你喜欢这个教程,并发现它对你的基于微处理器的嵌入式 Linux 项目有用。正如你所看到的,使用 LVGL 仅使用纯 Linux 帧缓冲创建嵌入式 GUI 是非常简单的。

要了解更多关于图形库的信息,请开始阅读文档

如果你现在还没有嵌入式硬件,可以在 PC 上开始 GUI 开发

如果你有问题,请使用 GitHub issue 跟踪器

关于作者

加博尔·基什-瓦莫希
加博尔·基什-瓦莫希

LVGL 创始人

LVGL 的创始人和首席开发者,这是一个被全球数百万设备使用的开源嵌入式图形库。

认识博客背后的作者们

了解那些分享 LVGL 知识的优秀作者们

查看作者

订阅我们的通讯 不错过任何关于 LVGL 的新闻。我们每月最多发送 2 封邮件。

LVGL

LVGL 是最受欢迎的免费开源嵌入式图形库,支持任何 MCU、MPU 和显示类型,助您构建精美的用户界面。

我们还提供 UI 设计、实现和咨询等服务。

© 2026 LVGL。保留所有权利。
YouTubeGitHubLinkedIn