关于显示屏控制器

单片机直接带显示屏不太可能,所以一般会使用显示屏控制器转换。显示屏控制器五花八门,但主要的工作原理其实类似:

  • 支持单片机常用的通信协议,否则也没法用。
  • 提供初始化相关的接口,用于开机并配置各种常见参数,如镜像 X 和 Y 轴、设置帧率等。
  • 提供一个显存区域,并且支持选中部分区域更新数据。

因此,最简的显示屏接口一般只包括初始化(点亮)的功能及刷新屏幕区域的功能,有需要时会增加配置各种参数函数。

可以在 https://www.crystalfontz.com/controllers 查看相关数据手册,非常齐全。

数据维度

更新显存区域的功能要求数据连续分布,比如指定更新2x30的区域,则数据中的维度至少也是nx30,如果是nx40则会显示错位。

色彩格式

ST7735S 最大只支持 RGB666 色彩,因此通常会使用 RGB565 编码,即按照MSB在前分别传输 RGB 三个颜色(R4-R0, G5-G0, B4-B0)。要注意的是 ESP32 只支持按照字节顺序传输,而uint16_t在内存中是按照小端存储的,因此需要在传输前将所有的16位整数的高低两半交换。否则会显示出色彩完全错误的图像。

如果要使用 RGB666,可以在初始化时修改 COLMOD(0x3a)命令的参数。但这样会在每次传输时都使用 RGB888 的数据格式,浪费最低两位的带宽。

ST7735R/S

这两个显示屏控制器在控制逻辑上没有区别,可能显示效果有所不同。

esp_jpeg 和 lvgl

esp 提供了一个实时解码 JPEG 图像的组件,这个组件依赖 tjpgd(Tiny JPEG Decompressor),非常方便。但很遗憾的是会和 LVGL 里面提供的版本冲突,因此这两个库不能同时链接到同一个文件中,会导致运行时逻辑错误报错。

VSPI/HSPI 找不到

Xtensa 架构的 ESP32/ESP32S2/ESP32S3 除了内部使用的 SPI0/1 和和通用的 SPI2(FSPI/HSPI) 外,还有一个 SPI3(VSPI),因此 SPI 相关代码不是默认选定 SPI2,需要配置。如果相关库没有适配的话,可以定义-DHSPI_HOST=FSPI_HOST绕过。

崩溃后反复重启

可以在 Component config->ESP System Settings->Panic handler behaviour 中修改为 Print registers and halt,避免反复重启。

移植

lvgl_esp32_drivers的lvgl_7.11.0_idf_5.0分支包含了大量的显示屏控制器驱动,虽然不支持新IDK/新设备,但初始化函数和结构体和官方的 SPI LCD 驱动兼容,可以直接复制粘贴使用。