解决 Arduino + ESP32C3+TFT_eSPI + ST7735 遇到的一些问题
开发环境
- 合宙 ESP32C3 简约版
- 合宙1.8寸 128x160 ST7735
- PlatfromIO + Arduino
- TFT_eSPI@^2.5.43

UserSetup.h
首先贴一下点亮时的 UserSetup.h
#define USER_SETUP_INFO "User_Setup"
#define ST7735_DRIVER // Define additional parameters below for this display
#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
#define TFT_WIDTH 128
#define TFT_HEIGHT 160
#define ST7735_REDTAB
#define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW)
#define TFT_MOSI 3 // In some display driver board, it might be written as "SDA" and so on.
#define TFT_MISO 5 // 避 MOSI 锋芒
#define TFT_SCLK 2
#define TFT_CS 7 // Chip select control pin
#define TFT_DC 6 // Data Command control pin
#define TFT_RST 10 // Reset pin (could connect to Arduino RESET pin)
#define TFT_BL 11 // LED back-light
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
#define SPI_FREQUENCY 27000000
#define SPI_READ_FREQUENCY 20000000
#define SPI_TOUCH_FREQUENCY 2500000
本来想用 TFT_eSPI 试着点亮一下吃灰的合宙屏幕,结果芯片无限重启,在网上搜索一番,发现也有很多遇到相同的情况,在此整理一下
一 无限重启问题
找到 TFT_eSPi 库,修改 Processors 里的 TFT_eSPI_ESP32_C3.h 文件:
第一个修改 33行左右(后来我验证一下不改好像也没事,原理我也不懂):
#ifndef REG_SPI_BASE
#define REG_SPI_BASE(i) DR_REG_SPI2_BASE
#endif
改为:
#ifdef REG_SPI_BASE
#undef REG_SPI_BASE
#endif
#define REG_SPI_BASE(i) (((i)==2) ? (DR_REG_SPI2_BASE) : (DR_REG_SPI0_BASE - ((i) * 0x1000)))
第二处修改 71行左右(此处修改完后不再无限重启):
#define SPI_PORT SPI2_HOST
改为:
#if ESP_ARDUINO_VERSION_MAJOR < 3
#define SPI_PORT SPI2_HOST
#else
#define SPI_PORT 2
#endif
二 白屏
经过第一步解决了芯片无限重启的问题,但是屏幕还是白屏,查看串口输出一段信息后就不再有动静了
ESP-ROM:esp32c3-api1-20210207
Build:Feb 7 2021
rst:0x15 (USB_UART_CHIP_RESET),boot:0xc (SPI_FAST_FLASH_BOOT)
Saved PC:0x40383332
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd5820,len:0x1054
load:0x403cc710,len:0x9d8
load:0x403ce710,len:0x2e60
entry 0x403cc710
先在 platformio.ini 中开启 CDC,这样合宙C3简约版才能通过USB打印串口信息
build_flags =
-D ARDUINO_USB_CDC_ON_BOOT=1
用串口打印调试的老办法,发现程序是在 tft.init() 时 writecommand 这个函数卡住的,于是串口输出一下MOSI和MISO的引脚看看
Serial.println(TFT_MOSI);
Serial.println(TFT_MISO);
结果发现两个都是 3,默认下MISO设置为 3,把它修改为其它不用的引脚,再次烧录,点亮了。
三 图片颜色
选一张图片调整为 128x160,再用 lcd-image-converter 转换为 RGB565 C数组,转换得的数组签名如下
static const uint16_t image_data_Image[20480] = {。。。}
点亮之后,试着显示一张图片,发现图片显示一堆堆色块,勉强能看出个形状
在 User_Setup.h 中尝试修改一下设置,多次尝试下,总该有合适的
// 76行
#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
// 102行
// #define ST7735_INITB
// #define ST7735_GREENTAB
// #define ST7735_GREENTAB2
// #define ST7735_GREENTAB3
// #define ST7735_GREENTAB128 // For 128 x 128 display
// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)
#define ST7735_ROBOTLCD // For some RobotLCD Arduino shields (128x160, BGR, https://docs.arduino.cc/retired/getting-started-guides/TFT)
// #define ST7735_REDTAB
// #define ST7735_BLACKTAB
// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset
//116行
// #define TFT_INVERSION_ON
// #define TFT_INVERSION_OFF
开启 SwapBytes
tft.setSwapBytes(true);
tft.pushImage(0, 0, 128, 160, image_data_Image);
经过一番折腾,终于能正常显示图片了。

浙公网安备 33010602011771号