ESP32S3驱动ILI9341 LCD屏:LVGL移植实战与性能优化指南

ESP32-S3 LCD显示优化:从花屏修复到流畅动画的5个实战技巧 本文针对ESP32-S3驱动LCD屏幕时常见的花屏、卡顿等问题,提供了5个核心优化技巧。从根治花屏的电源时序与显存初始化,到提升SPI传输性能、实现双缓冲消除撕裂,再到色彩抖动与LVGL高级调优,系统性地讲解了从底层硬件到上层GUI框架的实战优化方案,帮助开发者实现稳定流畅的图片显示与动画效果。 阅读详情

1. 硬件与软件环境搭建

在开始LVGL移植之前,我们需要准备好硬件和软件环境。我选择的硬件是ESP32-S3 N16R8开发板,这款芯片内置8MB PSRAM,对于图形界面开发来说非常关键。显示屏用的是ILI9341,这是一款240x320分辨率的TFT LCD屏,通过SPI接口通信。实际使用中发现,市面上有些ILI9341屏的驱动芯片略有差异,但大部分都能兼容。

软件方面,我使用ESP-IDF v5.4.1框架,这个版本对ESP32-S3的支持比较稳定。LVGL库选择v8.3.11版本,这个版本在性能和稳定性上都有不错的表现。ILI9341驱动用的是espressif官方提供的esp_lcd_ili9341组件,版本2.0.1。

开发环境我推荐VSCode配合ESP-IDF插件,这样代码提示和调试都会方便很多。刚开始玩的时候,我试过用纯命令行操作,但后来发现IDE的图形化界面确实能节省不少时间。

这里有个小坑要注意:有些教程会推荐用idf.py add-dependency直接添加依赖,但我建议手动下载组件包。因为自动下载有时候会碰到网络问题,而且手动管理能更清楚地知道每个文件的作用。组件下载地址在ESP-IDF的组件仓库里都能找到,搜索lvgl和esp_lcd_ili9341就行。

2. LVGL库移植实战

2.1 组件目录结构配置

首先在项目根目录下创建components文件夹,把下载的lvgl和esp_lcd_ili9341组件解压到这里。我习惯给每个组件都创建独立的文件夹,这样结构清晰,后期维护也方便。

对于esp_lcd_ili9341组件,只需要保留三个核心文件:include目录下的头文件、src目录下的源文件,还有CMakeLists.txt。这里要注意的是CMakeLists.txt需要做些修改,把包管理和版本信息检查的部分注释掉,因为我们不是通过包管理器安装的。

lvgl组件需要保留五个关键文件:src目录、examples目录、lv_conf.h、lvgl.h和CMakeLists.txt。其中lv_conf.h是由lv_conf-template.h改名得来的,这个文件是LVGL的配置核心,后面会详细讲怎么配置。

在CMakeLists.txt里,需要根据我们的使用场景做些调整。我把用不到的功能都删掉了,比如模拟器支持和一些不必要的驱动,这样编译速度会快很多。env_support目录下的CMake文件也只保留了esp32的相关内容,其他平台的都删除了。

2.2 显示驱动实现

接下来要创建自定义的ILI9341驱动组件。我在components目录下新建了user_lcd_ili9341文件夹,里面包含CMakeLists.txt、user_lcd_ili9341.c和include/user_lcd_ili9341.h。

在CMakeLists.txt里这样配置:

idf_component_register(SRCS "user_lcd_ili9341.c"
                    INCLUDE_DIRS "include"
                    REQUIRES driver esp_lcd esp_timer esp_lcd_ili9341)

头文件里定义了硬件引脚和屏幕参数:

#define LCD_HOST SPI2_HOST
#define MY_DISP_HOR_RES 320
#define MY_DISP_VER_RES 240
#define MY_LVGL_BUFF_LINES 40
#define PIN_NUM_MOSI 13
#define PIN_NUM_SCLK 14
#define PIN_NUM_CS 10
#define PIN_NUM_DC 11
#define PIN_NUM_RST 12
#define PIN_NUM_BL -1

驱动实现里最关键的是SPI总线的初始化。我设置了10MHz的SPI时钟,这个速度在ESP32-S3上很稳定,再高的话可能会因为线长和屏的质量出现闪屏。DMA通道设置为自动选择,这样系统会帮我们分配最优的通道。

