在把玩微雪 ESP32-S3-RLCD-4.2 开发板:用 MicroPython 来探索硬件中,我已经验证了 LCD 的接口,能够完全控制这块低功耗、全反射的单色 LCD。不过 U8g2 对这款屏幕的驱动支持还不够完善,没能直接驱动起来,于是我决定自己写一个 U8g2 驱动,方便后续的小项目直接使用。
思路很简单:先让它跑起来,再一步步优化性能,最终得到一个相当不错的成果:
- 第一次完成驱动编写,让基于 U8g2 的演示程序正常运行:仅支持全屏刷新,刷新率约 40fps。
- 首次实现局部刷新能力:更新 128×32 区域时,刷新率超过 300fps。
- 为了支持横屏显示,实现了旋转功能。由于 ST7305 控制器按行传输数据,128×32 区域旋转后需要更多次 SPI 传输,刷新率下降到约 280fps。
- 将 SPI 时钟从 10MHz 提高到 24MHz,刷新率提升到 480fps。
- 将一次更新中的多行数据预处理后拼接成连续数据,尽量做到一次传输完成,减少 SPI 事务次数,刷新率提升到约 500fps。
- 增加一个 16 字节大小的 LUT,把像素布局调整中的大量运算改为查表操作,减少 CPU 运算时间,刷新率提升到约 550fps。
- 优化掉一次
memset 调用,并合并 CS 帧,减少 CS 信号切换次数,刷新率提升到 700fps 以上。
在约 10 秒的视频中,计数器更新了 7300 多次。
到这个程度后,进一步优化的空间已经非常有限,先到这里为止。
我已经将 ST7305_U8g2.h 和 ST7305_U8g2.cpp 上传到 GitHub gist,源码可在项目仓库中找到。如果你也有类似的驱动开发心得,欢迎到云栈社区与大家交流分享。
(完)
|