STM32 TIM多种从模式输入测试实践指南

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

简介:STM32的定时器(TIM)模块中的从模式输入测试对于实现复杂的时序控制和信号同步至关重要。本文将深入探讨TIM的5种从模式及其应用,包括预分频器从模式、重载值从模式、倒计数从模式、透明从模式和事件边沿检测从模式。通过编写代码配置相应模式和寄存器,如TIM_SlaveConfig和TIM_TimeBaseInit,以及关注中断和DMA的设置,开发者可以验证TIM的从模式功能并提高系统灵活性与精度。 TIM多种从模式输入测试

1. STM32 TIM模块基础介绍

STM32微控制器系列是基于ARM Cortex-M内核的广泛使用的32位微控制器。在这些微控制器中,定时器模块(TIM)扮演着重要的角色,它不仅能够用来测量时间间隔、产生精确的时间基准,还可以用于生成PWM信号、处理输入信号以及扩展微控制器的I/O端口等。

1.1 TIM模块的主要功能和优势

TIM模块的主要功能包括:时基生成、输入捕获、输出比较和PWM生成等。这些功能使得它成为实现复杂控制逻辑的理想选择。TIM模块的优势在于其灵活性,支持不同的工作模式和丰富的配置选项,用户可以根据需要轻松地调整其工作状态。

1.2 TIM模块的结构和组件

一个典型的TIM模块包括一个可编程的预分频器、计数器、自动重载寄存器、捕获/比较寄存器以及相应的控制和状态寄存器。通过这些组件,TIM模块能够对外部或内部事件进行精确计时和控制。

1.3 TIM模块的应用场景

TIM模块广泛应用于各种场景,包括电机控制、传感器信号处理、事件计时和测量、以及与外部事件同步等。随着技术的演进,TIM模块也在不断升级,以满足工业和消费电子领域的高标准需求。

接下来的章节将详细介绍预分频器、重载值、倒计数等从模式的应用与测试,深入探索STM32 TIM模块的强大功能和潜力。

2. 预分频器从模式应用与测试

2.1 预分频器的基本概念与作用

预分频器是定时器/计数器中一个重要的组成部分,它能够对输入的时钟信号进行分频处理,从而得到更慢的时钟频率。在STM32的TIM模块中,预分频器的功能是将主时钟(APB总线时钟)分频后提供给定时器进行计数。

2.1.1 预分频器对时钟信号的处理原理

在STM32微控制器中,预分频器通过一个可编程的分频系数(PSC)来实现时钟信号的分频。分频系数可以设置在0到65535之间,这决定了分频后输出时钟的频率。比如,如果设置预分频器的值为PSC=999,则输入的时钟频率被分频为原来的1/1000。这在实际应用中非常有用,比如在需要较长定时周期时,可以通过增加预分频值来获得较低的计数速度。

2.1.2 预分频器在定时器中的配置方法

在STM32的软件层面上,配置预分频器通常涉及到寄存器的设置。以下是通过STM32 HAL库函数配置预分频器的一个基本示例代码:

TIM_HandleTypeDef htim; // 假设已经定义并初始化了htim定时器句柄
uint16_t prescaler_value = 999; // 设置预分频值

// 配置预分频器
htim.Init.Prescaler = prescaler_value;
htim.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式
htim.Init.Period = 0xFFFF; // 设置自动重装载值
htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频因子
htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 自动重装载预装载

// 应用配置
if (HAL_TIM_Base_Init(&htim) != HAL_OK) {
    // 初始化错误处理逻辑
}

// 开始计时
HAL_TIM_Base_Start_IT(&htim);

在这段代码中,我们首先定义了一个 TIM_HandleTypeDef 类型的变量 htim ,这是STM32 HAL库用于操作定时器的句柄结构体。然后我们设置了预分频值,并初始化定时器的相关参数。最后,我们调用 HAL_TIM_Base_Init 函数来应用这些配置,并通过 HAL_TIM_Base_Start_IT 函数启动定时器。

2.2 预分频器模式下的时序测试

为了验证预分频器的实际效果,我们需要进行时序测试。

2.2.1 测试方案的设计与实施

测试方案主要围绕两个方面:验证预分频器能否正确地将输入时钟分频,以及预分频值的变化对输出时钟频率的影响。

  1. 准备测试环境:使用STM32的开发板,确保开发环境搭建完成。
  2. 编写测试代码:设置不同的预分频值,输出预分频后的时钟信号到定时器的通道输出引脚。
  3. 连接逻辑分析仪:将定时器的输出通道连接到逻辑分析仪,观察输出信号的频率。
2.2.2 实测数据的分析与总结