初始化过程中有几个容易出错的地方:一是GPIO引脚号要核对清楚,二是SPI模式要设置正确(ILI9341一般是mode 0),三是RGB颜色顺序要根据实际显示效果调整。我遇到过颜色反过来的情况,就是因为rgb_ele_order设置错了。

3. LVGL显示接口配置

3.1 显示缓冲区设置

显示缓冲区的配置是LVGL性能的关键。我创建了单独的user_lvgl组件,在其CMakeLists中添加了对user_lcd_ili9341和lvgl的依赖。

这里我参考了lvgl/examples/porting下的移植模板,把lv_port_disp_template.c和.h的内容复制到我的组件中,然后把条件编译#if 0改为#if 1启用相关代码。

缓冲区配置有三种模式,我每种都试过:

单缓冲模式最简单,但刷新时会有明显闪烁。双缓冲模式需要配合DMA使用,渲染和传输可以并行,效果很好。全刷新双缓冲模式最吃内存,但效果也最流畅。

我最终选择了双缓冲模式,分配40行缓存。计算下内存占用:320x40x2(双缓冲)x2(16位色)= 51.2KB,这在ESP32-S3的8MB PSRAM里根本不算什么。

size_t line_px = MY_DISP_HOR_RES * MY_LVGL_BUFF_LINES;
static lv_color_t buf_2_1[MY_DISP_HOR_RES * MY_LVGL_BUFF_LINES];
static lv_color_t buf_2_2[MY_DISP_HOR_RES * MY_LVGL_BUFF_LINES];
lv_disp_draw_buf_init(&s_draw_buf, buf_2_1, buf_2_2, line_px);

3.2 刷新回调函数实现

刷新回调函数disp_flush是连接LVGL和硬件驱动的桥梁。这里直接调用我们之前写好的user_esp_lcd_panel_draw_bitmap函数,把LVGL渲染好的区域数据发送到屏幕。

有个细节要注意:LVGL传来的区域坐标是包含的,即x2和y2坐标也是需要刷新的像素。但有些屏驱动需要的是独占坐标,所以我在调用时加了1:

user_esp_lcd_panel_draw_bitmap(area->x1, area->y1, area->x2 + 1, area->y2 + 1, color_p);

完成后一定要调用lv_disp_flush_ready通知LVGL刷新完成,否则LVGL会一直等待,导致界面卡死。

4. 内存优化与性能调优

4.1 内存分配策略

LVGL的内存管理很灵活,在lv_conf.h中有个关键设置LV_MEM_CUSTOM。如果设为0,LVGL使用内部的内存分配器,大小由LV_MEM_SIZE决定。如果设为1,则可以自定义内存分配函数。

我建议设为1,然后使用ESP32的堆分配函数:

#define LV_MEM_CUSTOM 1
#define LV_MEM_SIZE (100 * 1024)
#define LV_MEM_ATTR
#define LV_MEM_ADR 0
#define LV_MEM_CUSTOM_INCLUDE "stdlib.h"
#define LV_MEM_CUSTOM_ALLOC malloc
#define LV_MEM_CUSTOM_FREE free
#define LV_MEM_CUSTOM_REALLOC realloc

对于大块的显示缓冲区,最好分配到PSRAM中:

s_buf1 = (lv_color_t *)heap_caps_malloc(line_px * sizeof(lv_color_t), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);

4.2 渲染性能优化

ESP32-S3有两个核心,我们可以利用这个特性提升性能。我把LVGL的刷新任务放在CPU0上,界面渲染任务放在CPU1上,这样能有效避免因为其他任务阻塞导致的界面卡顿。

创建专门GUI任务:

BaseType_t ok = xTaskCreatePinnedToCore(gui_task, "gui", 4096, NULL, 3, NULL, 1);

在gui_task中循环调用lv_timer_handler,延时时间设置为10ms比较合适。太短会浪费CPU,太长则界面响应迟钝。

我还开启了LVGL的GPU加速功能,虽然ESP32-S3没有硬件GPU,但LVGL提供了一些软件优化的绘制算法,能显著提升绘制效率。

5. 实际应用与问题排查

