Espressif 宣布他们在 ESP32 芯片上官方支持 LVGL。为基于 ESP32 的 IoT 设备添加 GUI 比以往任何时候都容易。我在 15 分钟内就让它运行起来了,所以真的值得一试!我将向您展示两种方法,包括一个我在 320x240 显示屏上使用 ESP32 实现 30 FPS 的项目。
以下是 Espressif 创建的一些示例:


还不了解 ESP32?#
ESP32 是 Espressif 开发的强大 SoC(片上系统)。使用此芯片构建的模块在 IoT 应用中极受欢迎,其中连接性和低功耗运行至关重要。此外,ESP32 提供双核 200 MHz 微控制器的高性能。模块通常配备外部闪存(通常为 4 MB),可以映射为程序内存。
关于连接性,模块配备完全认证的 Wi-Fi、BT 和 BLE 接口。
最流行的模块之一是 ESP32 WROOM,价格仅为 4 美元。
要开始,您应该购买带有 ESP32 模块的开发板。例如 ESP32-DevkitC。

您不需要任何额外的硬件,如编程器,因为 ESP32 可以使用简单的 Micro USB 电缆通过串口编程。
使用 ESP32 实现 GUI#
尽管 ESP32 芯片没有 RGB LCD 接口或并行端口来驱动显示屏,但它有快速的 SPI 端口。
ILI9341、ST7789 和 SSD1306 是三种实际具有 SPI 接口的显示控制器,您会发现许多配备它们的显示模块。
ESP32 可以期待什么图形性能?#
有两个主要因素决定图形性能:
- 渲染时间 - 绘制一帧(或其一部分)的时间。
- 刷新时间 - 将渲染图像传输到显示屏的时间。
渲染时间取决于微控制器的速度。GPU 可以加速它,但不幸的是,ESP32 没有 GPU。无论如何,200 MHz 的核心速度应该足以快速渲染出色的 GUI!
刷新时间取决于系统架构和微控制器的外设。在 ESP32 的情况下,您需要使用 SPI 将渲染的帧发送到显示控制器。
一些计算#
默认情况下,ESP32 的最大 SPI 时钟速度为 40 MHz。这意味着什么?在 320x240 显示屏上,16 位色深,您需要传输 320 x 240 x 16 = 1,228,000 位。在 40 MHz 下,这意味着 1,228,000 / 40,000,000 = 30 ms。
因此传输完整帧需要 30 ms。
如果您有例如 40 ms 渲染时间,整个过程需要 70 ms,这意味着只有 14 FPS。
如何加速 ESP32 用于 GUI 应用?#
有两个选项:
- 加速 SPI
- 使刷新和渲染并行
我们首先讨论 SPI 速度。此表来自 ILI9341 的数据手册(第 230 页):

第一行说一个时钟周期最少可以是 100 ns,这意味着只有 10 MHz。那将非常慢。
结果发现 ILI9341 实际上可以在更高的时钟速率下工作。他们说甚至可以达到 48 MHz,但与之前计算中的 40 MHz 相比,这仍然不是很大的增益。
无论如何,在 ESP32 中,如果使用专用引脚,可以将 SPI 速度提高到 80 MHz。
根据 ESP32 SPI 文档:
当使用 GPIO 矩阵时,快于 40MHz 的信号无法传播,并且 MISO 的建立时间更容易被违反,因为 MISO 信号的输入延迟增加。使用 GPIO 矩阵的最大时钟频率为 40MHz 或更低,而使用所有 IOMUX 引脚允许 80MHz。
因此,只需选择以下 SPI 引脚即可拥有 80 MHz 时钟速度:

要驱动显示屏,表中只需要 MOSI 和 SCLK。
因此,让我们使用更快的引脚。最大时钟速率由于 ILI9341 仍然是 40 MHz,但希望它能提供更好的信号。
要使渲染和刷新并行,您应该使用带 DMA 的 SPI。DMA 使得可以在后台通过 SPI 发送渲染的图像,并让 CPU 执行其他操作。ESP32 支持将 DMA 与 SPI 一起使用,因此这只是驱动程序和一些 LVGL 配置的问题。(在 lv_conf.h 中启用 LV_VDB_DOUBLE)
构建和烧录官方示例#
安装 ESP32 工具链#
要开始,您需要安装 ESP32 开发工具链。请参阅此指南并按照步骤操作。
获取 ESP IoT Solution#
ESP IoT Solution 是一个庞大的集合:
- 驱动程序
- 库
- 和示例
将其克隆到某处(最好在安装工具链的 esp 文件夹中):
cd ~/esp/git clone https://github.com/espressif/esp-iot-solution --recurse-submodulesexport IOT_SOLUTION_PATH=~/esp/esp-iot-solution
配置示例#
选择一个示例并配置它:
cd esp-iot-solution/examples/hmi/lvgl_examplemake defconfigmake menuconfig
在 menuconfig 中,转到 IoT Solution Settings > IoT Component Management > HMI Components > LVGL Settings
在 Config Driver 中:
- 选择您的屏幕驱动程序。在我的情况下是 ILI9341
- 设置屏幕引脚,如下图所示
- 将 LCD SPI 时钟设置为 40,000,000。这是最大值,所以之前计算的 80 MHz 无法在这里尝试。

如果进入触摸屏引脚配置,您只会看到 CS 和 IRQ 引脚设置。这意味着它使用与屏幕驱动程序相同的 SPI,并且 MOSI、MISO 和 CLK 引脚是共享的。但是,我的屏幕具有触摸板和屏幕的专用 SPI 引脚,并且我没有 "Y" 电缆。因此,我暂时在 "LittlevGL Touchscreen Enable" 中禁用了触摸板。
在 menuconfig 的主菜单中,在 Serial flasher config 中,确保选择了正确的串口。(需要将 ESP32 连接到 PC 才能看到使用的串口。)
之后,保存设置并退出 menuconfig。
构建和烧录#
要构建和烧录,在终端中输入:
make构建项目。或make -j8在 8 个线程上构建。make flash对 ESP32 进行编程
结果是:

直接使用 ESP-IDF 的 LVGL#
如果您想要一个更简单的项目,拥有更多自由,您应该使用 ESP-IDF,这是核心 ESP SDK。
有一个可以与 ESP-IDF 一起使用的 LVGL 项目:https://github.com/littlevgl/esp32_ili9431
该项目附带 ILI9341 显示驱动程序和 XPT2046 触摸板驱动程序。显示驱动程序使用 DMA 并使渲染和刷新并行,从而产生不错的帧率。您可以根据需要自定义这些驱动程序。
-
获取此项目:
git clone https://github.com/littlevgl/esp32_ili9431.git --recurse-submodules -
将 LVGL 添加到构建中。将
lvgl_component.mk和lv_example_component.mk作为component.mk分别复制到lvgl和lv_examples目录。 -
连接触摸板(可选):
- MOSI: 32
- MISO: 25
- SCLK: 26
- CS: 33
- IRQ: 25
-
make -
make flash

可以实现什么 FPS?#
使用上图中的 GUI - 通过使渲染和刷新并行 - 我实现了约 30 FPS!
总结#
ESP-IoT-Solution 是一个很棒且易于使用的框架。如您所见,只需几分钟即可开始。
但是,您也可以使用 ESP-IDF 来尝试 LVGL。这样您将对项目有更多控制。
如果您有使用 ESP32 和 LVGL 的产品,可以在 LVGL 网站上分享!
