目录
LVGL(Light and Versatile Graphics Library)是一个免费的开源图形库,提供您创建具有易于使用的图形元素、漂亮的视觉效果和低内存占用的嵌入式 GUI 所需的一切。
强大的构建块,如按钮、图表、列表、滑块、图像等。
具有动画、抗锯齿、不透明度、平滑滚动的高级图形
各种输入设备,如触摸板、鼠标、键盘、编码器等。
多语言支持 UTF-8 编码
多显示器支持,即同时使用更多TFT、单色显示器
完全可定制的图形元素
独立于任何微控制器或显示器的硬件
可扩展以使用很少的内存(64 kB 闪存、16 kB RAM)
支持但不是必需的操作系统、外部存储器和 GPU
即使具有高级图形效果的单帧缓冲区操作
用 C 编写以获得最大的兼容性(C++ 兼容)
在没有嵌入式硬件的 PC 上启动嵌入式 GUI 设计的模拟器
绑定到 MicroPython
快速 GUI 设计的教程、示例、主题
文档可在线和离线使用
在 MIT 许可下免费和开源
基本上,每个现代控制器(能够驱动显示器)都适合运行 LVGL。最低要求是:
LVGL 项目(包括所有存储库)在MIT许可下获得许可。这意味着您甚至可以在商业项目中使用它。
这不是强制性的,但如果您在论坛的“我的项目”类别中写下关于您的项目的几句话或来自lvgl.io的私人消息,我们非常感谢。
尽管您可以免费获得 LVGL,但它背后的工作量很大。它由一群志愿者创建,他们在空闲时间为您提供。
为了使 LVGL 项目可持续,请考虑为该项目做贡献。您可以从多种贡献方式中进行选择,例如简单地写一条关于您正在使用 LVGL 的推文、修复错误、翻译文档,甚至成为维护者。
LVGL 项目的所有存储库都托管在 GitHub:https://github.com/lvgl
您在那里填充这些存储库:
lvgl库本身
lv_examples示例和演示
lv_drivers显示和输入设备驱动程序
docs文档站点的来源 (https://docs.lvgl.io)
blog博客站点的来源 (https://blog.lvgl.io)
sim在线模拟器网站的来源 (https://sim.lvgl.io)
lv_sim_...各种IDE和平台的模拟器项目
lv_port_... LVGL 端口到开发板
lv_binding_..绑定到其他语言
lv_... 移植到其他平台
该LVGL, lv_examples和lv_drivers是核心的版本库,获取关于维护最关注。
核心存储库遵循语义版本控制规则:
不兼容 API 更改的主要版本。例如 v5.0.0、v6.0.0
新的但向后兼容的功能的次要版本。例如 v6.1.0、v6.2.0
用于向后兼容错误修复的补丁版本。例如 v6.1.1、v6.1.2
核心存储库至少有以下分支:
master
最新版本,补丁直接在这里合并。
dev
在此处合并新功能,直到它们合并到master
.
release/vX
主要版本的稳定版本
LVGL 的发布周期为 2 周。每个月的第一个和第三个星期二:
从master
分支创建主要、次要或错误修复版本(基于新功能)
master
合并为 release/vX
发布后立即dev
合并到master
在接下来的 2 周内,master
可以测试新功能
错误修复直接合并到 master
2 周后从第一点重新开始
更改记录在CHANGELOG.md 中。
该文档重建上每一个版本。默认情况下,latest
会显示当前master
lvgl 分支的文档。早期版本的文档可从左侧的菜单中获得。
模拟器、移植和其他项目会尽最大努力进行更新。如果您更新其中之一,欢迎请求请求。
在核心存储库中,每个主要版本都有一个分支(例如release/v6
)。该主要版本的所有次要版本和补丁版本都合并在那里。
可以在不打扰新版本的情况下添加固定的旧版本。
所有主要版本都得到官方支持 1 年。
LLVGL 支持每个能够通过并行端口、SPI、RGB 接口或其他任何方式驱动显示器并满足要求的 MCU。
这包括:
“常见” MCU,如 STM32F、STM32H、NXP Kinetis、LPC、IMX、dsPIC33、PIC32 等。
蓝牙、GSM、WiFi 模块,如 Nordic NRF 和 Espressif ESP32
Linux 帧缓冲区,如 /dev/fb0,其中也包括单板计算机,如 Raspberry Pi
以及任何其他具有足够强大 MCU 和外围设备来驱动显示器的设备
LVGL 只需要一个简单的驱动程序函数即可将像素阵列复制到显示器的给定区域。如果您可以对显示器执行此操作,那么您可以将该显示器与 LVGL 一起使用。
支持的显示类型的一些示例:
具有 16 位或 24 位色深的 TFT
带 HDMI 端口的显示器
小型单色显示器
灰度显示
甚至 LED 矩阵
或任何其他可以控制像素颜色/状态的显示器
请参阅移植部分以了解更多信息。
确保您lv_tick_inc(x)
在中断和lv_task_handler()
main中调用while(1)
。
确保您lv_disp_flush_ready(drv)
在“显示刷新回调”结束时调用。
您的显示驱动程序中可能存在错误。在不使用 LVGL 的情况下尝试以下代码。你应该看到一个带有红蓝渐变的正方形
#define BUF_W 20
#define BUF_H 10
lv_color_t buf[BUF_W * BUF_H];
lv_color_t * buf_p = buf;
uint16_t x, y;
for(y = 0; y < BUF_H; y++) {
lv_color_t c = lv_color_mix(LV_COLOR_BLUE, LV_COLOR_RED, (y * 255) / BUF_H);
for(x = 0; x < BUF_W; x++){
(*buf_p) = c;
buf_p++;
}
}
lv_area_t a;
a.x1 = 10;
a.y1 = 40;
a.x2 = a.x1 + BUF_W - 1;
a.y2 = a.y1 + BUF_H - 1;
my_flush_cb(NULL, &a, buf);
可能 LVGL 的颜色格式与您的显示器颜色格式不兼容。检查LV_COLOR_DEPTH
中lv_conf.h。
如果您在 SPI(或其他面向字节的接口)中使用 16 位颜色,您可能需要在lv_conf.h 中进行设置。它交换像素的高字节和低字节。LV_COLOR_16_SWAP 1
如果您的 MCU 有,请打开编译器优化并启用缓存
增加显示缓冲区的大小
使用 2 个显示缓冲区并在后台使用 DMA(或类似外围设备)刷新缓冲区
如果您使用 SPI 或并行端口来驱动显示器,请提高它们的时钟速度
如果您的显示器具有 SPI 端口,请考虑更改为并行模型,因为它具有更高的吞吐量
将显示缓冲区保留在内部 RAM(而不是外部 SRAM)中,因为 LVGL 经常使用它,并且访问时间应该很短
您可以在lv_conf.h 中禁用所有未使用的功能(例如动画、文件系统、GPU 等)和对象类型。
如果您使用的是 GCC,您可以添加
-fdata-sections -ffunction-sections
编译器标志
--gc-sections
链接器标志
从最终二进制文件中删除未使用的函数和变量
降低显示缓冲区的大小
减少LV_MEM_SIZE
在lv_conf.h。创建按钮、标签等对象时使用的内存。
要使用lower,LV_MEM_SIZE
您可以仅在需要时创建对象,并在不再需要时将其删除