第一章 初识 LVGL
1.1 认识 LVGL
LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。
1.2 主要特性
- 丰富且强大的模块化图形组件:按钮 (buttons)、图表 (charts)、列表 (lists)、滑动条 (sliders)、图片 (images) 等
- 高级的图形引擎:动画、抗锯齿、透明度、平滑滚动、图层混合等效果
- 支持多种输入设备:触摸屏、 键盘、编码器、按键等
- 支持多显示设备
- 不依赖特定的硬件平台,可以在任何显示屏上运行
- 配置可裁剪(最低资源占用:64 kB Flash,16 kB RAM)
- 基于UTF-8的多语种支持,例如中文、日文、韩文、阿拉伯文等
- 可以通过类CSS的方式来设计、布局图形界面(例如:Flexbox、Grid)
- 支持操作系统、外置内存、以及硬件加速(LVGL已内建支持STM32 DMA2D、NXP PXP和VGLite)
- 即便仅有单缓冲区(frame buffer)的情况下,也可保证渲染如丝般顺滑
- 全部由C编写完成,并支持C++调用
- 支持Micropython编程,参见:LVGL API in Micropython
- 支持模拟器仿真,可以无硬件依托进行开发
- 丰富详实的例程
- 详尽的文档以及API参考手册,可线上查阅或可下载为PDF格式
- 在 MIT 许可下免费和开源
综上可知: LVGL 是一款具有丰富部件, 具备高级图形特性,支持多种输入设备和多国语言, 独立于硬件之外的开源图形库。 LVGL 官方地址为: https://lvgl.io/, 该网页主要包含用户文档、 图片转换器和字体转换器,该网页打开后如图 2.1.1 所示:
1.3 LVGL 配置要求
市面上拥有众多的微处理器(MCU) , 但并不是每一个 MCU 都适合移植 LVGL 图形库,例如传统的 51 单片机,它并不具备移植 LVGL 图形库的条件。 下面我们来看看 LVGL 对硬件的要求。
- MCU
LVGL 图形库对微处理器具有一定的要求, 例如主频、内存等, 具体要求如下表所示:
要求 | 说明 |
---|---|
微控制器 | 16、 32 、 64 位的微控制器或处理器 |
主控频率(Hz) | > 16 MHz 时钟速度 |
Flash/ROM | > 64 kB ,如果使用非常多的部件, 推荐 > 180 kB |
内存(RAM) | 8kB(建议配置 24kB) |
动态数据(堆) | > 2 KB (> 如果使用多个对象,建议使用 16 kB). 在 lv_conf.h 文件中配置 LV_MEM_SIZE 生效 |
显示缓冲区 | > “水平分辨率”像素(推荐 >10 × 10ד 水平分辨率”) |
从上表可知: 微处理器至少需要 16 位以上, 所以传统的 51、 52 单片机无法移植 LVGL,它们都是 8 位的微处理器。
- 显示屏
LVGL 只需要一个简单的驱动程序函数即可将像素阵列复制到显示器的给定区域中, 其对显示屏的兼容性很强,具体要求如下(满足其一即可) :
① 具有 8/16 /24/ 32 位色深的显示屏。
② HDMI 端口的显示器。
③ 小型单色显示器。
④ LED 矩阵。
⑤ 其他可以控制像素颜色/状态的显示器。
1.4 LVGL 数据流概述
您将 LVGL 添加到您的项目中,为其提供 inputs 和像素流向显示面板的方法,连接 Tick 接口,以便 LVGL 可以判断现在几点,定期调用 Timer Handler,为 LVGL 来渲染交互式 UI,让 LVGL 完成其余工作。Timer Handler 函数驱动 LVGL 的定时器,而 LVGL 的定时器又会执行 周期性任务数:
- 刷新显示器,
- 读取输入设备、
- 根据用户输入(和其他内容)触发事件,
- 运行任何动画,以及
- 运行用户创建的计时器。
初始化之后,应用程序的任务仅仅是在需要时创建Widget树,管理这些Widget生成的事件(通过用户交互和类似的方式),并在不再需要它们时删除它们。剩下的事由LVGL负责。
1.5 LVGL 源码下载
LVGL 相关的源码和工程都是存放在 GitHub 远程仓库中,该 GitHub 远程仓库地址为https://github.com/lvgl/lvgl/, 用户可以该仓库中下载 LVGL 图形库的源码。
- 您可以从下面的列表获取到lvgl所有相关的代码仓库:
- lvgl:本身有很多 例子 和 演示示例。
- lv_drivers: 显示和输入设备驱动程序。
- 博客: 博客站点的来源。
- sim: 在线模拟器网站的来源。
- lv_port_*: LVGL到端口或开发板。
- lv_binding_*: 绑定到其他语言。
- lvgl文件结构说明
由上图可知, LVGL 源码的目录下有很多文件和文件夹, 但用户并不需要完全了解它们,我们只需要了解与移植相关的部分即可。 各文件夹和文件的功能如下表所示:
文件 | 说明 |
---|---|
demos | LVGL 提供的综合演示源码 |
docs | LVGL 文献,主要说明 LVGL 每个部件的使用方法 |
env_support | 环境的支持(MDK、 ESP、 RTThread、Zephyr) |
examples | LVGL 例程源码和 LVGL 输入设备驱动,显示屏驱动文件 |
scripts | LVGL 手稿(与 MicroPython 有关) |
src | LVGL 源文件(LVGL 部件源码、第三方库) |
tests | 官方人员的测试代码, 该文件夹用户无需了解 |
lv_conf_template.h | LVGL 的剪裁文件 |
lvgl.h | LVGL 包含的头文件 |
上表中, 与 LVGL 移植相关的有 examples 文件夹、 src 文件夹、 lv_conf_template.h 和 lvgl.h文件,其他的部分均与移植无关,用户可以选择忽略。 接下来我们分别看一下 examples、 src这两个文件夹的文件结构:
- examples 文件夹
该文件夹主要包含 LVGL部件实例、动画实例、其他第三方库实例以及输入设备和显示器
驱动文件等内容, 具体如下表所示:
文件 | 描述 |
---|---|
anim | LVGL 动画例程实例 |
arduino | 开源电子平台 |
assets | 图片资源 |
event | LVGL 事件机制实例 |
get_started | LVGL 获取状态实例 |
layouts | LVGL 布局实例 |
libs | LVGL 移植第三方库实例 |
others | LVGL 其他测试 |
porting | LVGL 输入设备驱动、 文件系统驱动以及显示器驱动 |
scroll | LVGL 滚动实例 |
styles | LVGL 对象样式实例 |
widgets | LVGL 部件实例 |
上表中,只有 porting 文件夹与移植相关,其他文件夹中存放的是各种实例。
- src 文件夹
该文件夹主要包含 LVGL 源文件(部件源码、 多种解码库) , 具体如下表所示:
文件 | 描述 |
---|---|
core | LVGL 核心源码(事件、组、对象、坐标、样式、主题) |
draw | LVGL 绘画驱动(图片、 解码、 DMA2D、圆、线、圆弧、和文本) |
extra | LVGL 的拓展内容(布局、第三方库、其他测试、主题以及部件) |
font | LVGL 字库 |
gpu | LVGL 针对图形加速 |
hal | 硬件抽象层(显示驱动程序、输入设备程序以及 LVGL 系统滴答) |
misc | 主要描述 LVGL 其他定义(动画、内存管理、 日志) |
widgets | LVGL 基础部件 |
上表中的内容都是与移植相关的, 具体的移植方法我们后面将详细介绍,目前大家只需要对 LVGL 源码的文件结构有一定了解即可。
注: