YTM32B1ME0x芯片深度解读系列(三):GPIO与引脚复用系统

引言

在现代汽车电子系统中,I/O接口的灵活性和可靠性直接影响着整个系统的功能实现和性能表现。YTM32B1ME0x提供了多达126个通用I/O引脚,配合强大的引脚复用系统,能够满足复杂汽车应用的多样化接口需求。

GPIO系统架构概览

引脚资源分布

YTM32B1ME0x根据不同封装提供了不同数量的I/O引脚:

封装类型引脚总数GPIO数量特殊功能引脚
144-pin LQFP14412618
100-pin LQFP1008218
64-pin LQFP644618

GPIO端口分布:

  • PORTA: 32个引脚 (PTA0-PTA31)

  • PORTB: 32个引脚 (PTB0-PTB31)

  • PORTC: 32个引脚 (PTC0-PTC31)

  • PORTD: 32个引脚 (PTD0-PTD31)

  • PORTE: 32个引脚 (PTE0-PTE31)

GPIO功能特性

核心功能:

  • 数据输出寄存器及对应的置位/清零/翻转寄存器

  • 数据方向控制寄存器

  • 数字输入滤波器

  • 输入数据反相功能

  • 每个引脚独立的中断标志和使能寄存器

  • 支持边沿敏感(上升沿、下降沿、双边沿)和电平敏感(高电平、低电平)中断

  • 低功耗模式下的异步唤醒功能

引脚复用(PINMUX)系统详解

复用功能层次结构

每个GPIO引脚最多支持8种复用功能(ALT0-ALT7):

引脚功能选择层次:
ALT0: 模拟功能 (Analog Function)
ALT1: GPIO功能 (General Purpose I/O)
ALT2-ALT7: 专用外设功能 (Dedicated Peripheral Functions)

典型引脚复用示例(以PTE_5为例):

复用选择功能描述
ALT0-禁用数字功能
ALT1PTE_5通用GPIO
ALT2TCLK_IN2定时器时钟输入
ALT3eTMR2_QDPHA增强定时器正交解码A相
ALT4eTMR2_CH3增强定时器通道3
ALT5CAN0_TXCAN0发送
ALT6-保留
ALT7EWDG_IN外部看门狗输入

引脚复用配置实现

// 引脚复用配置结构
typedef enum {
    PIN_ALT0_ANALOG = 0,
    PIN_ALT1_GPIO = 1,
    PIN_ALT2 = 2,
    PIN_ALT3 = 3,
    PIN_ALT4 = 4,
    PIN_ALT5 = 5,
    PIN_ALT6 = 6,
    PIN_ALT7 = 7
} pin_mux_alt_t;
​
// 配置引脚复用功能
void configure_pin_mux(GPIO_Type *port, uint32_t pin, pin_mux_alt_t alt) {
    PCTRL_Type *pctrl;
    
    // 根据端口选择对应的PCTRL
    if (port == GPIOA) pctrl = PCTRLA;
    else if (port == GPIOB) pctrl = PCTRLB;
    else if (port == GPIOC) pctrl = PCTRLC;
    else if (port == GPIOD) pctrl = PCTRLD;
    else if (port == GPIOE) pctrl = PCTRLE;
    
    // 配置复用功能
    pctrl->PCR[pin] = (pctrl->PCR[pin] & ~PCTRL_PCR_MUX_MASK) | 
                      PCTRL_PCR_MUX(alt);
}
​
// 高级引脚配置函数
typedef struct {
    pin_mux_alt_t mux;          // 复用功能选择
    bool pull_enable;           // 上下拉使能
    bool pull_select;           // 上拉(1)/下拉(0)选择
    bool slew_rate;             // 转换速率:快速(0)/慢速(1)
    bool drive_strength;        // 驱动强度:低(0)/高(1)
    bool passive_filter;        // 被动滤波器使能
} pin_config_t;
​
void configure_pin_advanced(GPIO_Type *port, uint32_t pin, pin_config_t *config) {
    PCTRL_Type *pctrl = get_pctrl_from_gpio(port);
    
    uint32_t pcr_value = 0;
    
    // 配置复用功能
    pcr_value |= PCTRL_PCR_MUX(config->mux);
    
    // 配置上下拉
    if (config->pull_enable) {
        pcr_value |= PCTRL_PCR_PE_MASK;
        if (config->pull_select) {
            pcr_value |= PCTRL_PCR_PS_MASK;  // 上拉
        }
    }
    
    // 配置转换速率
    if (config->slew_rate) {
        pcr_value |= PCTRL_PCR_SRE_MASK;
    }
    
    // 配置驱动强度
    if (config->drive_strength) {
        pcr_value |= PCTRL_PCR_DSE_MASK;
    }
    
    // 配置被动滤波器
    if (config->passive_filter) {
        pcr_value |= PCTRL_PCR_PFE_MASK;
    }
    
    pctrl->PCR[pin] = pcr_value;
}