5.1 界面布局适配

ILI9341是240x320的分辨率,在实际使用中需要注意坐标系的转换。我写了个set_pos_from_bottom_left函数,可以方便地从左下角开始布局元素:

static inline void set_pos_from_bottom_left(lv_obj_t *obj, lv_coord_t x, lv_coord_t yb) {
    lv_obj_update_layout(obj);
    lv_coord_t w = lv_obj_get_width(obj);
    lv_coord_t h = lv_obj_get_height(obj);
    lv_coord_t yy = MY_DISP_VER_RES - yb - h;
    lv_obj_set_pos(obj, x, yy);
}

这个函数会自动计算元素高度,然后从底部向上布局,比默认的从上向下布局更符合直觉。

5.2 常见问题解决

在移植过程中我遇到过两个典型问题:

一是程序崩溃,通常是内存分配不足。计算下内存需求:320x240全屏双缓冲需要320x240x2x2/1024=300KB,如果开启全刷新模式更是需要600KB。ESP32-S3虽然有很多PSRAM,但也要注意不要超分配。

二是显示模糊,这个问题困扰了我很久。最后发现是SPI时钟相位设置问题,把spi_mode从0改为1就清晰了。不同厂家的ILI9341屏可能略有差异,需要实际调试。

还有一次遇到屏幕花屏,原因是DMA传输大小设置不对。在spi_bus_config_t中需要设置max_transfer_sz,我设置为MY_DISP_HOR_RES * MY_LVGL_BUFF_LINES * 2,正好是一次传输的数据量。

6. 进阶优化技巧

6.1 双缓冲与局部刷新

双缓冲机制是提升显示性能的关键。我实测下来,开启双缓冲后刷新帧率能从15fps提升到35fps以上。实现方法是在显示驱动中维护两个缓冲区,LVGL在一个缓冲区渲染时,另一个缓冲区的数据正在通过DMA发送到屏幕。

局部刷新也能显著提升性能。在disp_flush回调中,我只刷新实际发生变化的区域,而不是整个屏幕。这对电池供电的设备尤其重要,能大大降低功耗。

6.2 动态内存管理

对于复杂界面,静态内存分配可能不够灵活。我实现了动态内存管理方案,根据界面复杂度动态调整缓冲区大小:

void adjust_buffer_size(size_t need_size) {
    if (need_size > current_buffer_size) {
        s_buf1 = realloc(s_buf1, need_size);
        s_buf2 = realloc(s_buf2, need_size);
        lv_disp_draw_buf_init(&s_draw_buf, s_buf1, s_buf2, need_size / sizeof(lv_color_t));
    }
}

这样在简单界面时节省内存,在复杂界面时又能保证流畅性。

6.3 电源管理

ILI9341屏幕的背光功耗很大,我添加了背光控制功能。虽然硬件上可能没有直接连接背光控制引脚,但可以通过SPI命令调节亮度:

void set_brightness(uint8_t percent) {
    uint8_t cmd = 0x51;
    uint8_t data = percent * 255 / 100;
    esp_lcd_panel_io_tx_param(s_io, cmd, &data, 1);
}

在设备休眠时,我还会完全关闭屏幕显示,只维持最低功耗的待机状态。这样整个系统的待机功耗能从50mA降到5mA以下。

移植完成后,整个系统运行很稳定,界面流畅度超出预期。ESP32-S3的性能确实强劲,驱动320x240的屏幕绰绰有余。最重要的是掌握了LVGL移植的方法论,以后遇到其他屏幕也能快速适配。

ESP32-S3驱动ILI9341屏幕避坑指南:从LVGL组件手动移植到流畅显示(ESP-IDF 5.4.1) 本文详细介绍了在ESP32-S3开发板上手动移植LVGL组件驱动ILI9341屏幕的完整流程与避坑指南。针对ESP-IDF 5.4.1环境下的常见问题如内存溢出、屏幕模糊等提供了具体解决方案,并分享了SPI总线配置、内存管理优化等关键技巧,帮助开发者实现流畅的显示效果。 阅读详情

相关推荐

从零构建嵌入式GUI:ESP32-S3与LVGL的深度适配与性能调优实战

