见文档。
ESP 的 LCD 驱动位于 ESP-IDF 下的 components/esp_lcd,目前仅存在于 v4.4 及以上版本中。esp_lcd 能够驱动 ESP 系列芯片所支持的 I2C、SPI、8080 以及 RGB 四种接口的 LCD 屏幕,各系列芯片所支持的 LCD 接口如下表所示。
SoC | I2C 接口 | SPI(QSPI)接口 | 8080 接口 | RGB 接口 |
---|---|---|---|---|
ESP32 | ||||
ESP32-S2 | ||||
ESP32-S3 | ||||
ESP32-C3 |
各接口的 LCD 驱动应用示例参考 ESP-IDF 下的 examples/peripherals/lcd,这些示例目前仅存在于 v5.0 及以上版本中,因为 v4.4 中 esp_lcd 的 API 名称与高版本基本一致,所以同样可以参考上述示例(两者的 API 实现上有一些区别),后续均以 ESP-IDF release/v5.0 分支为基础进行介绍。
特殊说明如下:
- QSPI 接口没有正式的通用驱动及示例,目前仅针对 ST77903 的 QSPI 接口进行了适配,如用户有需求可以提供示例压缩包
- RGB 接口应用推荐使用 ESP32-S3R8 芯片,基于 ESP-IDF 最新的 release/v5.0 分支并打上补丁
- RGB 接口驱动示例推荐参考 esp32-s3-lcd-ev-board 开发板的 bsp 及示例,该示例中 480x480 LCD 子板为 “3-line SPI + RGB”,而 800x480 LCD 子板仅为 “RGB”
图1 硬件框架(上图为非 RGB 接口,下图为 RGB 接口)
- 非 RGB 接口:包含 I2C、SPI 以及 8080 接口,这类屏幕上的驱动 IC 通过同一个外设接口来传输命令和刷屏数据,并且内部使用一个整帧大小的显存(GRAM),ESP 只需要把刷屏数据(局部大小)传给驱动 IC,驱动 IC 会把数据保存到 GRAM 中,并按照自身的刷新速率把显示数据(整帧大小)显示到 LCD 面板上。
- RGB 接口:这类屏幕上的驱动 IC 只通过 RGB 接口传输刷屏数据,而命令是通过额外的 3-line SPI 接口传输,而且不使用 GRAM,需要 ESP 在自身内部维护至少一个整帧大小的 GRAM (默认放置于 PSRAM 内),通过 DMA 和 RGB 接口将 GRAM 内全部的显示数据传给屏幕上的驱动 IC,驱动 IC 用其直接驱动 LCD 面板工作。
- 两者对比:
接口类型 驱动 IC 是否使用 GRAM 数据传输方式 I2C/SPI/8080 是 命令和数据使用同一接口 RGB 否 命令使用 3-line SPI,数据使用 RGB
图2 软件流程(左图为非 RGB 接口,右图为 RGB 接口)
- 非 RGB 接口:
- 总线初始化:对接口总线进行配置和初始化,若同一总线挂载多个设备则仅需初始化一次
- 设备初始化:基于接口总线新建并初始化设备,生成
esp_lcd_panel_io_handle_t
类型变量并提供esp_lcd_panel_io_tx_param()
和esp_lcd_panel_io_tx_color()
API 供后续过程使用 - 屏幕初始化:通过 esp_lcd_panel_io 对 LCD 屏幕的寄存器进行配置,生成
esp_lcd_panel_handle_t
类型变量并提供esp_lcd_panel_draw_bitmap()
等 API 实现刷屏等操作
- RGB 接口:
- 屏幕初始化:由于该操作仅在 LCD 初始化时进行一次,且对通信速率要求不高,一般使用 IO(ESP 或 IO 扩展芯片)模拟 SPI 进行实现
- 接口初始化:对 RGB 接口进行配置和初始化,创建
esp_lcd_panel_handle_t
类型变量并提供esp_lcd_panel_draw_bitmap()
等 API 实现刷屏等操作
- SPI LCD 应用代码详解
- 8080 LCD 应用代码详解(待更新)
- RGB LCD 应用代码详解
-
帧率:分为接口帧率、渲染帧率和显示帧率
- 接口帧率是指外设接口向 LCD 驱动 IC 刷屏传输数据的帧率,决定了屏幕显示帧率的上限,计算公式如下:
RGB 接口帧率 = (pclk_hz * 数据线宽度) / [色彩位数 * (h_res + h_back_porch + h_front_porch + h_pulse_width) * (v_res + v_back_porch + v_front_porch + v_pulse_width)]其他接口帧率 = (pclk_hz * 数据线宽度) / (色彩位数 * h_res * v_res)- 渲染帧率是指需要 CPU 计算渲染出动画效果(或图片编解码)的帧率,如 LVGL 运行动画时统计的 FPS,目前一般利用 LVGL Music Demo 统计的平均帧率来表征;
- 显示帧率是指在屏幕上实际显示的动画效果的帧率,表示实际肉眼看到到的动画的流畅度,由接口帧率和渲染帧率共同决定,计算公式如下:
显示帧率 = min(接口帧率, 渲染帧率) -
在 UI 动画效果复杂的情况下,显示帧率通常更加受限于渲染帧率,因此一般是通过加快渲染的计算和访存速度来提高帧率,可以尝试开启以下 menuconfig 配置项:
- System:
- ESP_DEFAULT_CPU_FREQ_MHZ_240
- FREERTOS_HZ = 1000
- COMPILER_OPTIMIZATION_PERF
- Flash:
- ESPTOOLPY_FLASHMODE_QIO
- ESPTOOLPY_FLASHFREQ_120M
- PSRAM(若有):
- SPIRAM_MODE_OCT(仅 ESP32-S3R8 支持)
- SPIRAM_SPEED_120M (两者同时开启需要给 ESP-IDF 打补丁)
- SPIRAM_FETCH_INSTRUCTIONS
- SPIRAM_RODATA
- Cache:
- ESP32S3_DATA_CACHE_LINE_64B (对于 RGB,只有在使用 Bounce Buffer 或 PSRAM 8 线 120M 时才能启用, 否则将导致屏幕漂移)
- LVGL:
- LV_MEM_CUSTOM
- LV_MEMCPY_MEMSET_STD
- LV_ATTRIBUTE_FAST_MEM_USE_IRAM
- System:
- 具体问题描述见链接
- 解决方法:背光延时开启
- 具体问题描述见链接
- 解决方法:
- RGB 接口:通过多 buffer 以及内部同步机制可以避免,例程参考 display_lvgl_demos
- 其他接口:需要屏幕提供 TE 信号线,根据该信号进行同步