S32 Design Studio PE工具配置Power_Manager

工具配置

基本就是默认配置就行,就是在这6个状态里面跳转,重点就是前面2个状态.这个是芯片的电源管理,跟产品的电源管理是两回事。

改变模式能够改变芯片的功耗。

HSRUN是高速运行、RUN就是正常运行、VLPR是极低功耗运行、另外三个属于停止模式。

生成代码

在Generated_Code/pwrMan1.c 里面,对应刚才配置的信息,一共有6个状态。

/* *************************************************************************
 * Configuration structure for Power Manager Configuration 0
 * ************************************************************************* */
/*! @brief User Configuration structure power_managerCfg_0 */
power_manager_user_config_t pwrMan1_InitConfig0 = {
    .powerMode = POWER_MANAGER_HSRUN,                                /*!< Power manager mode  */
    .sleepOnExitValue = false,                                       /*!< Sleep on exit value */
};        
/* *************************************************************************
 * Configuration structure for Power Manager Configuration 1
 * ************************************************************************* */
/*! @brief User Configuration structure power_managerCfg_1 */
power_manager_user_config_t pwrMan1_InitConfig1 = {
    .powerMode = POWER_MANAGER_RUN,                                  /*!< Power manager mode  */
    .sleepOnExitValue = false,                                       /*!< Sleep on exit value */
};        
/* *************************************************************************
 * Configuration structure for Power Manager Configuration 2
 * ************************************************************************* */
/*! @brief User Configuration structure power_managerCfg_2 */
power_manager_user_config_t pwrMan1_InitConfig2 = {
    .powerMode = POWER_MANAGER_VLPR,                                 /*!< Power manager mode  */
    .sleepOnExitValue = false,                                       /*!< Sleep on exit value */
};        
/* *************************************************************************
 * Configuration structure for Power Manager Configuration 3
 * ************************************************************************* */
/*! @brief User Configuration structure power_managerCfg_3 */
power_manager_user_config_t pwrMan1_InitConfig3 = {
    .powerMode = POWER_MANAGER_STOP1,                                /*!< Power manager mode  */
    .sleepOnExitValue = false,                                       /*!< Sleep on exit value */
};        
/* *************************************************************************
 * Configuration structure for Power Manager Configuration 4
 * ************************************************************************* */
/*! @brief User Configuration structure power_managerCfg_4 */
power_manager_user_config_t pwrMan1_InitConfig4 = {
    .powerMode = POWER_MANAGER_STOP2,                                /*!< Power manager mode  */
    .sleepOnExitValue = false,                                       /*!< Sleep on exit value */
};        
/* *************************************************************************
 * Configuration structure for Power Manager Configuration 5
 * ************************************************************************* */
/*! @brief User Configuration structure power_managerCfg_5 */
power_manager_user_config_t pwrMan1_InitConfig5 = {
    .powerMode = POWER_MANAGER_VLPS,                                 /*!< Power manager mode  */
    .sleepOnExitValue = false,                                       /*!< Sleep on exit value */
};        

统一放在powerConfigsArr数组里面,初始化的时候用。

/*! @brief Array of pointers to User configuration structures */
power_manager_user_config_t * powerConfigsArr[] = {
    &pwrMan1_InitConfig0,
    &pwrMan1_InitConfig1,
    &pwrMan1_InitConfig2,
    &pwrMan1_InitConfig3,
    &pwrMan1_InitConfig4,
    &pwrMan1_InitConfig5
};

另外会有一个powerStaticCallbacksConfigsArr结构体数组,把初始化之后的信息接出来,每个结构体就是三个函数,回调函数、回调类型和回调数据,一个结构体对应一个状态。

/*!
 * @brief callback configuration structure
 *
 * This structure holds configuration of callbacks passed
 * to the Power manager during its initialization.
 * Structures of this type are expected to be statically
 * allocated.
 * This structure contains following application-defined data:
 *  callback - pointer to the callback function
 *  callbackType - specifies when the callback is called
 *  callbackData - pointer to the data passed to the callback
 * Implements power_manager_callback_user_config_t_Class
 */
typedef struct
{
    power_manager_callback_t callbackFunction;
    power_manager_callback_type_t callbackType;
    power_manager_callback_data_t * callbackData;
} power_manager_callback_user_config_t;

/*! @brief Array of pointers to User defined Callbacks configuration structures */
power_manager_callback_user_config_t * powerStaticCallbacksConfigsArr[] = {(void *)0};

接口使用

POWER_SYS_Init

初始化接口,传入配置结构体powerConfigsArr,用powerStaticCallbacksConfigsArr获取。

/*FUNCTION**********************************************************************
 *
 * Function Name : POWER_SYS_Init
 * Description   : Initializes the Power manager for operation.
 * This function initializes the Power manager and its run-time state structure.
 * Reference to an array of Power mode configuration structures has to be passed
 * as parameter along with parameter specifying its size. At least one power mode
 * configuration is required. Optionally, reference to array of predefined
 * call-backs can be passed with its size parameter.
 * For details about call-backs refer to the power_manager_callback_user_config_t.
 * As Power manager stores only references to array of these structures they have
 * to exist while Power manager is used.
 *
 * Implements POWER_SYS_Init_Activity
 *END**************************************************************************/
status_t POWER_SYS_Init(power_manager_user_config_t * (*powerConfigsPtr)[],
                        uint8_t configsNumber,
                        power_manager_callback_user_config_t * (*callbacksPtr)[],
                        uint8_t callbacksNumber)
{
    DEV_ASSERT(powerConfigsPtr != NULL);                  /* Reference to the power configurations is valid. */
    DEV_ASSERT(configsNumber != 0U);                      /* Power configuration index is valid. */
    DEV_ASSERT(gPowerManagerState.configs == NULL);       /* Driver is not initialized, reference to configuration is not valid. */
    DEV_ASSERT(gPowerManagerState.configsNumber == 0U);   /* Driver is not initialized, number of configurations is zero. */

    /* Store references to user-defined power mode configurations */
    gPowerManagerState.configs = (power_manager_user_config_t * (*)[])powerConfigsPtr;
    gPowerManagerState.configsNumber = configsNumber;
    gPowerManagerState.currentConfig = 0U;

    /* Store references to user-defined callback configurations and increment call-back handle counter */
    if (callbacksPtr != NULL)
    {
        gPowerManagerState.staticCallbacks = (power_manager_callback_user_config_t * (*)[])callbacksPtr;
        gPowerManagerState.staticCallbacksNumber = callbacksNumber;
        /* Default value of handle of last call-back that returned error */
        gPowerManagerState.errorCallbackIndex = callbacksNumber;
    }
    else
    {
        gPowerManagerState.staticCallbacks = NULL;
        gPowerManagerState.staticCallbacksNumber = 0U;
        gPowerManagerState.errorCallbackIndex = 0U;
    }

    return POWER_SYS_DoInit();
}

举个例子,PWR_MAX是状态个数,一般就是6

POWER_SYS_Init(&powerConfigsArr, PWR_MAX, &powerStaticCallbacksConfigsArr, 0);

POWER_SYS_Deinit

逆初始化

/*FUNCTION**********************************************************************
 *
 * Function Name : POWER_SYS_Deinit
 * Description   : De-initializes the Power manager.
 *
 * Implements POWER_SYS_Deinit_Activity
 *END**************************************************************************/
status_t POWER_SYS_Deinit(void)
{
    gPowerManagerState.configs = NULL;
    gPowerManagerState.configsNumber = 0U;
    gPowerManagerState.staticCallbacks = NULL;
    gPowerManagerState.staticCallbacksNumber = 0U;

    return POWER_SYS_DoDeinit();
}

POWER_SYS_SetMode

这个是最常用的,切换模式。注意不能直接从HSRUN直接切换到VLPS, STOP1, STOP2,要先切换到正常再停止。

/*FUNCTION**********************************************************************
 *
 * Function Name : POWER_SYS_SetMode
 * Description   : Configures the power mode.
 *
 * This function switches to one of the defined power modes. Requested mode number is passed
 * as an input parameter. This function notifies all registered callback functions before
 * the mode change (using  POWER_MANAGER_CALLBACK_BEFORE set as callback type parameter),
 * sets specific power options defined in the power mode configuration and enters the specified
 * mode. In case of success switch, this function also invokes all registered callbacks after
 * the mode change (using POWER_MANAGER_CALLBACK_AFTER).
 * The actual mode switch is performed by POWER_SYS_DoSetMode in the specific implementation.
 * Callbacks are invoked in the following order: All registered callbacks are notified
 * ordered by index in the callbacks array (see callbacksPtr parameter of POWER_SYS_Init()).
 * The same order is used for before and after switch notifications.
 * The notifications before the power mode switch can be used to obtain confirmation about
 * the change from registered callbacks. If any registered callback denies the power
 * mode change, further execution of this function depends on mode change policy: the mode
 * change is either forced(POWER_MANAGER_POLICY_FORCIBLE) or exited(POWER_MANAGER_POLICY_AGREEMENT).
 * When mode change is forced, the result of the before switch notifications are ignored. If
 * agreement is required, if any callback returns an error code then further notifications
 * before switch notifications are cancelled and all already notified callbacks are re-invoked
 * with POWER_MANAGER_CALLBACK_AFTER set as callback type parameter. The index of the callback
 * which returned error code during pre-switch notifications is stored(any error codes during
 * callbacks re-invocation are ignored) and POWER_SYS_GetErrorCallback() can be used to get it.
 * Regardless of the policies, if any callback returned an error code, an error code denoting in which phase
 * the error occurred is returned when POWER_SYS_SetMode() exits.
 * It is possible to enter any mode supported by the processor. Refer to the chip reference manual
 * for list of available power modes. If it is necessary to switch into intermediate power mode prior to
 * entering requested mode, then the intermediate mode is entered without invoking the callback mechanism.
 *
 * Implements POWER_SYS_SetMode_Activity
 *END**************************************************************************/
status_t POWER_SYS_SetMode(uint8_t powerModeIndex,
                           power_manager_policy_t policy)
{
    power_manager_user_config_t * configPtr; /* Local pointer to the requested user-defined power mode configuration */
    status_t returnCode; /* Function return */
    status_t errorCode;
    bool successfulSwitch;                                 /* Power mode switch is successful or not */
    uint8_t currentStaticCallback = 0U;                    /* Index to array of statically registered call-backs */
    power_manager_notify_struct_t notifyStruct;            /* Callback notification structure */

    /* Driver is already initialized. */
    DEV_ASSERT(gPowerManagerState.configs != NULL);
    DEV_ASSERT(gPowerManagerState.configsNumber != 0U);

    /* Power mode index is valid. */
    DEV_ASSERT(powerModeIndex < gPowerManagerState.configsNumber);

    /* Initialization of local pointer to the requested user-defined power mode configuration */
    configPtr = (*gPowerManagerState.configs)[powerModeIndex];

    /* Reference to the requested user-defined power mode configuration is valid. */
    DEV_ASSERT(configPtr != NULL);

    /* Default value of handle of last call-back that returned error */
    gPowerManagerState.errorCallbackIndex = gPowerManagerState.staticCallbacksNumber;

    /* Set the transaction policy in the notification structure */
    notifyStruct.policy = policy;

    /* Set the target power mode configuration in the notification structure */
    notifyStruct.targetPowerConfigIndex = powerModeIndex;
    notifyStruct.targetPowerConfigPtr = configPtr;

    /* Notify those which asked to be called before the power mode change */
    notifyStruct.notifyType = POWER_MANAGER_NOTIFY_BEFORE;
    returnCode = POWER_SYS_CallbacksManagement(&notifyStruct, &currentStaticCallback, policy);

    /* Power mode switch */
    /* In case that any call-back returned error code and  policy doesn't force the mode switch go to after switch call-backs */
    if ((policy == POWER_MANAGER_POLICY_FORCIBLE) || (returnCode == STATUS_SUCCESS))
    {
        returnCode = POWER_SYS_DoSetMode(configPtr);
        successfulSwitch = (STATUS_SUCCESS == returnCode);
    }
    else
    {
        /* Unsuccessful switch */
        successfulSwitch = false;
    }

    if (successfulSwitch)
    {
        /* End of successful switch */

        /* Update current configuration index */
        gPowerManagerState.currentConfig = powerModeIndex;

        /* Notify those which asked to be called after the power mode change */
        notifyStruct.notifyType = POWER_MANAGER_NOTIFY_AFTER;
        returnCode = POWER_SYS_CallbacksManagement(&notifyStruct, &currentStaticCallback, POWER_MANAGER_POLICY_FORCIBLE);
    }
    else
    {
        /* End of unsuccessful switch */

        /* Notify those which have been called before the power mode change */
        notifyStruct.notifyType = POWER_MANAGER_NOTIFY_RECOVER;
        errorCode = POWER_SYS_CallbacksManagement(&notifyStruct, &currentStaticCallback, POWER_MANAGER_POLICY_FORCIBLE);
        (void)(errorCode);
    }

    return returnCode;
}

入参有两个,一个是模式,就是上面那6个的其中一个,顺序对应配置界面从0-5。在power_manager_S32K1xx.h文件里面,把相应的枚举复制过去就行。

/*!
 * @brief Power modes enumeration.
 *
 * Defines power modes. Used in the power mode configuration structure
 * (power_manager_user_config_t). From ARM core perspective, Power modes
 * can be generally divided into run modes (High speed run, Run and
 * Very low power run), sleep (Wait and Very low power wait) and deep sleep modes
 * (all Stop modes).
 * List of power modes supported by specific chip along with requirements for entering
 * and exiting of these modes can be found in chip documentation.
 * List of all supported power modes:\n
 *  \li POWER_MANAGER_HSRUN - High speed run mode.
 *  \li POWER_MANAGER_RUN - Run mode.
 *  \li POWER_MANAGER_VLPR - Very low power run mode.
 *  \li POWER_MANAGER_WAIT - Wait mode.
 *  \li POWER_MANAGER_VLPW - Very low power wait mode.
 *  \li POWER_MANAGER_PSTOP1 - Partial stop 1 mode.
 *  \li POWER_MANAGER_PSTOP2 - Partial stop 2 mode.
 *  \li POWER_MANAGER_PSTOP1 - Stop 1 mode.
 *  \li POWER_MANAGER_PSTOP2 - Stop 2 mode.
 *  \li POWER_MANAGER_VLPS - Very low power stop mode.
 * Implements power_manager_modes_t_Class
 */
typedef enum
{
#if FEATURE_SMC_HAS_HIGH_SPEED_RUN_MODE
    POWER_MANAGER_HSRUN,            /*!< High speed run mode.  */
#endif
    POWER_MANAGER_RUN,              /*!< Run mode. */
    POWER_MANAGER_VLPR,             /*!< Very low power run mode.  */
#if FEATURE_SMC_HAS_WAIT_VLPW
    POWER_MANAGER_WAIT,             /*!< Wait mode.  */
    POWER_MANAGER_VLPW,             /*!< Very low power wait mode.  */
#endif
#if FEATURE_SMC_HAS_PSTOPO
    POWER_MANAGER_PSTOP1,           /*!< Partial stop 1 mode. */
    POWER_MANAGER_PSTOP2,           /*!< Partial stop 2 mode. */
#endif
#if FEATURE_SMC_HAS_STOPO
    POWER_MANAGER_STOP1,           /*!< Stop 1 mode. */
    POWER_MANAGER_STOP2,           /*!< Stop 2 mode. */
#endif
    POWER_MANAGER_VLPS,             /*!< Very low power stop mode.  */
    POWER_MANAGER_MAX
} power_manager_modes_t;

第二个入参是切换模式时候的方法,需要所有回调成功就用POWER_MANAGER_POLICY_AGREEMENT,我们一般用这个。不需要看回调结果就用POWER_MANAGER_POLICY_FORCIBLE。

/*!
 * @brief Power manager policies.
 *
 * Defines whether the mode switch initiated by the POWER_SYS_SetMode() is agreed upon
 * (depending on the result of notification callbacks), or forced.
 * For POWER_MANAGER_POLICY_FORCIBLE the power mode is changed
 * regardless of the callback results, while for POWER_MANAGER_POLICY_AGREEMENT policy
 * any error code returned by one of the callbacks aborts the mode change.
 * See also POWER_SYS_SetMode() description.
 * Implements power_manager_policy_t_Class
 */