本文详细介绍了如何在ESP32-S3平台上深度适配LVGL图形库,包括硬件选型、开发环境搭建、显示驱动优化、内存管理策略及渲染性能调优。通过实战案例分享,帮助开发者实现流畅的嵌入式GUI体验,特别适合智能家居中控屏和工业HMI应用场景。

ss78901的博客 1019

ESP32-S3驱动ILI9341 LCD屏:LVGL移植与性能优化实战

本文详细介绍了在ESP32-S3平台上移植LVGL图形库并驱动ILI9341 LCD屏幕的实战过程。内容涵盖硬件选型、环境搭建、显示驱动实现、LVGL配置、内存优化策略及双缓冲机制,重点分享了在ESP-IDF框架下进行性能优化的技巧与常见问题解决方案,帮助开发者高效构建嵌入式GUI应用。

qsc90123456的博客 234

ESP32-S3新手避坑:用ESP-IDF V5.4.1给ILI9341屏移植LVGL v8.3.11的完整流程

本文详细介绍了如何在ESP32-S3开发板上使用ESP-IDF V5.4.1为ILI9341屏幕移植LVGL v8.3.11的完整流程。从硬件选型、环境搭建到驱动层移植、内存管理及性能优化,提供了全面的避坑指南和实战技巧,帮助开发者高效完成图形界面开发。

weixin_30855761的博客 260

Micropython实战:ESP32驱动ILI9341触摸屏实现LVGL动态UI设计

本文详细介绍了使用Micropython在ESP32上驱动ILI9341触摸屏并实现LVGL动态UI设计的完整实战方案。内容涵盖硬件连接、固件烧录、LVGL库初始化、核心控件创建与事件绑定,并通过一个智能家居控制面板项目演示了多页面管理、样式美化及数据交互等进阶技巧,为嵌入式GUI开发提供了高效、低门槛的解决方案。

tgb345678的博客 519

ESP32-S3驱动AXS15260屏:LVGL9移植实战指南

嵌入式GUI开发中,在MCU上驱动大尺寸IPS屏并运行LVGL是常见需求。ESP32-S3作为高算力芯片,支持RGB接口,可以直连480x800分辨率的AXS15260屏幕。但这类方案涉及SPI初始化、RGB时序、帧缓冲等多层配合,很多开发者因初始化和时序配置不当而遭遇白屏。AXS15260驱动IC虽资料分散,但通过理解RGB并口与3-wire SPI的控制链路,正确配置LVGL9的显示驱动与缓存模型,即可实现流畅界面。该方案适用于仪表盘、HMI、桌面摆件等场景,掌握后可推广到同类RGB接口屏。本文以实践为

weixin_34274029的博客 571

ESP32-S3驱动SPI屏幕踩坑记:从官方Demo到流畅运行LVGL的完整配置流程

本文详细介绍了ESP32-S3驱动SPI屏幕并流畅运行LVGL的完整配置流程,包括硬件选型、SPI显示驱动优化、触摸屏开发与校准、LVGL集成与性能调优等关键步骤。针对常见问题提供了排查指南和深度优化建议,帮助开发者快速解决兼容性和性能瓶颈问题,实现30FPS的稳定刷新率。

weixin_30521161的博客 415

ESP32S3+LVGL9驱动SPI屏全攻略:从ST7789到ILI9488

在嵌入式设备中,SPI接口液晶屏是低成本、易上手的显示方案,而LVGL作为开源图形库,为小尺寸人机交互界面提供了高效渲染能力。其核心原理是通过显示驱动将UI像素数据经SPI总线传输至LCD控制器,再配合DMA双缓冲机制实现流畅刷新。ESP32-S3凭借强大的SPI外设和向量指令支持,能轻松驱动ST7789、ST7735、ILI9341等常见屏。针对240x320分辨率下动画卡顿、花屏等问题,合理配置DMA传输与LVGL9的partial refresh模式可显著提升帧率。本文基于ESP-IDF与LVGL9,

weixin_29173777的博客 431

ESP32-S3驱动1.83寸触摸屏:LVGL移植与性能优化实战

