Fast pure-C driver for MicroPython that can handle display modules on ST7789 chip
ST7789驱动程序 for MicroPython
概览
本驱动程序是专为MicroPython设计的,用于处理基于ST7789芯片的低成本显示屏。

它支持240x240和135x240两种分辨率的显示模块。
此驱动由纯C语言编写,因此需要用户自行编译固件。 目前支持ESP8266、ESP32和STM32平台。
构建指南
按照手册准备构建工具。 在编译MicroPython固件前,请确保能够不依赖该显示模块完成固件构建。
将此模块与MPY源代码一同克隆:
git clone https://github.com/devbis/st7789_mpy.git
进入MicroPython的端口目录,并对于ESP8266运行:
cd micropython/ports/esp8266
对于ESP32:
cd micropython/ports/esp32
然后,指定USER_C_MODULES目录来编译模块:
make USER_C_MODULES=../../../st7789_mpy/ all
如果你有其他用户模块,需将st7789_driver/st7789复制到用户模块目录中。
使用esptool.py以常规方式上传生成的固件至你的MCU(参见MicroPython文档了解更多部署信息)。
make deploy
工作示例
本模块已在ESP32和ESP8266微控制器上测试。
你需要提供一个machine.SPI对象以及屏幕上的重置(RESET)和数据选择(DC)针脚至少两个引脚给显示对象。
ESP 8266 示例
import machine
import st7789
spi = machine.SPI(1, baudrate=40000000, polarity=1)
display = st7789.ST7789(spi, 240, 240, reset=machine.Pin(5, machine.Pin.OUT), dc=machine.Pin(4, machine.Pin.OUT))
display.init()
ESP32 示例
对于ESP32,需要特定的SPI引脚配置。
import machine
import st7789
spi = machine.SPI(2, baudrate=40000000, polarity=1, sck=machine.Pin(18), mosi=machine.Pin(23))
display = st7789.ST7789(spi, 240, 240, reset=machine.Pin(4, machine.Pin.OUT), dc=machine.Pin(2, machine.Pin.OUT))
display.init()
方法概述
仅支持RGB565格式的16位颜色。
ST7789.fill(color): 填充整个显示屏为指定颜色。ST7789.pixel(x, y, color): 将指定位置的像素设置为给定颜色。ST7789.line(x0, y0, x1, y1, color): 绘制从(x0, y0)到(x1, y1)的直线。ST7789.hline(x, y, length, color): 绘制长度为length的水平线。ST7789.vline(x, y, length, color): 绘制长度为length的垂直线。ST7789.rect(x, y, width, height, color): 绘制矩形。ST7789.fill_rect(x, y, width, height, color): 填充矩形区域。ST7789.blit_buffer(buffer, x, y, width, height): 将字节内容复制到屏幕内部内存中。
模块还提供了预定义颜色:BLACK, BLUE, RED, GREEN, CYAN, MAGENTA, YELLOW, WHITE。
辅助函数
color565(r, g, b): 将颜色转换为2字节的RGB565格式。map_bitarray_to_rgb565(bitarray, buffer, width, color=WHITE, bg_color=BLACK): 将位数组转换为适合blit操作的RGB565颜色缓冲区,用于高效打印高分辨率文本。
性能表现
与针对Arduino的高性能库比较,以及一个较慢的纯Python实现进行了对比,显示了在ESP8266和ESP32上绘制一条从(0,0)到(239,239)直线的时间差异。
| 库名称 | ESP8266 (ms) | ESP32 (ms) |
|---|---|---|
| Arduino-ST7789 | 26 | 23 |
| st7789py_mpy (Python) | 450 | 450 |
| st7789_mpy (本驱动) | 12 | 47 |
ESP32的绘制速度比ESP8266慢约4倍。
故障排查
- IRAM溢出错误: 构建ESP8266固件时可能会遇到链接器错误。解决方法包括将st7789模块移到irom0段,在
esp8266_common.ld文件的.irom0.text部分添加相应的编译指示。 - 不支持的尺寸: 仅支持240x240和135x240分辨率的显示器。如果使用其他分辨率,可以在创建显示对象时通过
xstart和ystart参数指定偏移量以适应非标准尺寸。