typedef enum
{
    POWER_MANAGER_POLICY_AGREEMENT,      /*!< Power mode is changed if all of the callbacks return success. */
    POWER_MANAGER_POLICY_FORCIBLE        /*!< Power mode is changed regardless of the result of callbacks. */
} power_manager_policy_t;

POWER_SYS_GetLastMode

获取切换前上次的模式

/*FUNCTION**********************************************************************
 *
 * Function Name : POWER_SYS_GetLastMode
 * Description   : This function returns power mode set as the last one.
 *
 * This function returns index of power mode which was set using POWER_SYS_SetMode() as the last one.
 * If the power mode was entered although some of the registered call-back denied the mode change
 * or if any of the call-backs invoked after the entering/restoring run mode failed then the return
 * code of this function has STATUS_ERROR value.
 * value.
 *
 * Implements POWER_SYS_GetLastMode_Activity
 *END**************************************************************************/
status_t POWER_SYS_GetLastMode(uint8_t * powerModeIndexPtr)
{
    status_t returnCode; /* Function return */

    /* Pass index of user-defined configuration structure of currently running power mode */
    *powerModeIndexPtr = gPowerManagerState.currentConfig;

    /* Return whether all call-backs executed without error */
    if (gPowerManagerState.errorCallbackIndex == gPowerManagerState.staticCallbacksNumber)
    {
        returnCode = STATUS_SUCCESS;
    }
    else
    {
        returnCode = STATUS_ERROR;
    }

    return returnCode;
}

POWER_SYS_GetLastModeConfig

获取上次设置模式的配置内容

/*FUNCTION**********************************************************************
 *
 * Function Name : POWER_SYS_GetLastModeConfig
 * Description   : This function returns user configuration structure of power mode set as the last one.
 *
 * This function returns reference to configuration structure which was set using POWER_SYS_SetMode()
 * as the last one. If the current power mode was entered although some of the registered call-back denied
 * the mode change or if any of the call-backs invoked after the entering/restoring run mode failed then
 * the return code of this function has STATUS_ERROR value.
 *
 * Implements POWER_SYS_GetLastModeConfig_Activity
 *END**************************************************************************/
status_t POWER_SYS_GetLastModeConfig(power_manager_user_config_t ** powerModePtr)
{
    status_t returnCode; /* Function return */
    /* Pass reference to user-defined configuration structure of currently running power mode */
    *powerModePtr = (*gPowerManagerState.configs)[gPowerManagerState.currentConfig];

    /* Return whether all call-backs executed without error */
    if (gPowerManagerState.errorCallbackIndex == gPowerManagerState.staticCallbacksNumber)
    {
        returnCode = STATUS_SUCCESS;
    }
    else
    {
        returnCode = STATUS_ERROR;
    }

    return returnCode;
}

POWER_SYS_GetCurrentMode

获取当前模式

/*FUNCTION**********************************************************************
 *
 * Function Name : POWER_SYS_GetCurrentMode
 * Description   : Returns currently running power mode.
 *
 * Implements POWER_SYS_GetCurrentMode_Activity
 *
 *END**************************************************************************/
power_manager_modes_t POWER_SYS_GetCurrentMode(void)
{
    power_manager_modes_t retVal;

    switch (SMC_GetPowerModeStatus(SMC))
    {
#if FEATURE_SMC_HAS_HIGH_SPEED_RUN_MODE
        /* High speed run mode */
        case STAT_HSRUN:
            retVal = POWER_MANAGER_HSRUN;
            break;
#endif
        /* Run mode */
        case STAT_RUN:
            retVal = POWER_MANAGER_RUN;
            break;
        /* Very low power run mode */
        case STAT_VLPR:
            retVal = POWER_MANAGER_VLPR;
            break;
        /* This should never happen - core has to be in some run mode to execute code */
        default:
            retVal = POWER_MANAGER_MAX;
            break;
    }

    return retVal;
}

POWER_SYS_GetErrorCallbackIndex

返回错误信息索引的回调函数,一般用不上。

