STM32L431RC微控制器上UART与DMA高效结合实现

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文详细介绍如何在STM32L431RC微控制器上通过STM32CubeMX配置和实现使用LL库的UART与DMA结合,以进行高效数据传输。首先解释STM32L431RC微控制器的特性,接着通过具体步骤展示如何利用STM32CubeMX工具来初始化和配置UART接口、设置波特率、配置GPIO引脚、启用DMA通道,并介绍如何编写LL库函数进行LED控制、按键检测、实现延迟功能和串口通信。同时,详细讲解DMA的配置要点和使用方法。总结指出,该项目工程示例有效演示了在STM32L4系列微控制器上通过DMA实现UART1串口高效数据发送,帮助开发者更好地理解和应用这些功能以提升嵌入式系统的性能。 1_UART_DMA.rar

1. STM32L431RC微控制器特性

1.1 STM32L431RC概述

STM32L431RC是ST公司出品的一款基于ARM Cortex-M4内核的微控制器,属于STM32L4系列。这款微控制器的设计理念注重在低功耗与高性能之间的平衡,使之成为可穿戴设备、智能传感器和任何对能效比有高要求的应用的理想选择。

1.1.1 微控制器的设计理念

在设计理念上,STM32L431RC采用了动态电压调整技术,在保证性能的同时降低工作电压,进而减少功耗。此策略使其在电池供电的应用场景中表现出色,如物联网设备和便携式医疗仪器。

1.1.2 核心架构和性能指标

核心架构方面,STM32L431RC集成了高效的ARM Cortex-M4处理器,运行频率最高可达80MHz,内建浮点运算单元(FPU),并且拥有256KB的闪存和64KB的SRAM。这样的内存配置可以很好地应对中等复杂度的嵌入式应用需求。

2. STM32CubeMX配置UART和DMA

2.1 STM32CubeMX工具简介

2.1.1 工具的基本功能和操作流程

STM32CubeMX 是 STMicroelectronics 提供的一个图形化配置工具,用于方便地配置STM32系列微控制器的参数。通过图形化界面,它能够帮助开发者设置时钟树、配置外设参数、生成初始化代码等。这个工具支持多种开发环境,包括但不限于Keil MDK-ARM、IAR Embedded Workbench以及GCC-based IDEs。

操作流程大致如下: 1. 在开始项目之前,首先需要在ST官方网站下载并安装STM32CubeMX。 2. 打开软件后,创建新项目,并选择目标微控制器STM32L431RC。 3. 在配置界面,可以看到左侧是树状结构的微控制器外设列表,右侧是图形化的时钟树配置界面。 4. 通过勾选或点击相应的外设,打开配置窗口,可以设置外设的参数。 5. 在时钟树配置界面,可以直观地设计MCU的时钟分配。 6. 配置完成后,点击左上角的“Generate Code”按钮,STM32CubeMX会为所选择的IDE生成初始化代码。 7. 生成代码后,就可以在对应的IDE中打开项目,开始编写业务逻辑代码。

2.1.2 通过STM32CubeMX进行项目初始化

使用STM32CubeMX进行项目初始化是快速启动STM32开发的首选方法。开发者可以跳过手动配置寄存器的繁琐步骤,直接通过图形化界面配置所需外设和参数。以下是具体步骤:

  1. 启动STM32CubeMX,点击左上角“New Project”按钮,然后选择STM32L431RC微控制器或者使用MCU选择器选择对应的型号。
  2. 在“Pinout & Configuration”标签页,配置所需的外设以及相关的引脚分配。
  3. 在“Clock Configuration”标签页,设计MCU的时钟树,确保系统时钟满足性能和功耗需求。
  4. 在“Project”标签页,填写项目名称,选择目标IDE,STM32CubeMX可以为Keil MDK-ARM、IAR、SW4STM32、TrueSTUDIO等生成初始化代码。
  5. 配置完成后,点击“Project Settings”调整代码生成的设置,例如HAL库版本、中间件配置等。
  6. 最后,在顶部菜单栏点击“Project” -> “Generate Code”生成代码。

