Basic template for ST7789 driver and esp32.
- board: ESP32-WROOM
- flash size: 16MB
- esp-idf: v4.2.2 (其他新的版本没做过测试,不过应该问题不大)
- LCD driver: ST7789
- LCD module: 2.0' TFT SPI 320x240
- Touch driver: FT6236U
- LVGL : v8.0.0-194-gd79ca388
- LVGL commit : d79ca38
- LVGL esp32 drivers commit: a68ce89
LVGL在ESP32上的移植步骤可见在线文档:Get the LVGL demo project for ESP32
工程fork自 Kevincoooool/lvgl_v8_esp32
在原工程的基础上,进行了这些变动:
-
可由
menuconfig
配置屏幕分辨率、屏幕缓存容量、选择运行的Demo。 -
更新了触摸配置,默认配置适配 ST7789V+FT6236U 单点电容触摸屏,已完美适配
ESP-IOT-KIT
开发板。 -
更换了子模块 lvgl/lvgl_esp32_drivers
相较于V7.9,可以明显感觉到LVGL V8更为流畅。对于V7.9在ESP32上运行时产生的拉窗帘,在V8上已经减轻了很多。
- 递归clone本代码:
git clone --recurse-submodules https://github.com/ZhiliangMa/lvgl_v8_esp32.git
- 确保电脑已有 ESP-IDF V4.2 或以上版本的环境。编译
idf.py build
,下载idf.py flash
。
默认使用双缓存刷屏,以提高显示帧率。双缓冲的单缓存大小,可由menuconfig中的CONFIG_CUSTOM_DISPLAY_BUFFER_SIZE
来设置。
代码中的DISP_BUF_SIZE
为 LVGL
用于刷屏的双缓存的单缓存容量,在本工程中,由 CONFIG_CUSTOM_DISPLAY_BUFFER_SIZE
设置。(menuconfig修改)
DISP_BUF_SIZE
的值可设置为 (屏幕行像素数 x 缓存行数)。此值的大小会影响刷屏速度,过小会明显降低刷屏帧率,建议最小也要大于(屏幕行像素数 x 列像素的1/10)。本Demo默认此值为19200(即320x60=19200)。
如不勾选 CONFIG_CUSTOM_DISPLAY_BUFFER_SIZE
此项,则默认为 (LV_HOR_RES_MAX * 40)
测试条件: 【ESP32主频240MHz,SPI刷屏速率40MHz,30ms刷新间隔。FT6236U触摸屏400K,30ms间隔】
双缓存的单缓存容量 | lv_demo_benchmark 测试成绩 |
前4项成绩(FPS) |
---|---|---|
320*20 | 89FPS,Opa 79% | (16,16,15,16) |
320*24 | 106FPS,Opa 72% | (16,16,15,16) |
320*40 | 114FPS,Opa 70% | (16,16,17,17) |
320*48 | 112FPS,Opa 70% | (19,17,18,17) |
320*60 | 110FPS,Opa 78% | (18,18,18,18) |
320*120 | 106FPS,Opa 75% | (19,18,18,18) |
【小结】CONFIG_CUSTOM_DISPLAY_BUFFER_SIZE
设置为 320*60=19200 字节时,基本已是ESP32运行LVGL的最好成绩,后续缓存的提升对刷屏几乎无帮助作用。(Demo默认设置为 19200)
还可通过提高SPI速率的方式提高刷屏帧率,但容易因驱动IC型号、硬件线路布局的影响而造成显示花屏。不推荐使用80MHz来刷屏。
ESP32-IOT-KIT
的SPI允许设置为80MHz刷屏,不过大多数情况需要将右侧的TF卡一起插上,以避免花屏。
如果出现如下图错误,导致的代码不能在ESP32上运行(能编译通过,但运行时会报此错误)
是因为人为对源码的改动,导致实际分配给LVGL用于刷屏的双缓存容量,小于 DISP_BUF_SIZE
而导致的。【如果在menuconfig去配置容量,是不会出现这种错误的,尽量不要去更改代码】
关闭文件夹后,手动删除build
文件夹,重新编译。