ESP32-C3点亮ST7735S踩坑
关于显示屏控制器
单片机直接带显示屏不太可能,所以一般会使用显示屏控制器转换。显示屏控制器五花八门,但主要的工作原理其实类似:
- 支持单片机常用的通信协议,否则也没法用。
- 提供初始化相关的接口,用于开机并配置各种常见参数,如镜像 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 驱动兼容,可以直接复制粘贴使用。