TM4C123G LaunchPad Workshop: ADC应用与开发

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

简介:本工作坊旨在帮助开发者深入学习和掌握TM4C123G芯片的UART、SSI和ADC等接口应用开发。通过学习如何配置UART通信参数、SSI通信设置及ADC模块配置,参与者将获得构建串行通信系统、同步数据传输和处理模拟输入的实践能力,进而在实际项目中应用这些技能。
TM4C123G_LaunchPad_Workshop.zip_TM4C123G LaunchPad_tiva_tiva adc

1. TM4C123G LaunchPad Workshop学习平台介绍

1.1 开发环境概览

TM4C123G LaunchPad是一个由德州仪器(Texas Instruments,简称TI)推出的低成本开发平台,它搭载了功能强大的TIVA TM4C123G 微控制器。开发环境集成了必要的硬件和软件工具,适合嵌入式系统开发者进行学习、原型设计和最终产品开发。该平台为学生、爱好者以及专业人士提供了一个易于上手且功能丰富的学习工具。

1.2 核心功能与组件

该平台的核心功能包括了支持USB编程、提供GPIO访问、内置调试器、以及一系列集成的外设如ADC、UART、SSI、定时器等。它拥有多达256个引脚,其中包含多达43个GPIO引脚,使得开发者可以接入各种传感器和执行器。

1.3 开发环境搭建

搭建开发环境非常简单,用户首先需要下载并安装TI提供的Code Composer Studio IDE,它包含了编译器、调试器和项目管理器等。然后连接LaunchPad到计算机的USB端口,并安装相应的驱动程序,最后便可以开始使用IDE进行编程和调试。

这个平台不仅是学习嵌入式系统设计的理想选择,还能帮助开发者快速验证和测试他们的想法。通过接下来的文章,我们将深入探讨如何配置和应用TM4C123G的多个关键接口,以及如何通过实践项目提升嵌入式系统设计能力。

2. UART通信接口配置与应用

2.1 UART通信基础

2.1.1 UART通信原理及特点

UART (Universal Asynchronous Receiver/Transmitter) 是一种广泛应用于微控制器和计算机接口的异步串行通信协议。它允许设备之间通过简单的两根线(发送和接收)进行数据传输。UART通信不需要时钟信号,因为它使用起始位、数据位、可选的奇偶校验位和停止位来同步数据传输。

UART通信的主要特点包括:
- 异步传输 :数据可以在没有共享时钟信号的情况下发送和接收。
- 简单的物理接口 :只需要两根线进行全双工通信(TX和RX)。
- 可配置的速率 :允许设定不同的波特率来适应不同距离和速度的需求。
- 错误检测 :通过可选的校验位可以检测数据传输错误。

UART通信的关键在于双方设备必须事先设定好一致的通信参数,如波特率、数据位、停止位和校验位,否则数据可能无法正确解读。

2.1.2 TM4C123G中UART模块的结构与功能

TM4C123G是德州仪器(Texas Instruments)推出的一款高性能Cortex-M4微控制器,其内部集成了多个UART模块,每个模块都具有独特的功能,能够支持不同的数据通信任务。

TM4C123G中UART模块的功能特点如下:
- 可编程波特率 :用户可以通过设置时钟源和分频器来自定义通信的波特率。
- 中断驱动 :模块支持中断处理机制,能够处理接收到的数据,提高数据处理效率。
- 硬件流控制 :通过RTS/CTS或DTR/DSR等引脚实现硬件流控制,确保数据传输的可靠性。
- 可配置数据格式 :用户可以设置数据位(5-8位)、停止位(1-2位)和无校验位或奇偶校验位。
- FIFO缓冲区 :内置的先进先出(FIFO)缓冲区可以减少CPU负担,提高数据吞吐能力。

TM4C123G的UART模块不仅支持基本的异步通信模式,还能够实现特殊的通信模式,比如调制解调器接口和红外传输等。

2.2 UART配置流程详解

2.2.1 UART初始化参数设置

UART初始化配置涉及设置波特率、数据位、停止位和校验位等参数,确保通信双方能够正确同步和通信。以下是在TM4C123G上进行UART初始化配置的一般步骤:

  1. 时钟使能 :首先需要使能UART模块和GPIO端口的时钟。
  2. GPIO引脚配置 :将GPIO引脚配置为UART功能。
  3. UART模块配置
    - 设置波特率。波特率由系统时钟、波特率分频器(UARTIBRD)和小数波特率分频器(UARTFBRD)确定。
    - 配置数据位数、停止位和校验位。这些参数通过UARTLCRH寄存器进行设置。
    - 开启发送和接收 FIFO,以及FIFO的中断触发级别。
  4. 中断配置 (可选):如果使用中断方式,需要配置UART的中断使能,并在中断服务程序中处理。
  5. 启用UART模块 :最后,通过设置UARTCTL寄存器中的UARTEN位来启用UART模块。

示例代码:

SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // 使能UART0时钟
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // 使能GPIOA时钟

 GPIOPinConfigure(GPIO_PA0_U0RX); // 配置GPIO为UART接收
 GPIOPinConfigure(GPIO_PA1_U0TX);
 GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // 设置GPIO功能为UART

 UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), BAUD_RATE, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); // 设置波特率、数据位、停止位和无校验

 UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT); // 使能接收和接收空中断
 IntEnable(INT_UART0); // 使能UART0中断

 UARTEnable(UART0_BASE); // 启用UART模块

2.2.2 异步通信模式配置

在异步通信模式中,数据可以在任意时刻发送,不需要时钟同步信号。配置TM4C123G的UART模块以异步模式进行通信,需要设置UARTCTL寄存器,确保没有启用同步模式标志位。

代码示例:

 UARTCTL = 0; // 清除所有控制位
 UARTCTL |= UART_CTL_UARTEN; // 启用UART模块

 UARTIBRD = (SysCtlClockGet() / (UART_BAUD_RATE * 16)) / 65536; // 设置波特率
 UARTFBRD = (SysCtlClockGet() / (UART_BAUD_RATE * 16)) % 65536;

在此配置中, UART_BAUD_RATE 是用户定义的波特率值, SysCtlClockGet() 用于获取系统时钟频率,然后据此计算出波特率分频器的值。

2.3 UART数据传输实践

2.3.1 编写UART收发数据的代码

编写代码以发送和接收数据是UART通信的关键环节。在TM4C123G上实现这一功能,通常需要编写函数来处理UART数据的发送和接收。

示例代码用于数据发送:

void UARTSendData(unsigned long ulBase, unsigned char *pucData, unsigned long ulLength)
{
    // 等待直到发送FIFO为空
    while(ulLength--)
    {
        while(UARTFR_RTRIM & UART_FR_TXFF)
        {
            // 等待FIFO不满
        }
        UARTDR = *pucData; // 写入数据到UART数据寄存器
        pucData++; // 移动到下一个字节
    }
}

接收数据的示例代码:

void UARTReceiveData(unsigned long ulBase, unsigned char *pucBuffer, unsigned long ulLength)
{
    // 等待直到接收到数据
    while(ulLength--)
    {
        while(!(UARTFR_RTRIM & UART_FR_RXFE))
        {
            *pucBuffer++ = UARTDR; // 从UART数据寄存器读取数据
        }
    }
}

2.3.2 测试与调试UART通信

在编写完数据发送和接收的代码之后,接下来需要编写测试代码来验证UART通信是否正常工作。在测试过程中,可以通过串口调试助手或者使用另一个串口设备来发送和接收数据。

测试步骤包括:
1. 初始化UART端口并设置为适当的波特率。
2. 使用 UARTSendData 函数发送已知的测试字符串。
3. 使用 UARTReceiveData 函数读取回送的字符串。
4. 比较发送的字符串和接收到的字符串是否一致,以判断通信是否成功。
5. 如果发现数据不匹配,检查硬件连接、波特率设置和程序逻辑。

这一阶段的调试工作通常需要借助串口打印信息、逻辑分析仪或者示波器等工具来进行。确保在通信过程中,信号电平稳定,且符合UART通信协议标准。

接下来的章节将继续介绍SSI接口设置与应用,深入探讨如何在TM4C123G平台上实现SSI通信的配置和高级应用。

3. SSI接口设置与应用

3.1 SSI通信概述

3.1.1 SSI通信协议及应用领域

串行同步接口(Serial Synchronous Interface,SSI)是一种高速串行通信协议,常用于需要精确时序控制的领域,比如工业控制、音频设备、高精度数据采集等。SSI协议能够在保证数据同步的同时,提供比传统串行接口更高的数据传输速率,非常适合于对实时性要求较高的应用场景。

3.1.2 TM4C123G中SSI模块的功能介绍

TM4C123G微控制器中的SSI模块是一种高性能的串行通信接口,支持多种同步通信协议,包括Freescal的SPI和Texas Instruments的SSI。它支持主从模式、数据帧长度可编程、多种时钟极性和相位配置以及中断和DMA支持,使得SSI模块可以灵活地应用于各种嵌入式系统中。

3.2 SSI接口配置步骤

3.2.1 SSI模块的初始化配置

为了使用SSI模块,首先需要进行初始化配置。这包括配置时钟源、设置数据格式、配置时钟极性和相位、设置主从模式以及数据帧的长度等。例如,在TM4C123G上初始化SSI模块的基本步骤如下:

void SSI_Init(void) {
    // 使能SSI模块的时钟
    SYSCTL_RCGCSSI_R |= SYSCTL_RCGCSSI_R0;
    while((SYSCTL_PRSSI_R&SYSCTL_PRSSI_R0) == 0) {}

    // 使能GPIO时钟
    SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R2;
    while((SYSCTL_PRGPIO_R&SYSCTL_PRGPIO_R2) == 0) {}

    // 配置GPIO引脚
    // 假设使用PA2, PA3为SSI0的TX, RX
    GPIO_PORTA_AFSEL_R |= 0x0C; // 使能PA2, PA3的复用功能
    GPIO_PORTA_PCTL_R = GPIO_PORTA_PCTL_R&0xFF00FFFF;
    GPIO_PORTA_PCTL_R |= 0x00220000; // 设置为SSI功能
    GPIO_PORTA_AMSEL_R |= 0x0C;    // 使能PA2, PA3的模拟功能

    // 配置SSI模块
    SSI0_CR1_R = 0x00000000;       // 关闭SSI
    SSI0_CR1_R |= SSI_CR1_SSE;     // 开启SSI模块

    // 配置SSI为主模式
    SSI0_CC_R = SSI_CC_CSMD_M;    // 主模式
    SSI0_CPSR_R = 2;              // 设置为8分频

    // 设置SSI协议,例如FS, CPOL, CPHA
    SSI0_CR0_R = SSI_CR0_FRF_M | SSI_CR0_SPO_M | SSI_CR0_SPH_M | SSI_CR0_DSS_M_8;
    // 开启SSI并配置为MSB在前
    SSI0_CR1_R |= SSI_CR1_MS;  
    SSI0_CR1_R |= SSI_CR1_SSE;
}

在上述代码中,首先启用了SSI模块和相关GPIO的时钟,接着配置了GPIO的复用功能,然后配置了SSI模块的基本参数,包括时钟速率、协议格式等。

3.2.2 同步通信模式下的参数设置

在同步通信模式下,需要设置SSI模块的通信参数,如时钟频率、数据格式、时钟极性和相位以及帧格式。这些参数决定了SSI模块如何与其他设备通信。例如,可以设置为Motorola SPI模式,配置时钟极性为低电平有效,时钟相位为上升沿采样,数据长度为16位。

3.3 SSI接口高级应用

3.3.1 SSI接口在多机通信中的配置

SSI模块支持多主机配置,这在需要一个主设备与多个从设备通信时非常有用。多主机配置通常涉及在SSI模块中设置多个帧格式,为每个从设备定制不同的参数,如不同的时钟速率、数据格式等。在配置时需要特别注意防止主机之间的冲突。

3.3.2 SSI数据同步传输的实践案例

在实践案例中,SSI接口可以用于实时地从多个传感器收集数据。例如,一个温度测量系统可能包括多个温度传感器,每个传感器通过SSI接口与微控制器通信。在这种情况下,需要为每个传感器配置一个唯一的从设备地址,并在主程序中循环访问每个从设备以收集温度数据。

int main(void) {
    // 初始化SSI
    SSI_Init();
    // 通信循环
    while(1) {
        for (int slave = 0; slave < NUM_SLAVES; slave++) {
            // 配置为对应从设备的通信参数
            SSI_ConfigureForSlave(slave);
            // 发送读取数据的命令并接收数据
            uint16_t data = SSI_ReadFromSlave(slave);
            // 处理接收到的数据...
        }
    }
}

void SSI_ConfigureForSlave(int slave) {
    // 根据从设备配置SSI参数
    // ...
}

uint16_t SSI_ReadFromSlave(int slave) {
    // 发送读取命令并读取数据
    // ...
}

在该案例中, SSI_Init 函数用于初始化SSI模块, SSI_ConfigureForSlave 用于根据特定的从设备配置SSI参数, SSI_ReadFromSlave 用于从特定的从设备读取数据。这样的循环可以保证每个从设备依次被访问,并且能够有效地处理多机通信。

在本章节中,我们详细讨论了SSI接口的配置与应用,从基础的通信协议到高级的多机通信配置,并通过实践案例展示了SSI接口在数据同步传输中的应用。希望这些内容能够帮助您更好地理解并应用SSI接口,以提升您的嵌入式系统设计能力。

4. ADC模块配置与应用

4.1 ADC模块原理与功能

4.1.1 模拟信号与数字信号转换基础

模拟信号是连续变化的物理量,如温度、声音等,而数字信号是由0和1组成的一系列离散值。模拟到数字的转换(ADC)是将模拟信号转换为数字信号的过程,这对于数据采集和处理至关重要。ADC模块利用采样和量化原理,将连续信号离散化和数字化。

  • 采样:是指按照一定的时间间隔对模拟信号进行测量,得到一系列样本值。
  • 量化:是指将样本的连续幅度离散化,分为有限的等级或数值。

在实际应用中,根据需要转换的信号类型和精度要求选择适当的ADC分辨率和采样率。

4.1.2 TM4C123G中ADC模块的技术细节

TM4C123G微控制器中的ADC模块支持多达12位的分辨率,并具备多通道采样能力。它包括一个采样/保持(sample/hold)电路以及数字转换器,能够提供较高的精度和灵活性。

  • 分辨率:决定转换后的数字值的精度,TM4C123G的ADC分辨率为12位。
  • 采样率:决定了ADC模块能够处理的信号频率上限。
  • 触发源:ADC转换可以由软件触发或多种硬件事件触发。
  • 多通道:能够顺序或同时采样多个模拟输入通道。

4.2 ADC模块的配置与应用

4.2.1 ADC初始化设置与采样率配置

在使用ADC模块前,必须先进行初始化设置,包括配置采样率、选择触发源等。以下是初始化和设置采样率的代码示例。

#include "inc/hw_types.h"
#include "inc/hw_adc.h"
#include "inc/hw_memmap.h"
#include "driverlib/adc.h"
#include "driverlib/sysctl.h"

// ADC初始化和采样率配置
void ADC0_Init(void)
{
    // 1. 使能ADC模块和GPIO端口时钟
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);

    // 2. 设置PE3、PE2和PE1为模拟输入
    GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1);

    // 3. 设置采样窗口
    ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_PROCESSOR, 0);
    // 4. 配置序列的采样模式和结果排序
    ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH1 | ADC_CTL_END | ADC_CTL_IE | ADC_CTL坐下 | ADC_CTL_16);
    ADCSequenceStepConfigure(ADC0_BASE, 3, 1, ADC_CTL_CH2 | ADC_CTL坐下 | ADC_CTL_16);
    ADCSequenceStepConfigure(ADC0_BASE, 3, 2, ADC_CTL_CH3 | ADC_CTL坐下 | ADC_CTL_16);
    // 5. 使能ADC模块
    ADCSequenceEnable(ADC0_BASE, 3);
}

在上述代码中,我们先使能了ADC0模块和相关的GPIO端口时钟,然后配置了PE3、PE2和PE1作为模拟输入。接着,我们设置了ADC序列3的采样触发源为处理器触发,并配置了采样窗口。然后,我们对序列的采样模式和结果排序进行了配置,并启用了ADC模块。

4.2.2 通道选择与数据采集流程

TM4C123G支持多达12个模拟输入通道,正确选择通道对于准确采样至关重要。数据采集流程的代码示例如下:

void ReadADCData(void)
{
    // 1. 启动ADC序列3
    ADCProcessorTrigger(ADC0_BASE, 3);

    // 2. 等待转换完成
    while(!ADCIntStatus(ADC0_BASE, 3, false))
    {
        // 等待中断标志位被硬件置位
    }

    // 3. 清除中断标志位
    ADCIntClear(ADC0_BASE, 3);

    // 4. 读取ADC序列3转换结果
    ulADC0Value = ADCSequenceDataGet(ADC0_BASE, 3);
}

在这段代码中,我们首先通过 ADCProcessorTrigger 函数启动ADC序列3进行数据转换。然后,我们通过循环等待直到转换完成,通过检查中断状态标志位实现。完成转换后,我们通过 ADCIntClear 函数清除中断标志位,避免造成中断的拥堵。最后,我们通过 ADCSequenceDataGet 函数读取转换结果。

4.3 ADC数据处理与分析

4.3.1 数据读取方法与处理技巧

数据读取是ADC模块应用中的关键环节。正确处理和分析ADC数据对于获取准确的测量结果至关重要。一些常见的数据处理技巧包括:

  • 平滑滤波:通过平均多个采样值来减少随机噪声的影响。
  • 线性化:处理非线性传感器输出,将其转换为线性比例数据。
  • 校准:在实际系统中校准ADC,以确保精确的测量。

4.3.2 ADC数据在实际项目中的应用案例

例如,在温度监测项目中,可以使用ADC模块读取温度传感器的模拟输出,并将其转换为温度值。以下是处理温度传感器ADC数据的代码片段。

// 将ADC值转换为温度值
float ConvertToTemperature(unsigned long ulValue)
{
    float fTemperature = 0.0;

    // 假定温度传感器的参考电压、分辨率和量程已知
    float fConversion = ((float) ulValue * VOLTAGE_REFERENCE) / (float)(1 << ADC_RESOLUTION);
    // 根据传感器特性进行计算得到温度
    fTemperature = (fConversion - OFFSET) * (FULL_SCALE_RANGE / MAX_VALUE);

    return fTemperature;
}

在上面的函数中,我们首先计算了ADC值对应的电压,然后根据传感器的特性将电压转换成温度。 VOLTAGE_REFERENCE ADC_RESOLUTION OFFSET FULL_SCALE_RANGE 是基于传感器规格书和系统设计定义的参数。

本章节介绍了ADC模块的基础知识、配置、数据采集和处理技术。对于从事嵌入式系统开发的IT专业人士来说,深入理解并掌握这些内容是至关重要的,因为这关系到系统的测量精度和整体性能表现。下一章节我们将探讨如何进一步提升嵌入式系统设计的能力。

5. 嵌入式系统设计能力提升

在现代技术领域,嵌入式系统设计是一个极其重要的专业技能。这一章节将着重介绍如何通过实践项目和深入理解TM4C123G芯片,进一步提升嵌入式系统设计能力。

5.1 微控制器TIVA C系列深度介绍

5.1.1 TIVA C系列微控制器的核心优势

TIVA C系列微控制器,特别是TM4C123G芯片,因其所具备的高速度、低功耗以及丰富的外设接口而受到工程师的青睐。其Cortex-M4内核提供了强大的处理能力,支持浮点运算和高效的中断响应时间,这对于嵌入式应用来说至关重要。除此之外,TIVA C系列还具有灵活的电源管理和大量的集成模块,如UART、SSI、ADC等,这些都是实现复杂系统设计不可或缺的功能。

5.1.2 TIVA C系列在不同场景下的应用

在智能工业、家庭自动化、远程通信和医疗仪器等领域,TIVA C系列微控制器得到了广泛应用。例如,它们可以作为智能传感器的主控制器,利用ADC模块精确地采集数据,并通过SSI接口与其他设备进行高速数据同步传输,或者利用UART进行远程通信。这种微控制器的灵活性和性能,使其成为嵌入式系统设计人员的首选。

5.2 TM4C123G芯片外设功能概览

5.2.1 各类外设的特点及配置方法

TM4C123G芯片集成了多种外设,每种都有其特定的用途和配置方法。例如,UART外设支持多速率配置、硬件流控制、中断驱动以及DMA传输。SSI模块则支持SPI、TI和MICROWIRE等多种同步串行协议。ADC模块则具有高达12位的分辨率和多达12个通道的多路复用器。

5.2.2 外设间的协同工作与优化策略

外设间的协同工作是提高系统性能的关键。例如,通过配置UART和SSI模块,可以实现复杂的通信网络;利用ADC模块采集数据,并通过DMA传输到内存或另一个外设,可以减轻CPU的负担。在设计时,需考虑到资源分配、功耗管理和实时性要求等因素,实现最优的配置策略。

5.3 实践项目与示例代码

5.3.1 综合实践项目的设计与实施

在实际的嵌入式系统设计中,一个好的实践项目可以提供宝贵的经验。例如,可以设计一个基于TM4C123G的环境监测系统,该系统通过ADC模块监测多个传感器数据,如温度、湿度和压力等。系统可以使用UART或SSI模块将数据传输到远程服务器进行分析。

5.3.2 核心代码解析与调试技巧分享

核心代码的编写是嵌入式系统设计的核心。以ADC模块数据采集为例,我们需要初始化ADC模块,设置合适的采样率和分辨率,然后通过中断或轮询的方式读取数据。代码中可能包含如下函数:

void ADC0_Init(void) {
    // 配置ADC0时钟、采样率和分辨率的代码...
}

uint32_t Read_ADC_Value(uint8_t channel) {
    // 根据传入的通道选择,启动ADC并读取数据的代码...
    return adcValue;
}

调试技巧包括使用JTAG或SWD接口进行单步跟踪、查看和分析寄存器状态、使用逻辑分析仪监视外设通信以及使用串口打印调试信息等。

5.4 嵌入式系统设计能力提升策略

5.4.1 学习资源与工具的选择

对于嵌入式系统设计人员来说,选择合适的学习资源和工具是至关重要的。可选择在线课程、技术书籍、官方文档和开发者论坛等资源。同时,使用专业的调试和开发工具如Keil uVision、IAR Embedded Workbench或TI自己的Code Composer Studio等,它们提供了丰富的库函数、调试支持和性能分析工具。

5.4.2 嵌入式系统设计的进阶思维

在进阶阶段,设计人员应关注系统的整体架构和性能优化。理解系统的实时性和并发性需求,以及如何利用多核处理器提高效率。同时,学习如何应用设计模式和最佳实践,如模块化设计、代码复用和接口抽象等,这将有助于设计出更加灵活、可维护和可扩展的嵌入式系统。

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

简介:本工作坊旨在帮助开发者深入学习和掌握TM4C123G芯片的UART、SSI和ADC等接口应用开发。通过学习如何配置UART通信参数、SSI通信设置及ADC模块配置,参与者将获得构建串行通信系统、同步数据传输和处理模拟输入的实践能力,进而在实际项目中应用这些技能。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值