使用逻辑分析仪读取输出信号,并记录不同预分频值下的实际输出频率。通过与理论值的对比,我们可以评估预分频器是否按照预期工作。以下是分析与总结的示例:

| 预分频值 (PSC) | 输入时钟频率 (MHz) | 计算出的输出频率 (Hz) | 实测输出频率 (Hz) | 偏差 (%) | |----------------|---------------------|----------------------|-------------------|----------| | 999 | 72 | 72000 | 72005 | 0.007% | | 1999 | 72 | 36000 | 36010 | 0.028% | | ... | ... | ... | ... | ... |

通过表格数据分析,我们可以看到预分频器在实际应用中的表现与预期基本一致。如果存在较大偏差,则需要检查时钟配置、测试设备精度等因素。

接下来,我们将继续深入了解重载值从模式的应用与测试。

3. 重载值从模式应用与测试

3.1 重载值的作用与配置

3.1.1 重载值在定时器周期性事件中的应用

重载值(ARR,Auto-Reload Register)是定时器/计数器中一个关键的寄存器,用于定义定时器的计数上界。在周期性事件中,定时器从0计数至重载值,然后重新从0开始计数,形成一个循环。这个特性允许开发者创建重复的时间基准或周期性中断,这对于诸如PWM波生成、周期性软件任务调度等应用至关重要。

3.1.2 如何设置重载值以改变定时器行为

配置重载值需要明确两个概念:时钟频率和期望的定时器周期。定时器的周期 T 可以通过以下公式计算:

T = (ARR + 1) / f CK_PSC

其中 f CK_PSC 是定时器的时钟频率,ARR 是自动重装载寄存器的值。

如果想要定时器每隔1ms产生一个中断,首先确定定时器的时钟频率,然后计算出 ARR 的值。例如,如果定时器时钟频率为 80MHz,预分频器设置为7999(时钟分频后频率为10kHz),那么 ARR 应该设置为 9(因为ARR是计数至10才能重置,所以要设置为周期减1)。

以下是一个STM32 HAL库设置TIM重载值的代码示例:

TIM_HandleTypeDef htim1; // 假设使用TIM1

void MX_TIM1_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = (uint32_t)(SystemCoreClock / 10000U) - 1; // 预分频器
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式
  htim1.Init.Period = 1000 - 1; // 重载值
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

3.1.3 代码逻辑分析与参数说明

代码中使用 HAL_TIM_Base_Init 函数初始化定时器基本配置,其中 Prescaler 设置为 SystemCoreClock / 10000U - 1 ,表示分频器后的时钟为10kHz。 Period 设置为1000-1,意味着定时器计数至1000时产生溢出并触发事件。

时钟源配置 sClockSourceConfig.ClockSource TIM_CLOCKSOURCE_INTERNAL ,使用内部时钟源。在 sMasterConfig 中,主输出触发被设置为 TIM_TRGO_RESET ,表示在重载事件发生时清除主输出。此外, HAL_TIM_Base_Init 的返回值检查确保初始化成功,否则调用 Error_Handler

理解这些配置对于精确控制定时器的周期至关重要,因为任何微小的错误配置都可能导致定时器行为不符合预期。

3.2 重载值模式的性能测试

3.2.1 性能测试的设计和预期目标

性能测试的目标是验证定时器在预设重载值下的精确度和稳定性。测试的设计应覆盖在不同的工作条件下,包括不同的时钟频率、预分频器值和重载值。预期目标是保证定时器能够在整个预期的运行时间内保持稳定的周期性中断,并且中断的实际时间间隔与期望值匹配。

3.2.2 测试结果的分析和问题解决

为实现测试,可以利用系统的时间戳功能记录定时器中断发生的时间点,并计算实际周期与期望周期的差异。如果差异超出了可接受的误差范围(例如,±1%),则需要进一步分析定时器配置或系统负载情况。

表3.2展示了如何记录和分析定时器中断的实际周期:

| 期望周期(ms) | 实际周期1(ms) | 实际周期2(ms) | ... | 实际周期n(ms) | 平均周期(ms) | 偏差 | | ------------- | -------------- | -------------- | --- | -------------- | -------------- | ---- | | 10 | 10.05 | 9.98 | ... | 10.03 | 10.02 | 0.2% |

分析结果如果显示存在较大偏差,则可能需要检查和优化以下几个方面:

  • 时钟源的稳定性 :确保使用的时钟源稳定,没有波动。
  • 系统负载 :在高系统负载下,中断服务例程的执行可能受到影响,导致定时器中断延迟。
  • 中断优先级 :如果其他高优先级中断正在频繁地打断定时器中断服务例程,可能需要重新配置中断优先级。
  • 定时器配置 :检查定时器的配置参数,确保它们被正确设置且没有溢出或欠载发生。

以下是一个使用STM32 HAL库记录中断实际周期并分析的代码示例:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  static uint32_t last_capture = 0;
  uint32_t current_capture = HAL_GetTick();
  uint32_t elapsed_time = current_capture - last_capture;
  last_capture = current_capture;

  // 此处可以将 elapsed_time 与预期值进行比较,并进行偏差分析
}

int main(void)
{
  HAL_Init();
  // 定时器初始化代码
  HAL_TIM_Base_Start_IT(&htim1);
  while(1)
  {
    // 主循环代码
  }
}

在实际应用中,开发者可能需要根据硬件和软件的具体情况调整测试方法和分析手段,以达到最佳的定时器性能。

4. 倒计数从模式应用与测试

倒计数模式是定时器的一种工作方式,其中定时器从一个预设的初始值开始向下计数至零,然后触发一个事件或中断。这种模式特别适用于需要倒计时功能的应用场景,例如定时器、计时器等。在倒计数模式下,定时器的中断服务程序可以在倒计时结束时执行特定的任务,如启动下一个任务或执行某些周期性操作。

4.1 倒计数模式的工作原理

4.1.1 倒计数与正计数模式的对比

倒计数模式与正计数模式最主要的区别在于计数的方向。在正计数模式中,定时器从零开始向上计数至预设的最大值,然后重新开始计数。倒计数模式则正好相反,从一个预设的初始值开始向下计数直至零。在某些应用中,倒计数模式可能更为高效,因为它可以立即开始计数,无需等待达到最大值。

4.1.2 倒计数模式下的中断和事件触发

倒计数模式的一个重要特点是在计数过程中可以配置中断或事件触发。当计数器值达到预设的阈值时,可以触发一个中断或事件。这使得定时器可以在特定的时间点执行操作,比如停止一个电机、切换一个LED的状态或者记录时间戳。

4.2 倒计数模式的精确度测试

4.2.1 测试方法和精度要求

精确度测试旨在评估倒计数模式在预定时间间隔内的准确性。为了进行测试,我们需要设置一个精确的时间间隔,并且使用一个高精度的时间测量工具(例如逻辑分析仪或示波器)来记录定时器触发中断的时间点。测试中,记录多个周期内的实际触发时间,并与预期时间进行比较,以评估精度。

4.2.2 数据处理和精度优化建议

数据处理过程涉及将实测数据与理想数据进行对比分析,确定定时器在倒计数模式下的偏差范围。如果出现偏差,可能需要调整预设值、时钟频率或参考时钟源,确保定时器的精确度。此外,软件校准机制,例如在中断服务程序中动态调整预设值,也可以用于进一步提高倒计数模式的精确度。

4.3 倒计数模式应用案例分析

4.3.1 电机控制中的应用

在电机控制应用中,倒计数模式可以用来实现定时控制。例如,一个步进电机可能需要在特定的时间间隔内完成一个旋转周期。通过设置适当的倒计数初始值和周期,定时器可以在每个周期结束时产生一个中断信号,从而触发步进电机控制器执行下一步动作。

4.3.2 定时器在测量系统中的使用

在测量系统中,倒计数模式可用于精确地测量时间间隔或事件持续时间。例如,通过配置倒计数定时器从特定值开始倒数,当事件开始时启动定时器,在事件结束时读取定时器的当前值。这个值即为事件持续的时间,非常适合于那些对时间测量要求严格的应用。

4.3.3 倒计时功能在用户界面中的实现

在用户界面设计中,倒计时功能可用于显示事件或操作的剩余时间。通过设置倒计数定时器,用户可以实时看到某个过程的时间进度,这对于提升用户体验非常有帮助。例如,倒计时器可以用于限制网络请求的等待时间或展示烤箱预热的剩余时间。

4.4 代码实例与分析

在本节中,我们将展示一个倒计数定时器配置和中断处理的代码示例。该代码适用于STM32微控制器,并使用HAL库函数来配置定时器和中断。

// 假设使用STM32 HAL库
#include "stm32f1xx_hal.h"

// 初始化定时器为倒计数模式
void TIM_Counter_Init(void)
{
    TIM_HandleTypeDef htim;
    __HAL_RCC_TIM2_CLK_ENABLE(); // 使能定时器2时钟

    htim.Instance = TIM2; // 定时器实例选择TIM2
    htim.Init.Prescaler = (uint32_t)((SystemCoreClock / 2) / 1000000) - 1; // 预分频器设置,假设系统时钟1MHz
    htim.Init.CounterMode = TIM_COUNTERMODE_DOWN; // 设置为倒计数模式
    htim.Init.Period = 1000 - 1; // 设置自动重载值为1000(计数到0时重新加载1000)
    HAL_TIM_Base_Init(&htim);

    // 启用定时器更新中断(溢出中断)
    __HAL_TIM_ENABLE_IT(&htim, TIM_IT_UPDATE);

    HAL_TIM_Base_Start_IT(&htim); // 启动定时器
}

// 定时器2中断服务程序
void TIM2_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim2);
}

// 在中断回调函数中处理定时器事件
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)
    {
        // 定时器溢出中断处理
        // 在此处添加倒计时完成后的处理逻辑
    }
}

逻辑分析和参数说明

  • __HAL_RCC_TIM2_CLK_ENABLE() 函数启用定时器2的时钟。
  • htim.Instance = TIM2 指定定时器的实例。
  • htim.Init.Prescaler 设置预分频器,将系统时钟分频为定时器的输入时钟。
  • htim.Init.CounterMode = TIM_COUNTERMODE_DOWN 指定定时器工作在倒计数模式。
  • htim.Init.Period 设置自动重载值,倒计数定时器将从该值开始向下计数至零。
  • HAL_TIM_Base_Init(&htim) 初始化定时器基本配置。
  • __HAL_TIM_ENABLE_IT(&htim, TIM_IT_UPDATE) 启用更新中断(溢出中断)。
  • HAL_TIM_Base_Start_IT(&htim) 启动定时器并使能其中断。

在中断服务程序 TIM2_IRQHandler 和回调函数 HAL_TIM_PeriodElapsedCallback 中处理定时器溢出事件。这些函数将被定时器硬件中断触发时执行,并在回调函数中完成倒计时结束后的逻辑处理。

通过以上代码实例及逻辑分析,可以看出在STM32平台下配置和使用倒计数定时器的步骤和方法。针对不同的应用场景,开发者可以调整预分频器的值、自动重载值和其他相关参数,以满足特定的性能需求。

5. 透明从模式应用与测试

5.1 透明从模式的特点与适用场景

5.1.1 透明模式与其他模式的比较

在定时器的多种从模式中,透明从模式是一种特殊的模式,它允许定时器在不受主计时器影响的情况下独立工作。透明从模式与其它模式(例如预分频器模式、重载值模式和倒计数模式)相比,最大的特点在于其操作的独立性。透明从模式下的计数器可以自由地向上计数或者向下计数,而且其计数值的变化不会反馈到主计时器。

在设计复杂的定时需求时,透明从模式提供了极大的灵活性。例如,当设计一个需要准确测量外部事件持续时间的系统时,就可以使用透明从模式,使定时器独立于主系统时钟运行,从而避免了时钟域之间的同步问题。

5.1.2 透明模式在特定应用中的优势

透明从模式特别适合那些需要独立运行定时器的场景。比如,在音频信号处理中,需要定时器精确地计算特定信号的周期长度,透明从模式可以不受其他定时器干扰,独立运行,确保信号处理的准确性和稳定性。此外,在电机控制应用中,透明从模式可以用来生成精确的脉宽调制(PWM)信号,用于控制电机的速度和方向。

透明从模式下的计数器和主计时器是解耦的,它允许计数器独立设置触发点,这在需要精确控制某些事件发生时间的应用中非常有用。例如,在精密测量设备中,可能会用透明从模式来同步多个信号,每个信号独立触发,但同时运行。

5.2 透明模式的实际应用测试

5.2.1 测试环境的搭建和测试步骤

为了验证透明从模式在实际应用中的效果,我们搭建了一个测试环境。该环境包括一个STM32微控制器,一个外部脉冲信号源,以及必要的测试仪器如示波器和逻辑分析仪。

测试步骤如下:

  1. 初始化STM32的TIM模块,设置为透明从模式,并配置好输入捕获通道。
  2. 设置外部脉冲信号源,产生一系列脉冲信号用于测试。
  3. 将脉冲信号源连接到STM32的相应输入捕获引脚上。
  4. 通过软件配置TIM模块的捕获比较寄存器,准备捕获外部脉冲信号事件。
  5. 启动TIM模块,让其独立运行。
  6. 通过逻辑分析仪监控TIM模块的输入捕获事件,并记录脉冲宽度和频率等信息。

5.2.2 测试结果的评估与应用反馈

经过一系列的测试,我们可以得到透明从模式下的定时器在独立运行时的性能表现。通过示波器和逻辑分析仪记录的数据,我们可以评估定时器的响应时间、捕获精度以及是否受到主时钟系统的影响。

应用反馈显示,在需要独立测量外部事件的应用中,透明从模式的性能非常稳定可靠。比如在电机控制系统中,使用透明从模式生成的PWM信号稳定性高,响应速度快,这得益于透明从模式下计数器的独立运行,不受主计时器的影响。

在总结测试结果时,透明从模式确实表现出其特有的优势,同时也暴露了一些潜在的局限性。例如,由于透明从模式下计数器独立运行,所以在实现某些特定的同步功能时可能需要额外的逻辑控制。针对这些情况,我们提出了相应的优化建议,并给出了实际应用中可能遇到的问题解决方法。

通过本章节的介绍,读者应能够了解到透明从模式在实际应用中的重要性和优势。在接下来的章节中,我们将进一步探讨事件边沿检测模式,以及如何在实际应用中配置和测试这一模式,从而完善我们对STM32定时器从模式应用与测试的理解。

6. 事件边沿检测从模式应用与测试

事件边沿检测模式允许定时器响应外部事件的边沿变化,从而执行预定的动作。此模式在处理外部信号或进行精确的时间测量时非常有用。

6.1 事件边沿检测模式的工作机制

6.1.1 边沿检测的基本原理

在边沿检测模式中,定时器通过其输入捕获功能来监测外部信号。当外部信号在特定引脚上产生一个上升沿或下降沿时,定时器捕捉到这一变化,并可以触发中断或DMA传输。

例如,在上升沿检测模式下,当检测到引脚电平从低到高的变化时,定时器计数器的值会被捕捉到一个特定的寄存器中,并且可以配置为触发中断。

6.1.2 如何配置定时器以实现边沿检测

要配置事件边沿检测模式,通常需要设置定时器的相关寄存器:

// 以STM32为例,设置定时器为上升沿捕获模式
TIM_HandleTypeDef htim; // 假设已初始化的定时器句柄
uint32_t Channel = TIM_CHANNEL_1; // 选择通道1进行配置

// 启用定时器的输入捕获模式并设置为上升沿触发
__HAL_TIM_SET_COMPARE(&htim, Channel, TIM_ICPolarity_Rising);

6.2 边沿检测模式的效果评估

6.2.1 测试方法和效果评价标准

为了评估边沿检测模式的有效性,我们可以设计测试来测量事件的响应时间以及捕获值的准确性。测试方法包括:

  • 使用示波器监控输入信号和定时器捕获引脚,确保正确的边沿触发。
  • 记录捕获到的值,并与已知的信号周期进行比较,计算准确度。
  • 测试定时器响应不同频率信号的能力。

6.2.2 实际应用中的性能表现和案例分析

在实践中,边沿检测模式常被用于测量信号的频率或周期,例如,在电机控制应用中,通过测量PWM信号的周期来计算电机的转速。

考虑一个案例:电机转速监控系统。在此系统中,使用边沿检测模式来测量电机控制器发出的PWM信号的周期。通过这种方法,可以实时监控电机的转速并调整其运行状态。

在该测试中,信号的周期可能在1ms到100ms之间变化。系统需要在不同的PWM频率下保持高精度的测量。

// 示例代码,实现一个简单的转速测量逻辑
uint32_t last_capture_value = 0;
uint32_t current_capture_value;
uint32_t speed_rpm;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
    if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
        current_capture_value = __HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_1);
        // 计算两次捕获之间的时间差
        uint32_t time_diff = current_capture_value - last_capture_value;
        last_capture_value = current_capture_value;
        // 假设定时器时钟为72MHz,预分频器为72-1,计数器周期为1ms
        // 转换时间差为转速
        speed_rpm = 60 * 1000 / time_diff;
    }
}

本章我们深入探讨了事件边沿检测从模式,并通过代码和实际案例详细描述了其配置和应用。此模式为工程师提供了精细控制和监测外部事件的强大工具,尤其适用于需要高精度时间测量和快速信号处理的场合。在第七章中,我们将深入了解TIM模块的代码配置要点,并探讨如何通过代码优化TIM模块的性能。

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

简介:STM32的定时器(TIM)模块中的从模式输入测试对于实现复杂的时序控制和信号同步至关重要。本文将深入探讨TIM的5种从模式及其应用,包括预分频器从模式、重载值从模式、倒计数从模式、透明从模式和事件边沿检测从模式。通过编写代码配置相应模式和寄存器,如TIM_SlaveConfig和TIM_TimeBaseInit,以及关注中断和DMA的设置,开发者可以验证TIM的从模式功能并提高系统灵活性与精度。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值