解决 Arduino + ESP32C3+TFT_eSPI + ST7735 遇到的一些问题

开发环境

  • 合宙 ESP32C3 简约版
  • 合宙1.8寸 128x160 ST7735
  • PlatfromIO + Arduino
  • TFT_eSPI@^2.5.43

IMG_2163

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);

经过一番折腾,终于能正常显示图片了。

posted @ 2025-12-07 10:21  newdio  阅读(0)  评论(0)    收藏  举报