ESP32-2432S024显示屏TFT_eSPI精灵需在Loop中创建的问题
问题排查:ESP32 TFT_eSPI精灵初始化移至Init()后黑屏
核心问题分析
- 精灵初始化顺序错误:
setColorDepth()必须在createSprite()之前调用,因为创建精灵时会根据当前颜色深度分配显存空间。原代码中先创建精灵再设置颜色深度属于错误操作,移至Init()后错误被放大导致黑屏。 - 成员变量类型错误:
screenWidth和screenHeight定义为float类型,而createSprite()需要整数参数,隐式转换可能引发异常。 - 精灵配置缺失:移至Init()后,光标精灵未设置
setSwapBytes,可能导致颜色渲染异常;同时循环中未正确重置精灵内容,导致画面异常。
修正步骤
1. 调整成员变量类型
修改game.h中的屏幕尺寸为整数类型,避免参数类型不匹配:
private: TFT_eSPI tft = TFT_eSPI(); TFT_eSprite cursor = TFT_eSprite(&tft); TFT_eSprite background = TFT_eSprite(&tft); TFT_eSprite gyroText = TFT_eSprite(&tft); // 将float改为int,匹配createSprite的参数要求 int screenWidth = 320; int screenHeight = 240;
2. 修正Init()中的精灵初始化顺序
确保setColorDepth()在createSprite()之前调用,并补充完整配置:
void Game::Init() { // 初始化显示屏 tft.init(); tft.setRotation(1); tft.setSwapBytes(true); tft.fillScreen(TFT_BLACK); // 初始化背景精灵:先设置颜色深度,再创建 background.setColorDepth(8); background.createSprite(screenWidth, screenHeight); background.setSwapBytes(true); // 初始化时绘制基础背景 background.pushImage(0, 0, screenWidth, screenHeight, backgroundSprite); // 初始化光标精灵:同样遵循先设置颜色深度的顺序 cursor.setColorDepth(8); cursor.createSprite(16, 16); cursor.setSwapBytes(true); // 补充颜色字节交换,避免颜色显示异常 }
3. 优化Loop()逻辑
移除重复的精灵初始化代码,仅保留动态更新部分:
// 将x、y改为类成员变量,避免全局变量污染 int x = 50; int y = 50; void Game::Loop() { // 清除背景精灵中的旧光标痕迹,用原始背景图覆盖 background.pushImage(0, 0, screenWidth, screenHeight, backgroundSprite); // 更新光标精灵内容 cursor.fillSprite(TFT_BLACK); // 清除光标精灵的旧内容 cursor.pushImage(0, 0, 16, 16, cursorSprite); // 将光标绘制到背景精灵的指定位置 cursor.pushToSprite(&background, x, y, TFT_BLACK); // 将更新后的背景精灵推送到屏幕显示 background.pushSprite(0, 0); // 更新光标位置 x++; y++; if (x >= screenWidth) x = 0; if (y >= screenHeight) y = 0; }
额外注意事项
- 确保
TFT_eSPI库的User_Setup.h已正确配置ESP32-2432S024 CYD显示屏的引脚、分辨率等参数,这是显示屏正常工作的基础前提。 - 精灵创建会占用ESP32的内存,若同时使用多个大尺寸精灵,需注意内存限制,避免内存溢出导致程序异常。
内容的提问来源于stack exchange,提问作者Melvin Moes
相关产品推荐
相关产品推荐

