LVGL | LVGL简介之中文文档

介绍

LVGL(Light and Versatile Graphics Library)是一个免费的开源图形库,提供您创建具有易于使用的图形元素、漂亮的视觉效果和低内存占用的嵌入式 GUI 所需的一切。

主要特征

  • 强大的构建块,如按钮、图表、列表、滑块、图像等。

  • 具有动画、抗锯齿、不透明度、平滑滚动的高级图形

  • 各种输入设备,如触摸板、鼠标、键盘、编码器等。

  • 多语言支持 UTF-8 编码

  • 多显示器支持,即同时使用更多TFT、单色显示器

  • 完全可定制的图形元素

  • 独立于任何微控制器或显示器的硬件

  • 可扩展以使用很少的内存(64 kB 闪存、16 kB RAM)

  • 支持但不是必需的操作系统、外部存储器和 GPU

  • 即使具有高级图形效果的单帧缓冲区操作

  • 用 C 编写以获得最大的兼容性(C++ 兼容)

  • 在没有嵌入式硬件的 PC 上启动嵌入式 GUI 设计的模拟器

  • 绑定到 MicroPython

  • 快速 GUI 设计的教程、示例、主题

  • 文档可在线和离线使用

  • 在 MIT 许可下免费和开源

要求

基本上,每个现代控制器(能够驱动显示器)都适合运行 LVGL。最低要求是:

  • 16、32 或 64 位微控制器或处理器
  • > 建议使用 16 MHz 时钟速度
  • Flash/ROM:> 64 kB 用于非常重要的组件(推荐> 180 kB)
  • 内存:
    • 静态 RAM 使用量:~2 kB,取决于使用的功能和对象类型
    • 堆栈:> 2kB(推荐> 8 kB)
    • 动态数据(堆):> 2 KB(如果使用多个对象,建议使用> 16 kB)。由lv_conf.h中的LV_MEM_SIZE设置。
    • 显示缓冲区:> “水平分辨率”像素(推荐>10× “水平分辨率”
    • MCU 或外部显示控制器中的一个帧缓冲器
  • C99 或更新的编译器
  • 基本的 C(或 C++)知识: 指针、 结构、 回调
请注意,内存使用量可能因架构、编译器和构建选项而异。

执照

LVGL 项目(包括所有存储库)在MIT许可下获得许可。这意味着您甚至可以在商业项目中使用它。

这不是强制性的,但如果您在论坛的“我的项目”类别中写下关于您的项目的几句话或来自lvgl.io的私人消息,我们非常感谢。

尽管您可以免费获得 LVGL,但它背后的工作量很大。它由一群志愿者创建,他们在空闲时间为您提供。

为了使 LVGL 项目可持续,请考虑为该项目做贡献。您可以从多种贡献方式中进行选择,例如简单地写一条关于您正在使用 LVGL 的推文、修复错误、翻译文档,甚至成为维护者。

存储库布局

LVGL 项目的所有存储库都托管在 GitHub:https://github.com/lvgl

您在那里填充这些存储库:

LVGL,   lv_exampleslv_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 周。每个月的第一个和第三个星期二:

  1. master分支创建主要、次要或错误修复版本(基于新功能)

  2. master 合并为 release/vX

  3. 发布后立即dev合并到master

  4. 在接下来的 2 周内,master可以测试新功能

  5. 错误修复直接合并到 master

  6. 2 周后从第一点重新开始

标签

vX.Y.Z为每个版本创建类似标签。

变更日志

更改记录在CHANGELOG.md 中

副业

文档重建上每一个版本。默认情况下,latest会显示当前masterlvgl 分支的文档。早期版本的文档可从左侧的菜单中获得。

模拟器、移植和其他项目会尽最大努力进行更新。如果您更新其中之一,欢迎请求请求。

版本支持

在核心存储库中,每个主要版本都有一个分支(例如release/v6)。该主要版本的所有次要版本和补丁版本都合并在那里。

可以在不打扰新版本的情况下添加固定的旧版本。

所有主要版本都得到官方支持 1 年。

常问问题

我可以在哪里提问?

可以在论坛提问:https : //forum.lvgl.io/

我们使用GitHub 问题进行开发相关讨论。因此,仅当您的问题或问题与库的开发密切相关时,才应使用它们。

是否支持我的 MCU/硬件?

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)

Tick任务处理程序部分了解更多信息。

为什么显示驱动程序只调用一次?仅刷新显示的上部。

确保您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_DEPTHlv_conf.h

如果您在 SPI(或其他面向字节的接口)中使用 16 位颜色,您可能需要在lv_conf.h 中进行设置。它交换像素的高字节和低字节。LV_COLOR_16_SWAP  1

如何加速我的用户界面?

  • 如果您的 MCU 有,请打开编译器优化并启用缓存

  • 增加显示缓冲区的大小

  • 使用 2 个显示缓冲区并在后台使用 DMA(或类似外围设备)刷新缓冲区

  • 如果您使用 SPI 或并行端口来驱动显示器,请提高它们的时钟速度

  • 如果您的显示器具有 SPI 端口,请考虑更改为并行模型,因为它具有更高的吞吐量

  • 将显示缓冲区保留在内部 RAM(而不是外部 SRAM)中,因为 LVGL 经常使用它,并且访问时间应该很短

如何减少闪存/ROM的使用?

您可以在lv_conf.h 中禁用所有未使用的功能(例如动画、文件系统、GPU 等)和对象类型。

如果您使用的是 GCC,您可以添加

  • -fdata-sections -ffunction-sections 编译器标志

  • --gc-sections 链接器标志

从最终二进制文件中删除未使用的函数和变量

如何减少内存使用

  • 降低显示缓冲区的大小

  • 减少LV_MEM_SIZElv_conf.h。创建按钮、标签等对象时使用的内存。

  • 要使用lower,LV_MEM_SIZE您可以仅在需要时创建对象,并在不再需要时将其删除

如何使用操作系统?

要使用任务可以相互中断(抢占式)的操作系统,您应该使用互斥锁保护与 LVGL 相关的函数调用。请参阅操作系统和中断部分以了解更多信息。

上一篇:Long-Tailed Classification by Keeping the Good and Removing the Bad Momentum Causal Effect个人理解


下一篇:C#中的PLINQ(并行LINQ)