STM32CubeMX不仅可以生成初始化代码,还能基于所做配置生成项目结构文件,这样开发者便能立即开始编写应用层代码。

2.2 UART配置过程详解

2.2.1 UART参数设置与引脚分配

UART配置是嵌入式系统中常见的通信接口配置。在STM32CubeMX中,通过图形化界面进行UART参数配置和引脚分配的过程非常直观。下面是详细步骤:

  1. 在STM32CubeMX的“Pinout & Configuration”标签页,找到并点击“Connectivity”分组下的“USART1”或所需UART外设。
  2. 点击后,软件会自动选择合适的引脚,并在引脚分配图上显示为灰色,表示该引脚已被占用。
  3. 如需手动分配引脚,可以在“GPIO Settings”分组中更改引脚位置,或者点击引脚分配图上的对应引脚,选择“Change”进行重新分配。
  4. 接下来,在“Configuration”分组中,可以设置UART参数,如波特率、字长、停止位以及校验位。
  5. 为了优化电源管理,可以开启低功耗模式下的UART唤醒功能。

2.2.2 中断和DMA在UART通信中的配置

UART通信中,中断和DMA(直接内存访问)是提高数据处理效率的重要机制。STM32CubeMX同样提供了方便的配置方式:

  1. 在“Configuration”分组中,选择“NVIC Settings”以开启和配置中断。
  2. 在“DMA Settings”分组中,为UART的接收和发送选择合适的DMA通道。
  3. 在“DMA Settings”窗口中,配置DMA传输模式、优先级、缓冲区大小等参数。
  4. 确保外设的DMA请求使能。例如,在UART配置中,通常需要确保“TXE”(发送缓冲区为空)和“RXNE”(接收缓冲区非空)事件能够触发DMA传输。

通过以上步骤,能够完成基本的UART通信配置,并且利用中断和DMA进一步提升性能。

2.3 DMA配置与优化

2.3.1 DMA参数设置和传输模式选择

在STM32CubeMX中,DMA配置以用户友好的方式提供,便于优化内存与外设之间的数据传输。配置步骤如下:

  1. 在“Pinout & Configuration”标签页,找到需要配置的UART或其它外设的DMA请求。
  2. 选择“DMA Settings”分组中的“Add”按钮,添加DMA通道。
  3. 在“DMA Settings”分组中,选择合适的DMA传输模式,如“Normal Mode”、“Circular Mode”等。
  4. 配置DMA传输参数,包括源地址、目标地址、传输大小和传输方向。
  5. 设置DMA的优先级,特别是在多个DMA请求同时发生时,确保高优先级的请求优先处理。

2.3.2 DMA优先级和数据缓冲的管理

在多个DMA通道同时活跃的情况下,合理分配DMA优先级是避免资源冲突和保证数据正确传输的关键。以下是优先级管理的步骤:

  1. 在“DMA Settings”分组中,查看当前通道的优先级设置。
  2. 在“Global Settings”分组中,可以调整“DMA global settings”以改变通道的默认优先级设置。
  3. 为避免数据缓冲区溢出,合理设置缓冲区的大小至关重要。可以在初始化代码中动态分配或在STM32CubeMX中静态预分配。
  4. 对于循环模式的DMA传输,需要确保源地址和目标地址的指针能够正确更新,避免数据覆盖或丢失。

通过上述配置和管理,可以确保DMA传输过程的高效和安全,最终优化整个系统的性能。

3. LL库编程实现基础功能

3.1 LL库概述和优势

3.1.1 LL库与HAL库的对比

LL库(Low Layer library)是ST公司为STM32微控制器提供的一套底层硬件抽象层库,与之相对的是HAL库(Hardware Abstraction Layer library)。LL库提供了更接近硬件的访问方式,直接操作寄存器,允许开发者以更高的效率实现微控制器的精细控制。HAL库则提供更为高级的函数接口,使得开发者能够以更简洁的方式进行编程,同时屏蔽了硬件层面的细节。