/*FUNCTION**********************************************************************
 *
 * Function Name : POWER_SYS_GetErrorCallbackIndex
 * Description   : Returns the last failed notification callback.
 *
 * This function returns index of the last call-back that failed during the power mode switch while
 * the last POWER_SYS_SetMode() was called. If the last POWER_SYS_SetMode() call ended successfully
 * value equal to callbacks number is returned. Returned value represents index in the array of
 * static call-backs.
 *
 * Implements POWER_SYS_GetErrorCallbackIndex_Activity
 *END**************************************************************************/
uint8_t POWER_SYS_GetErrorCallbackIndex(void)
{
    return gPowerManagerState.errorCallbackIndex;
}

POWER_SYS_GetErrorCallback

获取错误的回调函数

/*FUNCTION**********************************************************************
 *
 * Function Name : POWER_SYS_GetErrorCallback
 * Description   : Get the callback which returns error in last mode switch.
 *
 * Implements POWER_SYS_GetErrorCallback_Activity
 *END**************************************************************************/
power_manager_callback_user_config_t * POWER_SYS_GetErrorCallback(void)
{

    /* If all callbacks return success. */
    return (gPowerManagerState.errorCallbackIndex >=
            gPowerManagerState.staticCallbacksNumber) ? NULL : (*gPowerManagerState.staticCallbacks)[gPowerManagerState.errorCallbackIndex];
}

POWER_SYS_GetDefaultConfig

获取默认配置

/*FUNCTION**********************************************************************
 *
 * Function Name : POWER_SYS_GetDefaultConfig
 * Description   : Initializes the power_manager configuration structure.
 * This function returns a pointer of the power_manager configuration structure.
 * All structure members have default value when CPU is default power mode.
 *
 * Implements    : POWER_SYS_GetDefaultConfig_Activity
 *END**************************************************************************/
void POWER_SYS_GetDefaultConfig(power_manager_user_config_t * const config)
{
    POWER_SYS_DoGetDefaultConfig(config);
}

POWER_SYS_GetResetSrcStatusCmd

获取指定源的当前复位源状态

/*FUNCTION**********************************************************************
 *
 * Function Name : POWER_SYS_GetResetSrcStatusCmd
 * Description   : This function will get the current reset source status for specified source
 *
 * Implements POWER_SYS_GetResetSrcStatusCmd_Activity
 *
 *END**************************************************************************/
bool POWER_SYS_GetResetSrcStatusCmd(const RCM_Type * const baseAddr , const rcm_source_names_t srcName)
{
    return RCM_GetSrcStatusCmd(baseAddr , srcName);
}

第一个入参是RCM寄存器基地址,S32K146.h里面有,

#define RCM   ((RCM_Type *)RCM_BASE)

第二个入参是唤醒源,在power_manager_S32K1xx.h里面。

/*!
 * @brief System Reset Source Name definitions
 * Implements rcm_source_names_t_Class
 */
typedef enum
{
    RCM_LOW_VOLT_DETECT      = 1U,             /*!< Low voltage detect reset */
    RCM_LOSS_OF_CLK          = 2U,       /*!< Loss of clock reset */
    RCM_LOSS_OF_LOCK         = 3U,       /*!< Loss of lock reset */
#if FEATURE_RCM_HAS_CMU_LOSS_OF_CLOCK
    RCM_CMU_LOC              = 4U,        /*!< CMU Loss of lock reset */
#endif
    RCM_WATCH_DOG            = 5U,        /*!< Watch dog reset */
    RCM_EXTERNAL_PIN         = 6U,       /*!< External pin reset */
    RCM_POWER_ON             = 7U,       /*!< Power on reset */
    RCM_SJTAG                = 8U,       /*!< JTAG generated reset */
    RCM_CORE_LOCKUP          = 9U,       /*!< core lockup reset */
    RCM_SOFTWARE             = 10U,       /*!< Software reset */
    RCM_SMDM_AP              = 11U,       /*!< MDM-AP system reset */
    RCM_STOP_MODE_ACK_ERR    = 13U,       /*!< Stop mode ack error reset */
    RCM_SRC_NAME_MAX
} rcm_source_names_t;

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鱼的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值