SPI和I2C是嵌入式系统中两种最基础且广泛应用的串行通信协议,分别用于高速数据传输和多设备管理。SPI通过主从架构和全双工通信实现高效数据交换,而I2C则凭借简单的两线制和多主从能力在传感器、EEPROM等场景中普及。其技术价值在于为微控制器与外围设备提供了稳定、灵活的硬件抽象层,极大简化了嵌入式开发。在物联网和智能硬件领域,这些接口常用于连接显示屏、触摸传感器等模块,构建人机交互界面。本文聚焦于如何利用ESP32-S3的硬件SPI和I2C资源,高效驱动1.83寸电容触摸屏,并深入探讨了LVGL图形库的移

weixin_29170327的博客 258

ESP32驱动ST7796移植LVGL:ESP-IDF从SPI到显示驱动实战

在嵌入式开发中,LCD屏驱动与UI框架的整合是构建交互界面的关键环节。SPI接口因其节省引脚、速率适中的特点,常被用于中尺寸液晶屏的通信,而ST7796正是480x320分辨率SPI屏的常见主控芯片。理解其初始化序列、寄存器控制以及DMA传输机制,是稳定驱动屏幕的基础。同时,LVGL作为开源图形库,为资源受限的MCU提供了流畅的图形界面能力。在实际工程中,使用ESP-IDF代替Arduino封装,能更灵活地控制SPI总线与内存管理,尤其在启用PSRAM后,可显著提升LVGL的刷新性能。本文从SPI基础原理出

weixin_29169899的博客 348

ESP32-S3移植LVGL图形库实战:从驱动适配到性能优化

在嵌入式系统开发中,图形用户界面(GUI)的实现是提升产品交互体验的关键。其核心原理在于通过图形库将底层硬件驱动与上层应用逻辑解耦,从而高效管理屏幕绘制、触摸输入和用户事件。LVGL(Light and Versatile Graphics Library)作为一款开源、轻量且功能丰富的嵌入式图形库,其技术价值在于提供了控件、动画、样式系统等高级抽象,极大降低了复杂GUI的开发门槛。在ESP32-S3这类高性能MCU平台上,结合其双核架构与大容量PSRAM,LVGL能够流畅运行,适用于智能家居面板、工业HM

weixin_30887919的博客 423

ESP32-S3驱动AXS15260屏幕跑LVGL 9:RGB接口实战

嵌入式图形界面开发中,驱动高分辨率LCD屏幕是常见技术难点。并行RGB接口屏幕需要控制器持续输出像素数据,帧缓冲和内存带宽直接影响流畅度。ESP32-S3 内置 LCD_CAM 外设并支持 PSRAM,可承载 800x480 级别的 RGB 屏数据;LVGL 9 则提供了现代图形库的高效渲染能力。这套组合适用于智能家居面板、桌面信息屏、DIY仪表盘等场景。围绕 AXS15260 驱动 IC 的初始化、LVGL 9 显示驱动对接、缓冲策略与性能优化,给出了从硬件接线到问题排查的实践路径。

weixin_33862993的博客 438

ESP32-S3+LVGL+TFT_eSPI嵌入式GUI开发实战指南

在物联网与智能硬件领域,嵌入式图形用户界面(GUI)已成为产品交互的关键环节。如何在高性价比的MCU平台上实现流畅、稳定的界面渲染,是开发者普遍关注的问题。本文从GUI底层原理出发,阐述LVGL图形库与TFT_eSPI驱动库的工作机制,以及ESP32-S3双核处理器与PSRAM大容量内存对图形性能的支撑价值。通过合理的帧缓冲策略与SPI高速通信,即使入门级硬件也能达到30fps以上的刷新率,满足温湿度采集器、桌面摆件等典型场景需求。文章还深入解析了白屏、花屏、触摸失灵等高频问题的排查链路,为开发者提供从硬件

weixin_30357231的博客 622

ESP32-S3驱动1.85寸触摸屏:硬件解析、LVGL移植与性能优化实战

嵌入式图形用户界面(GUI)开发是物联网设备实现本地交互的关键技术,其核心在于选择合适的微控制器与显示模组,并搭配高效的图形库。ESP32-S3作为一款集成Wi-Fi/蓝牙的双核MCU,凭借其主频、PSRAM和丰富外设,为嵌入式GUI提供了坚实的硬件基础。LVGL(Light and Versatile Graphics Library)因其开源、可裁剪及丰富控件,成为构建流畅界面的首选软件库,能有效发挥硬件性能并提升开发效率。本文聚焦于ESP32-S3与1.85寸电容触摸屏的组合,深入剖析其硬件连接、驱动