在性能要求较高的应用场景下,LL库能够带来更好的响应时间和更少的资源占用,因为它避免了HAL库中一些抽象层带来的开销。然而,这也意味着开发者需要更深入地了解硬件细节以及STM32的架构,才能充分利用LL库的优势。

3.1.2 LL库在STM32项目中的应用优势

使用LL库能够为开发者带来以下优势:

  • 代码优化 :LL库可以对特定的硬件资源进行直接操作,便于在关键任务中进行性能优化。
  • 资源占用 :适用于资源受限的应用,减少不必要的代码和库占用,尤其是在微控制器存储空间紧张的情况下。
  • 控制精度 :适合需要精确控制硬件时序和功能的应用。
  • 定制化开发 :对于追求极致性能或者需要定制底层驱动的项目,LL库提供了必要的灵活性。

然而,LL库的缺点在于编写难度较高,对开发者的要求更为严格,错误的寄存器操作可能会导致不可预料的后果。

// 示例代码:使用LL库初始化GPIO
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_1, LL_GPIO_MODE_OUTPUT);
LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_1, LL_GPIO_OUTPUT_PUSHPULL);
LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_1, LL_GPIO_SPEED_FREQ_HIGH);
LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_1, LL_GPIO_PULL_NO);

在上述代码中,我们启用了GPIOA时钟,设置了GPIOA的第1个引脚为输出模式,推挽输出类型,高速模式,以及无上下拉电阻。这只是一个简单的配置示例,实际上LL库提供了丰富的函数来操作各种硬件资源。

3.2 基于LL库的UART编程

3.2.1 使用LL库初始化和配置UART

与HAL库类似,LL库也提供了基础的配置和初始化函数,但它们通常更接近硬件,操作更为直接。下面的示例展示了如何使用LL库初始化UART。

// 示例代码:使用LL库配置UART
LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_USART1);
LL_USART_InitTypeDef USART_InitStruct = {0};
USART_InitStruct.BaudRate = 9600;
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
USART_InitStruct.TransmissionMode = LL_USART_TRANSMISSION_MODE_TX_RX;
LL_USART_Init(USART1, &USART_InitStruct);
LL_USART_Enable(USART1);

在这个过程中,首先启用了USART1的时钟,然后初始化了UART的相关参数,包括波特率、数据位宽、停止位、校验位、硬件流控制和传输模式,并最终使能了USART1。

3.2.2 LL库中的UART中断和DMA操作

LL库同样支持UART中断和DMA操作,但由于其底层性,开发者需要手动编写更多控制代码。以下是使用LL库配置DMA的代码示例:

// 示例代码:使用LL库配置DMA传输
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);
LL_DMA_InitTypeDef DMA_InitStruct = {0};
DMA_InitStruct.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH;
DMA_InitStruct.PeriphOrM2MSrcAddress = (uint32_t)&USART1->DR;
DMA_InitStruct.MemoryOrM2MDstAddress = (uint32_t)buffer;
DMA_InitStruct.NbData = size;
DMA_InitStruct.PeriphRequest = LL_DMA_REQUEST_4;
DMA_InitStruct.Mode = LL_DMA_MODE_NORMAL;
DMA_InitStruct.Priority = LL_DMA_PRIORITY_HIGH;
LL_DMA_Init(DMA1_Channel6, &DMA_InitStruct);
LL_DMA_EnableIT_TC(DMA1_Channel6);
LL_DMA_EnableChannel(DMA1_Channel6);

在这段代码中,我们首先使能了DMA1的时钟,然后初始化了DMA传输的方向、目的地址、源地址、数据长度、请求源、传输模式、优先级等参数,最后使能了DMA通道和传输完成中断。

3.3 基于LL库的DMA编程

3.3.1 DMA传输流程和状态管理

在LL库中,DMA传输的流程涉及到硬件资源的配置、传输参数的设置以及传输状态的管理。DMA传输流程可以概括为以下步骤:

  1. 初始化和配置DMA通道和传输参数。
  2. 开启DMA传输请求,启动数据传输。
  3. 等待传输完成或处理传输中的中断事件。