GPIO操作与控制

基本GPIO操作

// GPIO基本操作封装
typedef struct {
    GPIO_Type *port;
    uint32_t pin;
} gpio_pin_t;
​
// 配置GPIO为输出
void gpio_set_output(gpio_pin_t *gpio) {
    gpio->port->POER |= (1U << gpio->pin);   // 使能输出
    gpio->port->PIER |= (1U << gpio->pin);   // 使能输入(用于读回)
}
​
// 配置GPIO为输入
void gpio_set_input(gpio_pin_t *gpio) {
    gpio->port->POER &= ~(1U << gpio->pin);  // 禁用输出
    gpio->port->PIER |= (1U << gpio->pin);   // 使能输入
}
​
// 设置GPIO输出电平
void gpio_write(gpio_pin_t *gpio, bool level) {
    if (level) {
        gpio->port->PSOR = (1U << gpio->pin);  // 置位
    } else {
        gpio->port->PCOR = (1U << gpio->pin);  // 清零
    }
}
​
// 读取GPIO输入电平
bool gpio_read(gpio_pin_t *gpio) {
    return (gpio->port->PDIR & (1U << gpio->pin)) ? true : false;
}
​
// GPIO翻转
void gpio_toggle(gpio_pin_t *gpio) {
    gpio->port->PTOR = (1U << gpio->pin);
}

高性能GPIO操作

// 批量GPIO操作
typedef struct {
    uint32_t set_mask;      // 需要置位的引脚掩码
    uint32_t clear_mask;    // 需要清零的引脚掩码
    uint32_t toggle_mask;   // 需要翻转的引脚掩码
} gpio_batch_op_t;
​
void gpio_batch_operation(GPIO_Type *port, gpio_batch_op_t *op) {
    // 原子操作,避免中断影响
    __disable_irq();
    
    if (op->set_mask) {
        port->PSOR = op->set_mask;
    }
    
    if (op->clear_mask) {
        port->PCOR = op->clear_mask;
    }
    
    if (op->toggle_mask) {
        port->PTOR = op->toggle_mask;
    }
    
    __enable_irq();
}
​
// 快速端口写入
void gpio_port_write(GPIO_Type *port, uint32_t value, uint32_t mask) {
    uint32_t current = port->PDOR;
    port->PDOR = (current & ~mask) | (value & mask);
}

数字滤波器系统

滤波器配置与应用

YTM32B1ME0x为每个GPIO提供了可配置的数字滤波器:

// 数字滤波器配置
typedef enum {
    FILTER_DISABLED = 0,
    FILTER_2_CYCLES = 1,
    FILTER_4_CYCLES = 2,
    FILTER_8_CYCLES = 3,
    FILTER_16_CYCLES = 4,
    FILTER_32_CYCLES = 5
} gpio_filter_width_t;
​
void configure_gpio_filter(GPIO_Type *port, uint32_t pin, 
                          gpio_filter_width_t width, bool enable) {
    if (enable) {
        // 配置滤波器宽度
        port->PCR[pin] = (port->PCR[pin] & ~GPIO_PCR_DFW_MASK) | 
                         GPIO_PCR_DFW(width);
        
        // 使能数字滤波器
        port->PCR[pin] |= GPIO_PCR_DFE_MASK;
    } else {
        // 禁用数字滤波器
        port->PCR[pin] &= ~GPIO_PCR_DFE_MASK;
    }
}
​
// 自适应滤波器配置
void adaptive_filter_config(gpio_pin_t *gpio, uint32_t signal_freq) {
    gpio_filter_width_t width;
    
    // 根据信号频率选择合适的滤波器宽度
    if (signal_freq > 1000000) {        // > 1MHz
        width = FILTER_2_CYCLES;
    } else if (signal_freq > 100000) {  // > 100kHz
        width = FILTER_4_CYCLES;
    } else if (signal_freq > 10000) {   // > 10kHz
        width = FILTER_8_CYCLES;
    } else {                            // <= 10kHz
        width = FILTER_16_CYCLES;
    }
    
    configure_gpio_filter(gpio->port, gpio->pin, width, true);
}

