使用ESP-IDF驱动鱼鹰电子ST7305墨水屏
这里取个巧,并不是实际移植到IDF下,而是在ESP-IDF下调用官方提供的arduino驱动。
首先将esp-arduino作为组件使用,如下:
可能需要一些必要的配置,可以参考: https://docs.espressif.com/projects/arduino-esp32/en/latest/esp-idf_component.html
完成后,还需要到导入两个库到components:
链接:
注意Adafruit-GFX-Library的CMakeLists需要修改为:
cmake_minimum_required(VERSION 3.5)
idf_component_register(SRCS "Adafruit_GFX.cpp" "Adafruit_GrayOLED.cpp" "Adafruit_SPITFT.cpp" "glcdfont.c"
INCLUDE_DIRS "."
REQUIRES arduino-esp32 Adafruit_BusIO)
project(Adafruit-GFX-Library)
然后就可以将示例代码放到mian.c里尝试编译:
第一个错误:
Overloaded Virtual(重载虚函数隐藏):
ST73XX_UI 类有一个 drawLine 方法:
void drawLine(uint x1, uint y1, uint x2, uint y2, uint16_t color);
但是 Adafruit_GFX 也有一个 drawLine 方法:
virtual void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
因为 uint(默认是 unsigned int)和 int16_t(短整型)是不同的类型,导致 ST73XX_UI 的 drawLine 方法隐藏了 Adafruit_GFX 里的 drawLine。
解决方案: 在 ST73XX_UI 里显式声明使用 Adafruit_GFX::drawLine:
using Adafruit_GFX::drawLine;
void drawLine(uint x1, uint y1, uint x2, uint y2, uint16_t color);
第二个错误:
成员初始化顺序不匹配(-Werror=reorder)。这个问题是因为 类的成员变量 在 初始化列表中的顺序 与 它们在类定义中的声明顺序 不匹配。
- LCD_HIGH 这个成员变量在类中 后声明,但在 构造函数初始化列表 里 先初始化 了。
- ST73XX_UI 这个基类,在类声明中排在前面,但在 初始化列表 中排在后面。
解决:
将ST73XX_UI(200, 200)
挪到最前面:
这个时候编译可能还会报错:
这是因为 drawLine() 方法有两个重载版本,一个来自 Adafruit_GFX,一个来自 ST73XX_UI,导致调用时发生 歧义 (ambiguous call)。
报错代码:
display.drawLine(0, 20, 30, 70, ST7305_COLOR_BLACK);
修改为:(使用 Adafruit_GFX 版本)
display.drawLine((int16_t)0, (int16_t)20, (int16_t)30, (int16_t)70, (uint16_t)ST7305_COLOR_BLACK);
这样编译就ok了。