weixin_29174141的博客 273

ESP32-S3刷屏优化实战:SPI、DMA与双缓冲全解析

在嵌入式GUI开发中,屏幕刷新效率往往是影响用户体验的关键瓶颈。许多开发者会遇到全屏图像卡顿、菜单掉帧、CPU占用过高等问题,其根源通常在于底层数据传输机制与帧缓冲策略的设计不当。本文从显示驱动的基础原理出发,讲解如何通过硬件SPI、DMA传输及双缓冲机制,有效减轻处理器负担,提升屏幕刷新流畅度。结合ESP-IDF与LVGL图形库的工程实践,给出了一套完整可落地的代码示例和调试思路,适用于智能家居面板、小型HMI设备等物联网显示应用。无论你是初学MCU驱动LCD,还是正在优化量产设备的帧率表现,本文都能提供

weixin_33901641的博客 434

ESP32-S3+CO5300+LVGL9:从SPI驱动移植到性能优化实战

在嵌入式界面开发中,MCU+小型LCD+轻量级图形库是低成本人机交互的典型方案。其核心原理是通过SPI接口将像素数据传输至屏幕内置显存(GRAM),主控仅需负责图形逻辑和帧缓冲管理,无需Linux系统或HDMI。这种方案在桌面摆件、智能家居面板、小型仪表盘等场景具有高性价比和低功耗优势。然而,实际开发中常出现屏幕不亮、花屏、触摸偏移等问题,根源多在驱动配置、SPI时序或LVGL适配层。围绕ESP32-S3、CO5300显示屏及LVGL9的组合,重点解析硬件接线、驱动IC初始化、lv_conf.h配置、DMA

weixin_34377919的博客 328

ESP32-S3+LVGL实战:从环境搭建到TFT彩屏性能优化

嵌入式图形用户界面(GUI)开发中,选择合适的微控制器与图形库组合是项目成败的关键。LVGL作为开源嵌入式图形库,凭借轻量级、控件丰富、渲染高效等特性,广泛应用于仪表盘、工控面板与智能家居触摸屏。ESP32-S3芯片搭配N16R8(16MB Flash+8MB PSRAM)模组,凭借双核240MHz处理能力、充足的内存资源及对SPI/并行LCD接口的支持,成为驱动彩色TFT屏幕的高性价比方案。从开发环境搭建出发,对比原生ESP-IDF与PlatformIO两种路线,重点阐述LVGL 9.x在ESP-IDF中

weixin_34335458的博客 444

ESP32-C6驱动1.47寸LCD:SPI接口、LVGL图形库与低功耗优化实战

SPI(串行外设接口)是嵌入式系统中连接微控制器与外围设备(如显示屏、传感器)的常用同步串行通信协议,以其接线简单、占用I/O少、支持全双工通信等特性,成为小型显示模块的首选接口。其工作原理基于主从架构,通过时钟线同步,在主设备控制下进行数据交换。在物联网和智能硬件领域,SPI接口的价值在于能够高效驱动各类外设,是实现设备本地交互与数据可视化的关键技术。典型的应用场景包括智能家居传感器面板、可穿戴设备状态显示以及便携式仪器仪表等。本文以ESP32-C6微控制器驱动1.47寸LCD屏幕为例,深入探讨了基于SP

weixin_31887307的博客 276

ESP32与LVGL完美结合:TFT_eSPI驱动配置全攻略

本文详细介绍了如何将ESP32与LVGL图形库通过TFT_eSPI驱动完美结合,实现高效嵌入式GUI开发。内容涵盖开发环境搭建、TFT_eSPI驱动配置、LVGL移植技巧及性能优化方案,特别适合需要低成本、高性能图形界面的物联网设备开发。

weixin_28454475的博客 409
上一篇: 从GPIO位操作到协议栈:软件模拟SPI的跨平台移植实践
下一篇: UDS诊断协议在车载网络中的安全渗透与防御实践
随身带U盘
博客等级 码龄4年 30粉丝 1526原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值