GPIO中断系统

中断配置与处理

// GPIO中断类型
typedef enum {
    GPIO_INT_DISABLED = 0x0,
    GPIO_INT_DMA_RISING = 0x1,
    GPIO_INT_DMA_FALLING = 0x2,
    GPIO_INT_DMA_BOTH = 0x3,
    GPIO_INT_LOGIC_LOW = 0x8,
    GPIO_INT_RISING_EDGE = 0x9,
    GPIO_INT_FALLING_EDGE = 0xA,
    GPIO_INT_BOTH_EDGES = 0xB,
    GPIO_INT_LOGIC_HIGH = 0xC
} gpio_interrupt_type_t;
​
// 配置GPIO中断
void configure_gpio_interrupt(gpio_pin_t *gpio, gpio_interrupt_type_t type) {
    // 配置中断类型
    gpio->port->PCR[gpio->pin] = (gpio->port->PCR[gpio->pin] & ~GPIO_PCR_IRQC_MASK) |
                                 GPIO_PCR_IRQC(type);
    
    // 清除中断标志
    gpio->port->PIFR = (1U << gpio->pin);
    
    // 使能NVIC中断
    if (gpio->port == GPIOA) {
        NVIC_EnableIRQ(PORTA_IRQn);
    } else if (gpio->port == GPIOB) {
        NVIC_EnableIRQ(PORTB_IRQn);
    }
    // ... 其他端口类似
}
​
// GPIO中断处理框架
typedef void (*gpio_callback_t)(gpio_pin_t *gpio);
​
typedef struct {
    gpio_pin_t gpio;
    gpio_callback_t callback;
    bool enabled;
} gpio_interrupt_handler_t;
​
static gpio_interrupt_handler_t gpio_handlers[5][32];  // 5个端口,每个32个引脚
​
void register_gpio_interrupt(gpio_pin_t *gpio, gpio_callback_t callback) {
    uint32_t port_index = get_port_index(gpio->port);
    gpio_handlers[port_index][gpio->pin].gpio = *gpio;
    gpio_handlers[port_index][gpio->pin].callback = callback;
    gpio_handlers[port_index][gpio->pin].enabled = true;
}
​
// 通用GPIO中断处理函数
void gpio_interrupt_handler(GPIO_Type *port) {
    uint32_t port_index = get_port_index(port);
    uint32_t interrupt_flags = port->PIFR;
    
    for (uint32_t pin = 0; pin < 32; pin++) {
        if (interrupt_flags & (1U << pin)) {
            // 清除中断标志
            port->PIFR = (1U << pin);
            
            // 调用回调函数
            if (gpio_handlers[port_index][pin].enabled && 
                gpio_handlers[port_index][pin].callback) {
                gpio_handlers[port_index][pin].callback(&gpio_handlers[port_index][pin].gpio);
            }
        }
    }
}

汽车应用中的GPIO设计

1. 车身控制模块应用

