基于ESP32-S3的1.69寸ST7789V2彩屏驱动移植实战软件SPI与硬件SPI配置详解最近在做一个智能家居的小项目需要用到一块小巧的彩色屏幕来显示状态信息。我选了一块1.69寸、驱动芯片是ST7789V2的LCD屏主控用的是ESP32-S3。刚开始以为把屏幕接上就能用结果发现驱动移植还是有不少门道的尤其是SPI通信方式的选择和配置折腾了我好一阵子。今天我就把整个驱动移植的过程特别是软件SPI和硬件SPI两种方式的详细配置步骤手把手地分享给大家。无论你是刚开始接触ESP32的爱好者还是正在为项目选型屏幕的工程师这篇教程都能帮你快速搞定这块屏幕的驱动。1. 屏幕与硬件基础在开始写代码之前咱们先得把屏幕和ESP32-S3的“家底”摸清楚这样后面接线和配置才不会乱。1.1 屏幕规格与引脚我用的这块1.69寸彩屏核心参数如下项目参数工作电压3.3V (和ESP32-S3的IO电压完美匹配)工作电流约90mA (功耗不算高)屏幕尺寸31mm x 48mm (非常小巧)分辨率240 x 280 像素 (RGB排列)驱动芯片ST7789V2通信协议SPI (串行外设接口)引脚数量8 Pin (2.54mm间距排针)屏幕的8个引脚每个都有特定的作用接线时千万不能搞错。具体定义见下表引脚序号引脚名称功能说明1GND电源地2VCC电源正极 (3.3V)3SCLSPI时钟线 (SCK)4SDASPI数据线 (MOSI主设备输出)5RES复位引脚低电平有效6DC数据/命令选择引脚7CS片选引脚低电平有效8BLK背光控制引脚注意BLK引脚控制背光。接3.3V则背光常亮接GND则关闭。如果你想实现亮度调节可以接一个PWM引脚。1.2 ESP32-S3的SPI资源SPI通信有两种实现方式软件模拟SPI和硬件SPI。咱们先了解一下ESP32-S3在这方面的“家底”。ESP32-S3芯片内部集成了四个SPI控制器SPI0和SPI1主要留给内部Flash和PSRAM使用我们一般用不了。GP-SPI2和GP-SPI3这是两个通用的SPI控制器我们可以自由使用也就是常说的“硬件SPI”。软件SPI的优点是灵活任何GPIO引脚都能用缺点是速度慢需要CPU一直参与会占用计算资源。硬件SPI的优点是速度快、效率高数据搬运由DMA负责不占用CPU缺点是引脚固定需要查阅手册找到对应的硬件SPI引脚。对于咱们这块刷新数据量不大的屏幕两种方式都能用。但如果你后续要做动画或快速刷新硬件SPI是更好的选择。2. 驱动移植准备工作在动手写代码前我们需要先把驱动文件准备好。官方已经提供了完整的驱动代码包省去了我们从零编写的麻烦。2.1 获取驱动文件驱动文件可以在资料下载中心找到。进入资料下载中心 - 模块移植资料下载区域。找到名为【该章节配套压缩包】的文件并下载。解压后你会看到一个名为LCD的文件夹里面包含了驱动所需的所有源文件.c和.h。2.2 导入工程接下来我们需要把这些文件放到自己的ESP-IDF项目里。在你的项目根目录下和main文件夹同级新建一个文件夹例如components如果还没有的话。将下载得到的LCD文件夹整个复制到你的components目录下。用VSCode打开你的项目找到项目根目录下的CMakeLists.txt文件。在这个文件中添加我们刚刚放入的LCD组件路径让编译系统能找到它。添加如下语句set(EXTRA_COMPONENT_DIRS components)或者如果你已经有其他组件确保components目录在EXTRA_COMPONENT_DIRS变量包含的路径中。完成这一步编译环境就准备好了。接下来就是最核心的部分根据你选择的通信方式软件SPI或硬件SPI来配置引脚和修改驱动。3. 软件SPI方式配置软件SPI不挑引脚非常灵活适合快速验证或GPIO资源紧张的情况。咱们先从这个开始。3.1 引脚连接首先根据你的ESP32-S3开发板选择8个空闲的GPIO引脚并按下表连接到屏幕屏幕引脚功能连接的ESP32-S3 GPIO引脚 (示例)GND电源地GNDVCC3.3V电源3.3VSCL (SCK)SPI时钟线GPIO 12SDA (MOSI)SPI数据线GPIO 11RES复位GPIO 10DC数据/命令选择GPIO 9CS片选GPIO 8BLK背光控制接3.3V (常亮) 或 GPIO 7 (PWM控制)提示上表中的GPIO 12、11、10、9、8、7只是示例你可以换成任何其他空闲的GPIO。唯一要注意的是尽量避开一些特殊功能引脚如Strapping引脚。3.2 修改驱动配置文件驱动代码的引脚定义通常在lcd_init.h或lcd_conf.h这样的配置文件中。我们需要打开它将上面我们选择的引脚号填进去。找到文件中类似下面的宏定义并修改为你实际连接的引脚号// 软件SPI引脚定义 - 根据你的实际接线修改 #define LCD_SCLK_PIN 12 // 时钟线 SCL #define LCD_MOSI_PIN 11 // 数据线 SDA #define LCD_RES_PIN 10 // 复位 RES #define LCD_DC_PIN 9 // 数据/命令选择 DC #define LCD_CS_PIN 8 // 片选 CS #define LCD_BLK_PIN 7 // 背光控制 BLK (如果使用PWM)3.3 配置背光可选如果你将BLK引脚接到了GPIO上比如GPIO 7并希望用PWM调节亮度还需要初始化LEDCLED PWM控制器。这通常在LCD_Init()函数中完成。你需要添加类似下面的代码#include “driver/ledc.h” // 配置LEDC定时器和通道 ledc_timer_config_t ledc_timer { .speed_mode LEDC_LOW_SPEED_MODE, .duty_resolution LEDC_TIMER_8_BIT, // 8位分辨率亮度0-255 .timer_num LEDC_TIMER_0, .freq_hz 5000, // PWM频率 .clk_cfg LEDC_AUTO_CLK, }; ledc_timer_config(ledc_timer); ledc_channel_config_t ledc_channel { .gpio_num LCD_BLK_PIN, .speed_mode LEDC_LOW_SPEED_MODE, .channel LEDC_CHANNEL_0, .timer_sel LEDC_TIMER_0, .duty 128, // 初始亮度50% (128/255) .hpoint 0, }; ledc_channel_config(ledc_channel);然后在需要改变亮度时调用ledc_set_duty()和ledc_update_duty()函数即可。至此软件SPI的配置就完成了。编译并下载程序如果接线和配置正确屏幕应该就能点亮了。4. 硬件SPI方式配置如果你追求更高的刷新效率或者CPU负担较重那么硬件SPI是更优的选择。它的配置稍微复杂一点因为涉及到SPI主机控制器的初始化。4.1 引脚连接硬件SPI硬件SPI的SCK和MOSI引脚是固定的不能随意选择。对于ESP32-S3的SPI2HSPI和SPI3VSPI其默认引脚如下SPI主机SCK (时钟)MOSI (数据输出)MISO (数据输入)备注SPI2 (HSPI)GPIO 12GPIO 11GPIO 13我们常用这个SPI3 (VSPI)GPIO 5GPIO 6GPIO 7注意MISO引脚是主设备输入我们的屏幕只接收数据不发送数据给ESP32所以MISO引脚可以不用接。因此对于硬件SPI我们必须使用指定的引脚连接SCK和MOSI。其他控制引脚RES, DC, CS, BLK依然是灵活的。连接表示例屏幕引脚功能连接的ESP32-S3 GPIO引脚 (使用SPI2)SCL (SCK)SPI时钟线GPIO 12(固定)SDA (MOSI)SPI数据线GPIO 11(固定)RES复位GPIO 10 (可自定义)DC数据/命令选择GPIO 9 (可自定义)CS片选GPIO 8 (可自定义).........4.2 修改驱动代码关键步骤硬件SPI的驱动代码与软件SPI有本质不同。它不再需要软件模拟时钟和数据线的时序而是直接调用ESP-IDF的SPI主机驱动API。你需要找到驱动中实现底层写数据和写命令的函数通常叫LCD_WR_DATA和LCD_WR_CMD。对于软件SPI这些函数内部是操作GPIO的gpio_set_level对于硬件SPI需要替换为SPI传输函数。首先在文件开头包含必要的头文件并定义SPI句柄#include “driver/spi_master.h” spi_device_handle_t spi;然后在LCD_Init()函数中初始化SPI主机设备esp_err_t ret; spi_bus_config_t buscfg { .miso_io_num -1, // 我们没有MISO设为-1 .mosi_io_num 11, // 硬件MOSI引脚 .sclk_io_num 12, // 硬件SCK引脚 .quadwp_io_num -1, .quadhd_io_num -1, .max_transfer_sz 240 * 280 * 2, // 一次传输的最大字节数一屏数据 }; spi_device_interface_config_t devcfg { .clock_speed_hz 40 * 1000 * 1000, // SPI时钟频率40MHz .mode 0, // SPI模式0 (CPOL0, CPHA0) .spics_io_num 8, // 片选CS引脚 .queue_size 7, .flags SPI_DEVICE_HALFDUPLEX, // 半双工模式 .pre_cb NULL, }; // 初始化SPI总线并添加设备 ret spi_bus_initialize(SPI2_HOST, buscfg, SPI_DMA_CH_AUTO); ret spi_bus_add_device(SPI2_HOST, devcfg, spi);接着重写数据传输函数。硬件SPI通常将命令和数据通过一个“事务”transaction发送void LCD_WriteCommand(uint8_t cmd) { esp_err_t ret; spi_transaction_t t; memset(t, 0, sizeof(t)); t.length 8; // 命令长度8位 t.tx_buffer cmd; t.user (void*)0; // 标志此为命令 // 先将DC引脚拉低命令模式 gpio_set_level(LCD_DC_PIN, 0); ret spi_device_polling_transmit(spi, t); // 传输完成后可以将DC拉高为后续数据做准备 gpio_set_level(LCD_DC_PIN, 1); } void LCD_WriteData(uint8_t *data, uint32_t len) { esp_err_t ret; spi_transaction_t t; memset(t, 0, sizeof(t)); t.length len * 8; // 数据总位数 t.tx_buffer data; t.user (void*)1; // 标志此为数据 // 此时DC引脚应保持为高数据模式 ret spi_device_polling_transmit(spi, t); }最后别忘了在LCD_Init()里像软件SPI一样初始化RES、DC、BLK这些GPIO引脚。硬件SPI的配置就完成了。这种方式下数据的传输由硬件负责速度更快CPU可以腾出手来做其他事情。5. 功能验证与测试无论你选择哪种SPI方式最后都需要写个测试程序来验证屏幕是否正常工作。下面是一个简单的测试例程你可以把它放在app_main()函数里。#include stdio.h #include “freertos/FreeRTOS.h” #include “freertos/task.h” #include “LCD/lcd_init.h” #include “LCD/lcd.h” void app_main(void) { float counter 0.0; // 1. 初始化LCD LCD_Init(); // 2. 清屏为白色 LCD_Fill(0, 0, LCD_W, LCD_H, WHITE); vTaskDelay(pdMS_TO_TICKS(500)); // 延时500毫秒 // 3. 显示一些测试内容 while(1) { // 显示汉字 LCD_ShowChinese(40, 0, (uint8_t *)“中电港”, RED, WHITE, 32, 0); // 显示屏幕宽度和高度信息 LCD_ShowString(10, 33, (uint8_t *)“LCD_W:”, RED, WHITE, 32, 0); LCD_ShowIntNum(106, 33, LCD_W, 3, RED, WHITE, 32); // 显示宽度值 LCD_ShowString(10, 66, (uint8_t *)“LCD_H:”, RED, WHITE, 32, 0); LCD_ShowIntNum(106, 66, LCD_H, 3, RED, WHITE, 32); // 显示高度值 // 显示一个递增的浮点数 LCD_ShowFloatNum1(10, 99, counter, 4, RED, WHITE, 32); counter 0.11; // 延时1秒后继续循环 vTaskDelay(pdMS_TO_TICKS(1000)); } }编译并下载这个程序到ESP32-S3。如果一切顺利你应该能看到屏幕先闪一下白色然后稳定显示“中电港”、屏幕分辨率以及一个不断变化的数字。如果屏幕没反应别着急按顺序检查以下几点电源和地线确保VCC和GND接对了用万用表量一下电压是不是稳定的3.3V。引脚连接对照表格一根线一根线地检查特别是SCK、MOSI、DC、CS这几根信号线。代码配置检查lcd_init.h或配置文件里的引脚号是否和你实际连接的完全一致。SPI模式ST7789通常使用SPI模式0CPOL0 CPHA0在硬件SPI初始化时要确认mode设置为0。复位时序有些屏幕对复位信号RES的时序有要求确保驱动代码里的复位延时是足够的。搞定这些你的ESP32-S3就能成功点亮这块1.69寸的彩屏了。软件SPI灵活硬件SPI高效根据你的项目需求选择就好。在实际项目中如果屏幕刷新不频繁用软件SPI省下硬件SPI资源给其他外设如SD卡也是不错的思路。
1. 基于ESP32-S3的1.69寸ST7789V2彩屏驱动移植实战:软件SPI与硬件SPI配置详解
基于ESP32-S3的1.69寸ST7789V2彩屏驱动移植实战软件SPI与硬件SPI配置详解最近在做一个智能家居的小项目需要用到一块小巧的彩色屏幕来显示状态信息。我选了一块1.69寸、驱动芯片是ST7789V2的LCD屏主控用的是ESP32-S3。刚开始以为把屏幕接上就能用结果发现驱动移植还是有不少门道的尤其是SPI通信方式的选择和配置折腾了我好一阵子。今天我就把整个驱动移植的过程特别是软件SPI和硬件SPI两种方式的详细配置步骤手把手地分享给大家。无论你是刚开始接触ESP32的爱好者还是正在为项目选型屏幕的工程师这篇教程都能帮你快速搞定这块屏幕的驱动。1. 屏幕与硬件基础在开始写代码之前咱们先得把屏幕和ESP32-S3的“家底”摸清楚这样后面接线和配置才不会乱。1.1 屏幕规格与引脚我用的这块1.69寸彩屏核心参数如下项目参数工作电压3.3V (和ESP32-S3的IO电压完美匹配)工作电流约90mA (功耗不算高)屏幕尺寸31mm x 48mm (非常小巧)分辨率240 x 280 像素 (RGB排列)驱动芯片ST7789V2通信协议SPI (串行外设接口)引脚数量8 Pin (2.54mm间距排针)屏幕的8个引脚每个都有特定的作用接线时千万不能搞错。具体定义见下表引脚序号引脚名称功能说明1GND电源地2VCC电源正极 (3.3V)3SCLSPI时钟线 (SCK)4SDASPI数据线 (MOSI主设备输出)5RES复位引脚低电平有效6DC数据/命令选择引脚7CS片选引脚低电平有效8BLK背光控制引脚注意BLK引脚控制背光。接3.3V则背光常亮接GND则关闭。如果你想实现亮度调节可以接一个PWM引脚。1.2 ESP32-S3的SPI资源SPI通信有两种实现方式软件模拟SPI和硬件SPI。咱们先了解一下ESP32-S3在这方面的“家底”。ESP32-S3芯片内部集成了四个SPI控制器SPI0和SPI1主要留给内部Flash和PSRAM使用我们一般用不了。GP-SPI2和GP-SPI3这是两个通用的SPI控制器我们可以自由使用也就是常说的“硬件SPI”。软件SPI的优点是灵活任何GPIO引脚都能用缺点是速度慢需要CPU一直参与会占用计算资源。硬件SPI的优点是速度快、效率高数据搬运由DMA负责不占用CPU缺点是引脚固定需要查阅手册找到对应的硬件SPI引脚。对于咱们这块刷新数据量不大的屏幕两种方式都能用。但如果你后续要做动画或快速刷新硬件SPI是更好的选择。2. 驱动移植准备工作在动手写代码前我们需要先把驱动文件准备好。官方已经提供了完整的驱动代码包省去了我们从零编写的麻烦。2.1 获取驱动文件驱动文件可以在资料下载中心找到。进入资料下载中心 - 模块移植资料下载区域。找到名为【该章节配套压缩包】的文件并下载。解压后你会看到一个名为LCD的文件夹里面包含了驱动所需的所有源文件.c和.h。2.2 导入工程接下来我们需要把这些文件放到自己的ESP-IDF项目里。在你的项目根目录下和main文件夹同级新建一个文件夹例如components如果还没有的话。将下载得到的LCD文件夹整个复制到你的components目录下。用VSCode打开你的项目找到项目根目录下的CMakeLists.txt文件。在这个文件中添加我们刚刚放入的LCD组件路径让编译系统能找到它。添加如下语句set(EXTRA_COMPONENT_DIRS components)或者如果你已经有其他组件确保components目录在EXTRA_COMPONENT_DIRS变量包含的路径中。完成这一步编译环境就准备好了。接下来就是最核心的部分根据你选择的通信方式软件SPI或硬件SPI来配置引脚和修改驱动。3. 软件SPI方式配置软件SPI不挑引脚非常灵活适合快速验证或GPIO资源紧张的情况。咱们先从这个开始。3.1 引脚连接首先根据你的ESP32-S3开发板选择8个空闲的GPIO引脚并按下表连接到屏幕屏幕引脚功能连接的ESP32-S3 GPIO引脚 (示例)GND电源地GNDVCC3.3V电源3.3VSCL (SCK)SPI时钟线GPIO 12SDA (MOSI)SPI数据线GPIO 11RES复位GPIO 10DC数据/命令选择GPIO 9CS片选GPIO 8BLK背光控制接3.3V (常亮) 或 GPIO 7 (PWM控制)提示上表中的GPIO 12、11、10、9、8、7只是示例你可以换成任何其他空闲的GPIO。唯一要注意的是尽量避开一些特殊功能引脚如Strapping引脚。3.2 修改驱动配置文件驱动代码的引脚定义通常在lcd_init.h或lcd_conf.h这样的配置文件中。我们需要打开它将上面我们选择的引脚号填进去。找到文件中类似下面的宏定义并修改为你实际连接的引脚号// 软件SPI引脚定义 - 根据你的实际接线修改 #define LCD_SCLK_PIN 12 // 时钟线 SCL #define LCD_MOSI_PIN 11 // 数据线 SDA #define LCD_RES_PIN 10 // 复位 RES #define LCD_DC_PIN 9 // 数据/命令选择 DC #define LCD_CS_PIN 8 // 片选 CS #define LCD_BLK_PIN 7 // 背光控制 BLK (如果使用PWM)3.3 配置背光可选如果你将BLK引脚接到了GPIO上比如GPIO 7并希望用PWM调节亮度还需要初始化LEDCLED PWM控制器。这通常在LCD_Init()函数中完成。你需要添加类似下面的代码#include “driver/ledc.h” // 配置LEDC定时器和通道 ledc_timer_config_t ledc_timer { .speed_mode LEDC_LOW_SPEED_MODE, .duty_resolution LEDC_TIMER_8_BIT, // 8位分辨率亮度0-255 .timer_num LEDC_TIMER_0, .freq_hz 5000, // PWM频率 .clk_cfg LEDC_AUTO_CLK, }; ledc_timer_config(ledc_timer); ledc_channel_config_t ledc_channel { .gpio_num LCD_BLK_PIN, .speed_mode LEDC_LOW_SPEED_MODE, .channel LEDC_CHANNEL_0, .timer_sel LEDC_TIMER_0, .duty 128, // 初始亮度50% (128/255) .hpoint 0, }; ledc_channel_config(ledc_channel);然后在需要改变亮度时调用ledc_set_duty()和ledc_update_duty()函数即可。至此软件SPI的配置就完成了。编译并下载程序如果接线和配置正确屏幕应该就能点亮了。4. 硬件SPI方式配置如果你追求更高的刷新效率或者CPU负担较重那么硬件SPI是更优的选择。它的配置稍微复杂一点因为涉及到SPI主机控制器的初始化。4.1 引脚连接硬件SPI硬件SPI的SCK和MOSI引脚是固定的不能随意选择。对于ESP32-S3的SPI2HSPI和SPI3VSPI其默认引脚如下SPI主机SCK (时钟)MOSI (数据输出)MISO (数据输入)备注SPI2 (HSPI)GPIO 12GPIO 11GPIO 13我们常用这个SPI3 (VSPI)GPIO 5GPIO 6GPIO 7注意MISO引脚是主设备输入我们的屏幕只接收数据不发送数据给ESP32所以MISO引脚可以不用接。因此对于硬件SPI我们必须使用指定的引脚连接SCK和MOSI。其他控制引脚RES, DC, CS, BLK依然是灵活的。连接表示例屏幕引脚功能连接的ESP32-S3 GPIO引脚 (使用SPI2)SCL (SCK)SPI时钟线GPIO 12(固定)SDA (MOSI)SPI数据线GPIO 11(固定)RES复位GPIO 10 (可自定义)DC数据/命令选择GPIO 9 (可自定义)CS片选GPIO 8 (可自定义).........4.2 修改驱动代码关键步骤硬件SPI的驱动代码与软件SPI有本质不同。它不再需要软件模拟时钟和数据线的时序而是直接调用ESP-IDF的SPI主机驱动API。你需要找到驱动中实现底层写数据和写命令的函数通常叫LCD_WR_DATA和LCD_WR_CMD。对于软件SPI这些函数内部是操作GPIO的gpio_set_level对于硬件SPI需要替换为SPI传输函数。首先在文件开头包含必要的头文件并定义SPI句柄#include “driver/spi_master.h” spi_device_handle_t spi;然后在LCD_Init()函数中初始化SPI主机设备esp_err_t ret; spi_bus_config_t buscfg { .miso_io_num -1, // 我们没有MISO设为-1 .mosi_io_num 11, // 硬件MOSI引脚 .sclk_io_num 12, // 硬件SCK引脚 .quadwp_io_num -1, .quadhd_io_num -1, .max_transfer_sz 240 * 280 * 2, // 一次传输的最大字节数一屏数据 }; spi_device_interface_config_t devcfg { .clock_speed_hz 40 * 1000 * 1000, // SPI时钟频率40MHz .mode 0, // SPI模式0 (CPOL0, CPHA0) .spics_io_num 8, // 片选CS引脚 .queue_size 7, .flags SPI_DEVICE_HALFDUPLEX, // 半双工模式 .pre_cb NULL, }; // 初始化SPI总线并添加设备 ret spi_bus_initialize(SPI2_HOST, buscfg, SPI_DMA_CH_AUTO); ret spi_bus_add_device(SPI2_HOST, devcfg, spi);接着重写数据传输函数。硬件SPI通常将命令和数据通过一个“事务”transaction发送void LCD_WriteCommand(uint8_t cmd) { esp_err_t ret; spi_transaction_t t; memset(t, 0, sizeof(t)); t.length 8; // 命令长度8位 t.tx_buffer cmd; t.user (void*)0; // 标志此为命令 // 先将DC引脚拉低命令模式 gpio_set_level(LCD_DC_PIN, 0); ret spi_device_polling_transmit(spi, t); // 传输完成后可以将DC拉高为后续数据做准备 gpio_set_level(LCD_DC_PIN, 1); } void LCD_WriteData(uint8_t *data, uint32_t len) { esp_err_t ret; spi_transaction_t t; memset(t, 0, sizeof(t)); t.length len * 8; // 数据总位数 t.tx_buffer data; t.user (void*)1; // 标志此为数据 // 此时DC引脚应保持为高数据模式 ret spi_device_polling_transmit(spi, t); }最后别忘了在LCD_Init()里像软件SPI一样初始化RES、DC、BLK这些GPIO引脚。硬件SPI的配置就完成了。这种方式下数据的传输由硬件负责速度更快CPU可以腾出手来做其他事情。5. 功能验证与测试无论你选择哪种SPI方式最后都需要写个测试程序来验证屏幕是否正常工作。下面是一个简单的测试例程你可以把它放在app_main()函数里。#include stdio.h #include “freertos/FreeRTOS.h” #include “freertos/task.h” #include “LCD/lcd_init.h” #include “LCD/lcd.h” void app_main(void) { float counter 0.0; // 1. 初始化LCD LCD_Init(); // 2. 清屏为白色 LCD_Fill(0, 0, LCD_W, LCD_H, WHITE); vTaskDelay(pdMS_TO_TICKS(500)); // 延时500毫秒 // 3. 显示一些测试内容 while(1) { // 显示汉字 LCD_ShowChinese(40, 0, (uint8_t *)“中电港”, RED, WHITE, 32, 0); // 显示屏幕宽度和高度信息 LCD_ShowString(10, 33, (uint8_t *)“LCD_W:”, RED, WHITE, 32, 0); LCD_ShowIntNum(106, 33, LCD_W, 3, RED, WHITE, 32); // 显示宽度值 LCD_ShowString(10, 66, (uint8_t *)“LCD_H:”, RED, WHITE, 32, 0); LCD_ShowIntNum(106, 66, LCD_H, 3, RED, WHITE, 32); // 显示高度值 // 显示一个递增的浮点数 LCD_ShowFloatNum1(10, 99, counter, 4, RED, WHITE, 32); counter 0.11; // 延时1秒后继续循环 vTaskDelay(pdMS_TO_TICKS(1000)); } }编译并下载这个程序到ESP32-S3。如果一切顺利你应该能看到屏幕先闪一下白色然后稳定显示“中电港”、屏幕分辨率以及一个不断变化的数字。如果屏幕没反应别着急按顺序检查以下几点电源和地线确保VCC和GND接对了用万用表量一下电压是不是稳定的3.3V。引脚连接对照表格一根线一根线地检查特别是SCK、MOSI、DC、CS这几根信号线。代码配置检查lcd_init.h或配置文件里的引脚号是否和你实际连接的完全一致。SPI模式ST7789通常使用SPI模式0CPOL0 CPHA0在硬件SPI初始化时要确认mode设置为0。复位时序有些屏幕对复位信号RES的时序有要求确保驱动代码里的复位延时是足够的。搞定这些你的ESP32-S3就能成功点亮这块1.69寸的彩屏了。软件SPI灵活硬件SPI高效根据你的项目需求选择就好。在实际项目中如果屏幕刷新不频繁用软件SPI省下硬件SPI资源给其他外设如SD卡也是不错的思路。