状态管理通常涉及到检查DMA传输的状态寄存器,以确认传输是否完成、是否有错误发生等。

3.3.2 DMA中断处理和错误处理

在使用DMA进行数据传输时,中断是监控和控制传输状态的重要手段。开发者需要在中断服务程序(ISR)中实现必要的逻辑来处理传输完成、半传输完成、错误等情况。

void DMA1_Channel6_IRQHandler(void) {
    if (LL_DMA_IsActiveFlag_TC6(DMA1)) {
        LL_DMA_ClearFlag_TC6(DMA1);
        // 数据传输完成后的处理逻辑
    }
    if (LL_DMA_IsActiveFlag_TE6(DMA1)) {
        LL_DMA_ClearFlag_TE6(DMA1);
        // 传输错误处理逻辑
    }
}

在此例中,我们检查了传输完成标志和传输错误标志,并在标志被设置时进行了相应的处理。错误处理可能包括重新启动传输、记录错误日志、执行补偿措施等。

代码与表格

表格:LL库与HAL库对比

| 特性 | LL库 | HAL库 | | --- | --- | --- | | 底层访问 | 直接操作寄存器 | 硬件抽象层封装 | | 性能 | 更高 | 适中 | | 易用性 | 更复杂 | 更简单 | | 代码体积 | 更小 | 更大 | | 资源占用 | 更少 | 更多 |

mermaid流程图:DMA传输流程

graph LR
    A[开始DMA传输] --> B{DMA传输请求}
    B --> |有| C[启动DMA传输]
    B --> |无| D[等待传输请求]
    C --> E[数据传输中]
    E --> F{检查传输状态}
    F --> |完成| G[传输完成处理]
    F --> |错误| H[错误处理]
    G --> I[传输结束]
    H --> I

通过上述内容,我们深入地探讨了LL库在STM32项目中的应用,包括其与HAL库的对比,以及如何在LL库的基础上实现UART和DMA的基本功能。这种底层库的使用,尽管复杂,却为开发者提供了更大的自由度和性能优化的可能性。在接下来的章节中,我们将进一步探讨DMA配置与使用要点,以及如何将UART和DMA结合到实际的项目实践中去。

4. DMA配置与使用要点

4.1 DMA传输机制和类型

4.1.1 DMA传输的同步与异步机制

DMA(直接内存访问)是一种让外围设备可以直接访问系统内存的技术,而无需CPU的介入,从而提高数据传输效率。同步和异步是DMA传输的两种基本机制。

在同步机制中,DMA控制器在完成一次数据传输后,会通知处理器,此时处理器才进行下一次数据处理。这种模式适用于数据传输速率较慢的情况,因为它会阻塞CPU直到传输完成。

异步机制指的是DMA传输可以在CPU执行其他任务的同时进行。当DMA传输开始时,处理器会立即返回执行其他任务,DMA控制器负责完成整个内存传输过程。这种机制允许CPU充分利用资源,实现更高效的多任务处理。

在实际应用中,选择同步还是异步机制,需要根据具体需求和资源利用效率来决定。例如,在高速通信或需要低延迟处理的场合,往往采用同步机制;而在不需要即时处理大量数据的场合,则可以选择异步机制。

4.1.2 不同DMA传输类型的应用场景

STM32L431RC支持多种DMA传输类型,包括周期性传输、块传输和请求传输等。每种类型适用于不同的应用需求。

周期性传输适合于定期更新数据的场景,例如,定期从传感器读取数据并更新到显示设备上。

块传输则适用于需要传输大量连续数据的场景,例如,读取存储器块数据或者在内存中进行大规模数据处理。

请求传输则适用于外设在特定条件下请求数据传输的场景,例如,使用ADC进行模数转换时,每当转换完成时触发一次DMA请求。

了解各种传输类型,有助于根据项目的具体需求,选择最适合的DMA传输方式,以优化性能和资源使用。

4.2 DMA缓冲区管理

4.2.1 缓冲区的分配与释放策略