// 车身控制GPIO定义
typedef struct {
    gpio_pin_t headlight_left;
    gpio_pin_t headlight_right;
    gpio_pin_t taillight_left;
    gpio_pin_t taillight_right;
    gpio_pin_t turn_signal_left;
    gpio_pin_t turn_signal_right;
    gpio_pin_t door_lock;
    gpio_pin_t window_up;
    gpio_pin_t window_down;
} vehicle_body_control_t;
​
// 车灯控制实现
void control_vehicle_lights(vehicle_body_control_t *ctrl, uint32_t light_mask) {
    gpio_batch_op_t batch_op = {0};
    
    if (light_mask & HEADLIGHT_LEFT) {
        batch_op.set_mask |= (1U << ctrl->headlight_left.pin);
    } else {
        batch_op.clear_mask |= (1U << ctrl->headlight_left.pin);
    }
    
    if (light_mask & HEADLIGHT_RIGHT) {
        batch_op.set_mask |= (1U << ctrl->headlight_right.pin);
    } else {
        batch_op.clear_mask |= (1U << ctrl->headlight_right.pin);
    }
    
    // 批量操作,确保同步性
    gpio_batch_operation(ctrl->headlight_left.port, &batch_op);
}
​
// 转向灯闪烁控制
void turn_signal_blink_task(void) {
    static uint32_t blink_counter = 0;
    static bool blink_state = false;
    
    blink_counter++;
    if (blink_counter >= BLINK_PERIOD) {
        blink_counter = 0;
        blink_state = !blink_state;
        
        if (turn_signal_left_active) {
            gpio_write(&vehicle_ctrl.turn_signal_left, blink_state);
        }
        
        if (turn_signal_right_active) {
            gpio_write(&vehicle_ctrl.turn_signal_right, blink_state);
        }
    }
}

2. 传感器接口设计

// 传感器GPIO接口
typedef struct {
    gpio_pin_t data_pin;
    gpio_pin_t clock_pin;
    gpio_pin_t chip_select;
    gpio_interrupt_type_t interrupt_type;
    gpio_callback_t data_ready_callback;
} sensor_gpio_interface_t;
​
// 配置传感器接口
void configure_sensor_interface(sensor_gpio_interface_t *sensor) {
    // 配置数据引脚为输入,带滤波器
    gpio_set_input(&sensor->data_pin);
    configure_gpio_filter(sensor->data_pin.port, sensor->data_pin.pin, 
                         FILTER_4_CYCLES, true);
    
    // 配置时钟引脚为输出
    gpio_set_output(&sensor->clock_pin);
    
    // 配置片选引脚为输出,初始为高电平
    gpio_set_output(&sensor->chip_select);
    gpio_write(&sensor->chip_select, true);
    
    // 配置数据就绪中断
    configure_gpio_interrupt(&sensor->data_pin, sensor->interrupt_type);
    register_gpio_interrupt(&sensor->data_pin, sensor->data_ready_callback);
}
​
// 传感器数据读取
uint32_t read_sensor_data(sensor_gpio_interface_t *sensor) {
    uint32_t data = 0;
    
    // 拉低片选
    gpio_write(&sensor->chip_select, false);
    delay_us(1);
    
    // 时钟同步读取数据
    for (int i = 0; i < 32; i++) {
        gpio_write(&sensor->clock_pin, true);
        delay_us(1);
        
        data <<= 1;
        if (gpio_read(&sensor->data_pin)) {
            data |= 1;
        }
        
        gpio_write(&sensor->clock_pin, false);
        delay_us(1);
    }
    
    // 拉高片选
    gpio_write(&sensor->chip_select, true);
    
    return data;
}

3. 电机控制接口

// 电机控制GPIO定义
typedef struct {
    gpio_pin_t pwm_u;      // U相PWM
    gpio_pin_t pwm_v;      // V相PWM  
    gpio_pin_t pwm_w;      // W相PWM
    gpio_pin_t enable;     // 使能信号
    gpio_pin_t fault;      // 故障信号输入
    gpio_pin_t hall_a;     // 霍尔传感器A
    gpio_pin_t hall_b;     // 霍尔传感器B
    gpio_pin_t hall_c;     // 霍尔传感器C
} motor_control_gpio_t;

// 电机控制初始化
void init_motor_control_gpio(motor_control_gpio_t *motor) {
    pin_config_t config;
    
    // 配置PWM输出引脚
    config.mux = PIN_ALT4;  // 假设ALT4是eTMR功能
    config.pull_enable = false;
    config.drive_strength = true;  // 高驱动强度
    config.slew_rate = false;      // 快速转换
    
    configure_pin_advanced(motor->pwm_u.port, motor->pwm_u.pin, &config);
    configure_pin_advanced(motor->pwm_v.port, motor->pwm_v.pin, &config);
    configure_pin_advanced(motor->pwm_w.port, motor->pwm_w.pin, &config);
    
    // 配置使能引脚
    gpio_set_output(&motor->enable);
    gpio_write(&motor->enable, false);  // 初始禁用
    
    // 配置故障输入引脚
    gpio_set_input(&motor->fault);
    configure_gpio_filter(motor->fault.port, motor->fault.pin, 
                         FILTER_8_CYCLES, true);
    configure_gpio_interrupt(&motor->fault, GPIO_INT_FALLING_EDGE);
    
    // 配置霍尔传感器输入
    gpio_set_input(&motor->hall_a);
    gpio_set_input(&motor->hall_b);
    gpio_set_input(&motor->hall_c);
    
    // 为霍尔传感器配置中断
    configure_gpio_interrupt(&motor->hall_a, GPIO_INT_BOTH_EDGES);
    configure_gpio_interrupt(&motor->hall_b, GPIO_INT_BOTH_EDGES);
    configure_gpio_interrupt(&motor->hall_c, GPIO_INT_BOTH_EDGES);
}

// 读取霍尔传感器状态
uint8_t read_hall_sensors(motor_control_gpio_t *motor) {
    uint8_t hall_state = 0;
    
    if (gpio_read(&motor->hall_a)) hall_state |= 0x01;
    if (gpio_read(&motor->hall_b)) hall_state |= 0x02;
    if (gpio_read(&motor->hall_c)) hall_state |= 0x04;
    
    return hall_state;
}

低功耗GPIO管理

唤醒源配置

// 低功耗唤醒配置
typedef struct {
    gpio_pin_t wakeup_pins[8];
    uint8_t pin_count;
    gpio_interrupt_type_t wakeup_types[8];
} wakeup_config_t;

void configure_wakeup_sources(wakeup_config_t *config) {
    for (uint8_t i = 0; i < config->pin_count; i++) {
        gpio_pin_t *pin = &config->wakeup_pins[i];
        
        // 配置为输入模式
        gpio_set_input(pin);
        
        // 配置上拉/下拉
        configure_pin_pullup(pin, true);
        
        // 配置唤醒中断类型
        configure_gpio_interrupt(pin, config->wakeup_types[i]);
        
        // 配置为唤醒源
        configure_wakeup_pin(pin);
    }
}

// 进入低功耗前的GPIO状态保存
typedef struct {
    uint32_t pdor[5];    // 输出数据寄存器
    uint32_t poer[5];    // 输出使能寄存器
    uint32_t pier[5];    // 输入使能寄存器
} gpio_power_context_t;

void save_gpio_context(gpio_power_context_t *context) {
    GPIO_Type *ports[] = {GPIOA, GPIOB, GPIOC, GPIOD, GPIOE};
    
    for (int i = 0; i < 5; i++) {
        context->pdor[i] = ports[i]->PDOR;
        context->poer[i] = ports[i]->POER;
        context->pier[i] = ports[i]->PIER;
    }
}

void restore_gpio_context(gpio_power_context_t *context) {
    GPIO_Type *ports[] = {GPIOA, GPIOB, GPIOC, GPIOD, GPIOE};
    
    for (int i = 0; i < 5; i++) {
        ports[i]->PDOR = context->pdor[i];
        ports[i]->POER = context->poer[i];
        ports[i]->PIER = context->pier[i];
    }
}

高级GPIO应用技巧

1. GPIO状态机实现

// GPIO状态机框架
typedef enum {
    GPIO_STATE_IDLE,
    GPIO_STATE_ACTIVE,
    GPIO_STATE_TRANSITION,
    GPIO_STATE_ERROR
} gpio_state_t;

typedef struct {
    gpio_pin_t *pin;
    gpio_state_t current_state;
    gpio_state_t next_state;
    uint32_t state_timer;
    void (*state_handler)(void *context);
} gpio_state_machine_t;

void gpio_state_machine_update(gpio_state_machine_t *sm) {
    if (sm->state_timer > 0) {
        sm->state_timer--;
        return;
    }
    
    switch (sm->current_state) {
        case GPIO_STATE_IDLE:
            if (gpio_read(sm->pin)) {
                sm->next_state = GPIO_STATE_ACTIVE;
                sm->state_timer = 10;  // 10ms去抖动
            }
            break;
            
        case GPIO_STATE_ACTIVE:
            if (!gpio_read(sm->pin)) {
                sm->next_state = GPIO_STATE_IDLE;
                sm->state_timer = 10;
            }
            break;
            
        case GPIO_STATE_TRANSITION:
            sm->next_state = GPIO_STATE_IDLE;
            break;
            
        case GPIO_STATE_ERROR:
            // 错误处理
            break;
    }
    
    if (sm->next_state != sm->current_state) {
        sm->current_state = sm->next_state;
        if (sm->state_handler) {
            sm->state_handler(sm);
        }
    }
}