在进行DMA操作时,合理的缓冲区管理至关重要。缓冲区是数据传输过程中暂时存储数据的内存区域。如何分配和管理这些缓冲区,直接关系到系统性能和稳定性。

缓冲区的分配可以通过静态声明或动态分配来完成。静态分配在编译时确定缓冲区大小,简单且效率较高,但灵活性不足;动态分配则根据实际需要在运行时分配内存,具有更高的灵活性,但可能会引入额外的系统开销。

缓冲区的释放策略也非常重要。当DMA传输完成后,缓冲区应该被适时释放以供其他操作使用。在一些高实时性的应用场景中,及时释放缓冲区至关重要,否则可能会导致系统资源耗尽或响应时间延长。

通常,缓冲区的分配和释放需要结合应用程序的内存管理策略以及DMA传输的特点来共同考虑。开发者应当确保缓冲区在使用完毕后能够被正确地释放,以避免内存泄漏。

4.2.2 缓冲区溢出和下溢的处理方法

在进行DMA操作时,缓冲区溢出和下溢是潜在的危险。缓冲区溢出指的是DMA传输试图写入的数据超出了缓冲区分配的内存空间;下溢则是指DMA尝试从已空的缓冲区中读取数据。

为了避免这些情况,需要采取相应的策略:

  1. 预留缓冲区头部和尾部空间,用于存放额外的状态信息和校验码,以检测数据是否已写满或读空。
  2. 在DMA传输开始前,对缓冲区进行初始化,确保其包含有效的起始和结束标记。
  3. 使用DMA的循环传输模式,使缓冲区形成环状结构,当DMA传输到达缓冲区末尾时自动回到起始位置继续传输。

合理处理缓冲区溢出和下溢,能保证DMA传输的连续性和稳定性,降低潜在的系统错误和数据损坏风险。

4.3 DMA性能调优与故障排除

4.3.1 提升DMA传输效率的技术手段

DMA传输效率的提升可以从多个方面考虑:

  1. 使用高速外设 :选择支持高速传输的外设,如高速存储器、USB接口等。
  2. DMA传输模式的优化 :根据数据传输特点选择合适的传输模式,如循环模式、请求模式等。
  3. 缓冲区大小的调整 :合理设置缓冲区大小,既避免频繁的缓冲区切换,又保证数据传输的及时性。
  4. 多通道DMA使用 :对于具有多个DMA通道的微控制器,合理规划各通道的传输任务,以充分利用资源。

通过这些技术手段,可以最大限度地发挥DMA的性能优势,提高系统的数据处理能力。

4.3.2 常见DMA故障的诊断与解决

在开发过程中,DMA可能出现各种故障。常见的DMA故障及解决方法如下:

  1. 传输未完成或延迟 :检查DMA优先级设置,确保关键任务获得足够的传输优先权;检查外设是否正确配置,以匹配DMA通道的传输需求。
  2. 缓冲区错误 :确保缓冲区的首尾地址正确设置,防止溢出;检查缓冲区是否被正确分配和释放。
  3. 系统稳定性问题 :分析系统日志和DMA状态寄存器,查找错误标志位,根据错误类型进行针对性处理;可能需要重新配置DMA传输参数,或者修改系统内存管理策略。

DMA故障通常与硬件配置、软件逻辑或系统资源分配不当有关。解决DMA故障,需要综合考虑硬件和软件的配合,以及系统设计的整体合理性。

以上内容详尽地介绍了STM32L431RC中DMA配置与使用的关键要点,从DMA传输的机制与类型,到缓冲区的管理,再到性能调优与故障排除,每一环节都涉及到STM32开发者在项目实践中可能遇到的问题,并提供了具体的解决思路与方法。通过这些内容的学习,开发者可以在设计和实施DMA相关功能时更加得心应手,有效提升系统的数据传输效率和稳定性。

5. UART与DMA结合的项目实践

5.1 UART与DMA结合的案例分析