2. GPIO性能监控

// GPIO性能统计
typedef struct {
    uint32_t toggle_count;
    uint32_t interrupt_count;
    uint32_t max_response_time;
    uint32_t avg_response_time;
} gpio_performance_stats_t;

static gpio_performance_stats_t gpio_stats[5][32];

void gpio_performance_monitor(gpio_pin_t *gpio) {
    uint32_t port_index = get_port_index(gpio->port);
    gpio_performance_stats_t *stats = &gpio_stats[port_index][gpio->pin];
    
    // 记录翻转次数
    static bool last_state[5][32];
    bool current_state = gpio_read(gpio);
    
    if (current_state != last_state[port_index][gpio->pin]) {
        stats->toggle_count++;
        last_state[port_index][gpio->pin] = current_state;
    }
    
    // 更新统计信息
    update_performance_stats(stats);
}

调试与故障排除

GPIO调试工具

// GPIO状态调试
void debug_gpio_status(GPIO_Type *port) {
    printf("Port %p Status:\n", port);
    printf("PDOR: 0x%08X\n", port->PDOR);
    printf("PDIR: 0x%08X\n", port->PDIR);
    printf("POER: 0x%08X\n", port->POER);
    printf("PIER: 0x%08X\n", port->PIER);
    printf("PIFR: 0x%08X\n", port->PIFR);
    
    // 显示每个引脚的配置
    for (int pin = 0; pin < 32; pin++) {
        if (port->POER & (1U << pin)) {
            printf("Pin %d: Output, Level=%d\n", pin, 
                   (port->PDIR & (1U << pin)) ? 1 : 0);
        } else if (port->PIER & (1U << pin)) {
            printf("Pin %d: Input, Level=%d\n", pin,
                   (port->PDIR & (1U << pin)) ? 1 : 0);
        }
    }
}

// GPIO功能测试
bool test_gpio_functionality(gpio_pin_t *gpio) {
    bool test_passed = true;
    
    // 测试输出功能
    gpio_set_output(gpio);
    
    gpio_write(gpio, true);
    delay_us(10);
    if (!gpio_read(gpio)) {
        printf("GPIO output high test failed\n");
        test_passed = false;
    }
    
    gpio_write(gpio, false);
    delay_us(10);
    if (gpio_read(gpio)) {
        printf("GPIO output low test failed\n");
        test_passed = false;
    }
    
    // 测试翻转功能
    gpio_toggle(gpio);
    delay_us(10);
    if (!gpio_read(gpio)) {
        printf("GPIO toggle test failed\n");
        test_passed = false;
    }
    
    return test_passed;
}

总结

YTM32B1ME0x的GPIO和引脚复用系统为汽车电子应用提供了强大而灵活的I/O解决方案。通过合理的系统设计和编程实践,可以充分发挥其性能优势。

关键特性总结:

  1. 丰富的I/O资源:最多126个GPIO,支持8种复用功能

  2. 强大的中断系统:支持多种中断类型和异步唤醒

  3. 可配置的数字滤波:有效抑制信号噪声

  4. 灵活的电气特性:可配置驱动强度、转换速率、上下拉

  5. 汽车级可靠性:适应恶劣的汽车电子环境

最佳实践建议:

  • 根据信号特性选择合适的滤波器配置

  • 合理使用批量操作提高性能

  • 实施完善的中断管理机制

  • 在低功耗应用中优化GPIO配置

  • 建立完整的调试和测试体系

在下一篇文章中,我们将深入探讨YTM32B1ME0x的DMA系统,了解如何实现高效的数据传输和系统性能优化。


本文是YTM32B1ME0x芯片深度解读系列的第三篇,详细介绍了GPIO与引脚复用系统的设计原理和应用实践。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值