在嵌入式系统中,通过UART进行数据通信是一种常见的应用场景。然而,传统的中断驱动的UART通信方式在处理大量数据时会遇到瓶颈,影响系统的整体性能。为了提高效率,我们可以将UART与DMA(Direct Memory Access)结合起来,利用DMA的特性来减轻CPU的负担。

实际项目的UART通信需求概述

在本案例中,我们关注一个需要通过UART接口与外部设备进行连续数据交换的应用。该应用要求能够处理大量数据,且对实时性有一定要求。为了满足这些需求,我们设计了一种结合DMA的数据传输机制,以避免CPU在数据传输过程中进行频繁的中断服务处理。

DMA在UART通信中的作用和效益

DMA在UART通信中的作用主要体现在以下几个方面:

  • 减少CPU负担: DMA能够直接在内存和外设之间传输数据,无需CPU介入,从而显著减少CPU的负载。
  • 提高数据传输效率: DMA传输效率高,特别适合于大数据量的连续传输,能提高系统整体性能。
  • 实现非阻塞通信: 在DMA模式下,CPU可以同时进行其他任务处理,实现真正的多任务并行工作。

5.2 项目实现中的关键技术和解决方案

高速数据通信的实现

为了实现高速数据通信,我们需要对UART与DMA进行合理配置。具体配置步骤包括:

  1. 初始化UART: 设置波特率、数据位、停止位和校验位等参数。
  2. 配置DMA通道: 选择合适的DMA通道,设置传输方向(内存到外设或外设到内存)、数据宽度、循环模式等。
  3. 设置NVIC优先级: 根据需求调整DMA和UART中断的优先级,保证中断服务的及时响应。
  4. 使能DMA请求: 在UART配置中使能DMA传输请求,确保数据传输可以由DMA自动处理。

中断和DMA在数据传输中的协同工作

在UART与DMA结合的数据传输中,中断服务程序(ISR)仍然有其重要性,主要体现在以下方面:

  • 错误处理: 当传输过程中出现错误时,如溢出、校验错误等,需要通过ISR来处理。
  • 传输完成处理: 在DMA传输完成后,需要通过ISR来确认传输成功,并进行后续的逻辑处理。

在实现过程中,我们还需要确保DMA传输完成后的中断标志位得到清除,并正确管理传输数据的缓冲区。

5.3 项目实施过程中的调试与优化

问题诊断和调试策略

在实施项目的过程中,可能会遇到各种问题,如数据丢失、传输错误等。为了有效地诊断和解决问题,我们可以采用以下策略:

  1. 逐步调试: 先在较低的速度下进行数据传输测试,逐步提高速度,观察不同阶段可能出现的问题。
  2. 硬件仿真与跟踪: 使用支持硬件调试的开发环境,结合信号跟踪工具,检查数据和控制信号的实际情况。
  3. 记录日志: 在关键位置添加代码记录日志信息,便于分析和定位问题。

代码优化和系统稳定性提升

通过DMA实现高效的数据传输后,我们还需要关注代码优化和系统稳定性提升:

  1. 代码优化: 消除冗余代码,对DMA和UART的配置进行优化,减少不必要的资源消耗。
  2. 内存管理: 确保DMA缓冲区的正确管理,避免内存泄漏和访问错误。
  3. 异常处理增强: 提高系统对于异常情况的响应能力,确保数据传输的可靠性。

通过以上策略的实施,可以显著提升系统的性能和稳定性,确保项目在实际运行中的可靠性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文详细介绍如何在STM32L431RC微控制器上通过STM32CubeMX配置和实现使用LL库的UART与DMA结合,以进行高效数据传输。首先解释STM32L431RC微控制器的特性,接着通过具体步骤展示如何利用STM32CubeMX工具来初始化和配置UART接口、设置波特率、配置GPIO引脚、启用DMA通道,并介绍如何编写LL库函数进行LED控制、按键检测、实现延迟功能和串口通信。同时,详细讲解DMA的配置要点和使用方法。总结指出,该项目工程示例有效演示了在STM32L4系列微控制器上通过DMA实现UART1串口高效数据发送,帮助开发者更好地理解和应用这些功能以提升嵌入式系统的性能。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值