STM32H723 CANFD配置、调试

STM32H723 CANFD配置、调试

1cubemx配置

Fdcan时钟频率选择80Mhz(可以根据需求配置);

选择要配置的fdcan,配置好初始化参数

2初始化FDcan

2.1初始化示例:

void MX_FDCAN1_Init(void)

{

hfdcan1.Instance = FDCAN1;

  hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;//设置FDCAN的帧格式为灵活数据频率(FD)帧

  hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;//FDCAN的工作模式设置为正常模式

  hfdcan1.Init.AutoRetransmission = DISABLE;//关闭自动重传功能。

  hfdcan1.Init.TransmitPause = DISABLE;//禁用发送暂停功胿

  hfdcan1.Init.ProtocolException = DISABLE;//关闭协议异常处理

  hfdcan1.Init.NominalPrescaler = 1;//仲裁段分频

  hfdcan1.Init.NominalSyncJumpWidth = 1;//仲裁段跳转宽度

  hfdcan1.Init.NominalTimeSeg1 = 127;//仲裁段时间段1

  hfdcan1.Init.NominalTimeSeg2 = 32;//仲裁段时间段2

  hfdcan1.Init.DataPrescaler = 1;//数据段分频

  hfdcan1.Init.DataSyncJumpWidth = 1;//数据段跳转宽庿

  hfdcan1.Init.DataTimeSeg1 = 15;//数据段时间段1

  hfdcan1.Init.DataTimeSeg2 = 4;//数据段时间段2

  hfdcan1.Init.MessageRAMOffset = 0;//RAM偏移量

  hfdcan1.Init.StdFiltersNbr = 4;//标准id过滤器个数

  hfdcan1.Init.ExtFiltersNbr = 4;//扩展id过滤器个数

  hfdcan1.Init.RxFifo0ElmtsNbr = 1;//fifo0个数

  hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;

  hfdcan1.Init.RxFifo1ElmtsNbr = 1;

  hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64;

  hfdcan1.Init.RxBuffersNbr = 4;接收缓冲区个数

  hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_64;

  hfdcan1.Init.TxEventsNbr = 0;//tx事件缓冲区个数

  hfdcan1.Init.TxBuffersNbr = 1;//发送缓冲区个数

  hfdcan1.Init.TxFifoQueueElmtsNbr = 1;//txfifohuotx队列缓冲区个数

  hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;//选择TXFIFO模式或TX队列模式

  hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_64;//发送数据的字节数

}

2.2初始化参数配置

FrameFormat :FDCAN_FRAME_FD_BRS(用于设置CAN格式)

#define FDCAN_FRAME_CLASSIC   ((uint32_t)0x00000000U)       /* 经典CAN模式 */

#define FDCAN_FRAME_FD_NO_BRS ((uint32_t)FDCAN_CCCR_FDOE)   /* FD CAN不带可变波特率 */

#define FDCAN_FRAME_FD_BRS    ((uint32_t)(FDCAN_CCCR_FDOE | FDCAN_CCCR_BRSE)) /* FD CAN带可变波特率 */

Mode :FDCAN_MODE_NORMAL(用于设置CAN操作模式)

#define FDCAN_MODE_NORMAL               ((uint32_t)0x00000000U) /*!< 正常模式                 */

#define FDCAN_MODE_RESTRICTED_OPERATION ((uint32_t)0x00000001U) /*!< 有限制的操作模式          */

#define FDCAN_MODE_BUS_MONITORING       ((uint32_t)0x00000002U) /*!< 总线监测模式              */

#define FDCAN_MODE_INTERNAL_LOOPBACK    ((uint32_t)0x00000003U) /*!< 内部环回模式              */

#define FDCAN_MODE_EXTERNAL_LOOPBACK    ((uint32_t)0x00000004U) /*!< 外部环回模式             */

 AutoRetransmission:DISABLE(使能自动重传模式。使能ENABLE或者禁止DISABLE)。

TransmitPause:DISABLE(使能或者禁止传输暂停特性。ENABLE使能或者DISABLE禁止)。

ProtocolException:DISABLE(使能或者禁止协议异常管理。ENABLE表示使能,DISABLE表示禁止)。

NominalPrescaler:1(用于CAN FD仲裁阶段分频设置,产生标称位时间量,参数范围1-512)。

NominalSyncJumpWidth:1(设置FD CAN仲裁阶段最大支持的时间量来加长或者缩短一个bit来实现再同步,参数范围1-128)。

NominalTimeSeg1:127(设置仲裁阶段Bit Segment 1的时间量,范围2 – 256)。

NominalTimeSeg2:32(设置仲裁阶段Bit Segment 2的时间量,范围2 – 128)。

DataPrescaler:1(用于CAN FD数据阶段分频设置,范围1-32)。

DataSyncJumpWidth:1(设置FD CAN数据阶段最大支持的时间量来加长或者缩短一个bit来实现数据再同步,参数范围1-16)。

DataTimeSeg1:15(设置数据阶段Data Bit Segment 1的时间量,范围1 – 32)。

DataTimeSeg2:4(设置数据阶段Data Bit Segment 2的时间量,范围1 – 16)。

MessageRAMOffset:0(设置消息RAM起始地址,范围0到2560)。

StdFiltersNbr:4(标准ID过滤个数,范围0到128)。

ExtFiltersNbr:4(扩展ID过滤个数,范围0到64)。

RxFifo0ElmtsNbr:1(RX FIFO0元素个数,范围0到64)。

RxFifo0ElmtSize:FDCAN_DATA_BYTES_64(RX FIFO0每个元素中数据大小)。

#define FDCAN_DATA_BYTES_8  ((uint32_t)0x00000004U) /*!< 8 bytes data field  */

#define FDCAN_DATA_BYTES_12 ((uint32_t)0x00000005U) /*!< 12 bytes data field */

#define FDCAN_DATA_BYTES_16 ((uint32_t)0x00000006U) /*!< 16 bytes data field */

#define FDCAN_DATA_BYTES_20 ((uint32_t)0x00000007U) /*!< 20 bytes data field */

#define FDCAN_DATA_BYTES_24 ((uint32_t)0x00000008U) /*!< 24 bytes data field */

#define FDCAN_DATA_BYTES_32 ((uint32_t)0x0000000AU) /*!< 32 bytes data field */

#define FDCAN_DATA_BYTES_48 ((uint32_t)0x0000000EU) /*!< 48 bytes data field */

#define FDCAN_DATA_BYTES_64 ((uint32_t)0x00000012U) /*!< 64 bytes data field */

RxFifo1ElmtsNbr:1(RX FIFO1个数,范围0到64)。

RxFifo1ElmtSize:FDCAN_DATA_BYTES_64(RX FIFO1每个元素中数据大小)。

RxBuffersNbr:4(设置Rx Buffer元素个数,范围0 - 64)。

RxBuffersSize:FDCAN_DATA_BYTES_64(设置Rx Buffer元素中每个数据大小,范围0 - 64)

TxEventsNbr:0(Tx Event FIFO元素个数,范围0到32)。

TxBuffersNbr:1(设置专用的Tx Buffer元素个数,范围0到32)。

TxFifoQueueElmtsNbr:0(设置用于Tx FIFO/Queue的Tx Buffers个数。范围0到32)。

TxFifoQueueMode: FDCAN_TX_FIFO_OPERATION(设置FIFO模式或者QUEUE队列模式)。

#define FDCAN_TX_FIFO_OPERATION  ((uint32_t)0x00000000U)     /*!< FIFO mode  */

#define FDCAN_TX_QUEUE_OPERATION ((uint32_t)FDCAN_TXBC_TFQM) /*!< Queue mode */

 TxElmtSize:FDCAN_DATA_BYTES_64(设置Tx Element中的数据域大小)。

配置完初始化参数后需要启动fdcan:

/* 启动FDCAN */

HAL_FDCAN_Start(&hfdcan1);

3波特率、采样点计算方法如下:
波特率 = CAN总线时钟频率/Prescaler/(1+TimeSeg1+TimeSeg2)
采样点参数 = (1+TimeSeg1)/(1+TimeSeg1+TimeSeg2)

3.1仲裁段波特率、采样点计算:

500k=80M/(1*(1+NominalTimeSeg1 +NominalTimeSeg2))

0.8=(1+NominalTimeSeg1 )/(1+NominalTimeSeg1 +NominalTimeSeg2)

计算出:NominalTimeSeg1 =127,NominalTimeSeg12=32;

3.2数据段波特率、采样点计算:

4M=80M/(1*(1+DataTimeSeg1+DataTimeSeg2))

0.8=(1+DataTimeSeg1)/(1+DataTimeSeg1+DataTimeSeg2)

计算出:DataTimeSeg1=15,DataTimeSeg2=4;

3.3数据段、采样点常用配置

上面公式的0.8是采样点,一般都取80%。

TimeSeg1=采样点*(FDCAN频率/(波特率*分频系数))-1

TimeSeg2=(1-采样点)*(FDCAN频率/(波特率*分频系数))

常用的timseg和Prescaler配置:

FDCAN时钟频率

Prescaler

仲裁段/数据段频率

采样点

TimeSeg1

TimeSeg2

80M

1

500k

80%

127

32

80M

1

1M

80%

63

16

80M

1

2M

80%

31

8

80M

1

4M

80%

15

4

80M

1

5M

80%

13

3

4滤波器初始化

4.1滤波器初始化示例:

可以将这段代码添加到fdcan初始化函数里面

FDCAN_FilterTypeDef FDCAN1_FilerConf;

FDCAN1_FilerConf.IdType=FDCAN_STANDARD_ID; //过滤id类型,标准id

FDCAN1_FilerConf.FilterIndex=0;//过滤器索引,使用哪个filter

FDCAN1_FilerConf.FilterType=FDCAN_FILTER_MASK;//过滤id掩码模式

FDCAN1_FilerConf.FilterConfig=FDCAN_FILTER_TO_RXFIFO0;//过滤到fifo0

FDCAN1_FilerConf.FilterID1=0;

FDCAN1_FilerConf.FilterID2=0;

if(HAL_FDCAN_ConfigFilter(&hfdcan1,&FDCAN1_FilerConf)!=HAL_OK)

{

Error_Handler();

}

4.2滤波器参数配置

IdType用于设置标准ID和扩展ID。

#define FDCAN_STANDARD_ID ((uint32_t)0x00000000U) /*!< 标准ID */

#define FDCAN_EXTENDED_ID ((uint32_t)0x40000000U) /*!< 扩展ID */

FilterIndex用于过滤索引,如果是标准ID,范围0到127。如果是扩展ID,范围0到64。

FilterType用于设置过滤类型。如果成员FilterConfig设置为FDCAN_FILTER_TO_RXBUFFER,本参数将不起作用。

/*!< 范围过滤从FilterID1 到 FilterID2  */

#define FDCAN_FILTER_RANGE  ((uint32_t)0x00000000U)

/*!< 专用ID过滤,FilterID1 或者FilterID2  */

#define FDCAN_FILTER_DUAL   ((uint32_t)0x00000001U)

 /*!< 精度屏蔽过滤,FilterID1 = filter, FilterID2 = mask */

#define FDCAN_FILTER_MASK   ((uint32_t)0x00000002U)

/*!< 仅ID扩展模式支持此参数,范围从FilterID1 到 FilterID2, EIDM mask not applied */

#define FDCAN_FILTER_RANGE_NO_EIDM ((uint32_t)0x00000003U)

FilterConfig用于设置过滤类型。

#define FDCAN_FILTER_DISABLE       ((uint32_t)0x00000000U)  禁止过滤

#define FDCAN_FILTER_TO_RXFIFO0    ((uint32_t)0x00000001U)  如果过滤匹配,将数据保存到Rx FIFO 0

#define FDCAN_FILTER_TO_RXFIFO1    ((uint32_t)0x00000002U)  如果过滤匹配,将数据保存到Rx FIFO 1

#define FDCAN_FILTER_REJECT        ((uint32_t)0x00000003U)  如果过滤匹配,拒绝此ID

#define FDCAN_FILTER_HP            ((uint32_t)0x00000004U)  如果过滤匹配,设置高优先级

#define FDCAN_FILTER_TO_RXFIFO0_HP ((uint32_t)0x00000005U)  如果过滤匹配,设置高优先级并保存到FIFO 0

#define FDCAN_FILTER_TO_RXFIFO1_HP ((uint32_t)0x00000006U)  如果过滤匹配,设置高优先级并保存到FIFO 1

#define FDCAN_FILTER_TO_RXBUFFER   ((uint32_t)0x00000007U)  如果过滤匹配,保存到Rx Buffer,并忽FilterType配置

FilterID1用于设置过滤ID1。如果ID类型是FDCAN_STANDARD_ID,范围0到0x7FF。如果ID类型是FDCAN_EXTENDED_ID,范围是0 到0x1FFFFFFF。

FilterID2用于设置过滤ID2。如果FilterConfig设置为FDCAN_FILTER_TO_RXBUFFER,此参数不起作用。如果ID类型是FDCAN_STANDARD_ID,范围0到0x7FF。如果ID类型是FDCAN_EXTENDED_ID,范围是0 到0x1FFFFFFF。

RxBufferIndex匹配消息存储到Rx buffer中的索引。参数范围0到63。如果FilterConfig设置为FDCAN_FILTER_TO_RXBUFFER,此参数不起作用。

IsCalibrationMsg用于设置是否配置校准消息。如果FilterConfig设置为FDCAN_FILTER_TO_RXBUFFER,此参数不起作用。

0 : 表示正常消息。

1 : 标志校准消息

5发送数据帧函数

5.1使用fifo缓冲区

 初始化的时候配置:

 hfdcan1.Init.TxFifoQueueElmtsNbr = 1;//设置Tx FIFO/Queue的Tx Buffers个数,0-32,这里设置1,表示使用一个fifo缓冲区。

 hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;//设置FIFO模式

然后配置仲裁段Txheader,再通过HAL_FDCAN_AddMessageToTxFifoQ()函数将要发送的数据添加到fifo,不需要手动发送。

HAL_StatusTypeDef HAL_FDCAN_AddMessageToTxFifoQ(FDCAN_HandleTypeDef *hfdcan, const FDCAN_TxHeaderTypeDef *pTxHeader, const uint8_t *pTxData)

pTxHeader:仲裁段配置信息

pTxData:要发送的数据缓冲区

5.1使用Txbuff专门发送缓冲区

     初始化时候配置:

 hfdcan1.Init.TxBuffersNbr = 1;//发送缓冲区个数,这里设置一个txbuff缓冲区

然后配置仲裁段Txheader,调用HAL_FDCAN_AddMessageToTxBuffer()将数据添加到txbuff缓冲区,还需要手动将数据发送出去,调用HAL_FDCAN_EnableTxBufferRequest()将数据发送出去。

HAL_StatusTypeDef HAL_FDCAN_AddMessageToTxBuffer(FDCAN_HandleTypeDef *hfdcan, const FDCAN_TxHeaderTypeDef *pTxHeader, const uint8_t *pTxData, uint32_t BufferIndex)

HAL_StatusTypeDef HAL_FDCAN_EnableTxBufferRequest(FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndex)

pTxHeader:仲裁段配置信息

pTxData:要发送的数据缓冲区

BufferIndex:将pTxData先添加到txbuffer缓冲区的索引。有32个txbuff专门发送缓冲区。

BufferIndex可以填下面宏指定将pTxData添加到第几个txbuff

#define FDCAN_TX_BUFFER0  ((uint32_t)0x00000001U) /*!< Add message to Tx Buffer 0  */

#define FDCAN_TX_BUFFER1  ((uint32_t)0x00000002U) /*!< Add message to Tx Buffer 1  */

#define FDCAN_TX_BUFFER2  ((uint32_t)0x00000004U) /*!< Add message to Tx Buffer 2  */

#define FDCAN_TX_BUFFER3  ((uint32_t)0x00000008U) /*!< Add message to Tx Buffer 3  */

#define FDCAN_TX_BUFFER4  ((uint32_t)0x00000010U) /*!< Add message to Tx Buffer 4  */

#define FDCAN_TX_BUFFER5  ((uint32_t)0x00000020U) /*!< Add message to Tx Buffer 5  */

#define FDCAN_TX_BUFFER6  ((uint32_t)0x00000040U) /*!< Add message to Tx Buffer 6  */

#define FDCAN_TX_BUFFER7  ((uint32_t)0x00000080U) /*!< Add message to Tx Buffer 7  */

#define FDCAN_TX_BUFFER8  ((uint32_t)0x00000100U) /*!< Add message to Tx Buffer 8  */

#define FDCAN_TX_BUFFER9  ((uint32_t)0x00000200U) /*!< Add message to Tx Buffer 9  */

#define FDCAN_TX_BUFFER10 ((uint32_t)0x00000400U) /*!< Add message to Tx Buffer 10 */

#define FDCAN_TX_BUFFER11 ((uint32_t)0x00000800U) /*!< Add message to Tx Buffer 11 */

#define FDCAN_TX_BUFFER12 ((uint32_t)0x00001000U) /*!< Add message to Tx Buffer 12 */

#define FDCAN_TX_BUFFER13 ((uint32_t)0x00002000U) /*!< Add message to Tx Buffer 13 */

#define FDCAN_TX_BUFFER14 ((uint32_t)0x00004000U) /*!< Add message to Tx Buffer 14 */

#define FDCAN_TX_BUFFER15 ((uint32_t)0x00008000U) /*!< Add message to Tx Buffer 15 */

#define FDCAN_TX_BUFFER16 ((uint32_t)0x00010000U) /*!< Add message to Tx Buffer 16 */

#define FDCAN_TX_BUFFER17 ((uint32_t)0x00020000U) /*!< Add message to Tx Buffer 17 */

#define FDCAN_TX_BUFFER18 ((uint32_t)0x00040000U) /*!< Add message to Tx Buffer 18 */

#define FDCAN_TX_BUFFER19 ((uint32_t)0x00080000U) /*!< Add message to Tx Buffer 19 */

#define FDCAN_TX_BUFFER20 ((uint32_t)0x00100000U) /*!< Add message to Tx Buffer 20 */

#define FDCAN_TX_BUFFER21 ((uint32_t)0x00200000U) /*!< Add message to Tx Buffer 21 */

#define FDCAN_TX_BUFFER22 ((uint32_t)0x00400000U) /*!< Add message to Tx Buffer 22 */

#define FDCAN_TX_BUFFER23 ((uint32_t)0x00800000U) /*!< Add message to Tx Buffer 23 */

#define FDCAN_TX_BUFFER24 ((uint32_t)0x01000000U) /*!< Add message to Tx Buffer 24 */

#define FDCAN_TX_BUFFER25 ((uint32_t)0x02000000U) /*!< Add message to Tx Buffer 25 */

#define FDCAN_TX_BUFFER26 ((uint32_t)0x04000000U) /*!< Add message to Tx Buffer 26 */

#define FDCAN_TX_BUFFER27 ((uint32_t)0x08000000U) /*!< Add message to Tx Buffer 27 */

#define FDCAN_TX_BUFFER28 ((uint32_t)0x10000000U) /*!< Add message to Tx Buffer 28 */

#define FDCAN_TX_BUFFER29 ((uint32_t)0x20000000U) /*!< Add message to Tx Buffer 29 */

#define FDCAN_TX_BUFFER30 ((uint32_t)0x40000000U) /*!< Add message to Tx Buffer 30 */

#define FDCAN_TX_BUFFER31 ((uint32_t)0x80000000U) /*!< Add message to Tx Buffer 31 */

5.3发送数据函数示例

使用fifo发送数据示例:

HAL_StatusTypeDef FDCAN3_SendMsg(uint8_t *DataBuf, uint8_t Len,uint32_t ID)

{

FDCAN_TxHeaderTypeDef TxHeader={0};

TxHeader.Identifier=ID; //设置接收帧消息的ID

TxHeader.IdType=FDCAN_STANDARD_ID;//标准id

TxHeader.TxFrameType=FDCAN_DATA_FRAME;//发数据

TxHeader.DataLength=Len;//数据长度(FDCAN_DLC_BYTES_64 --64字节)

TxHeader.BitRateSwitch=FDCAN_BRS_ON ;//可变波特

TxHeader.FDFormat=FDCAN_FD_CAN;//FDcan数据格式,fdcan模式

TxHeader.ErrorStateIndicator=FDCAN_ESI_ACTIVE ;//ESI用于指示发消息时CAN控制器的状

TxHeader.TxEventFifoControl=FDCAN_NO_TX_EVENTS;//发方不霿要接收关于此消息发的任何事件

TxHeader.MessageMarker=0;//消息标记

 if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan3, &TxHeader, DataBuf) != HAL_OK)  

    {  

    printf("add defult!\n");

        return HAL_ERROR;  

    }

    return HAL_OK;

}

6.接收函数

6.1接收函数

接收函数HAL_StatusTypeDef HAL_FDCAN_GetRxMessage()在接收回调函数触发FDCAN_IT_RX_FIFO0_NEW_MESSAGE中断时调用就能接收数据了。在接收回调函数触发中断时,这里置一个中断标志位,主函数判断标志位状态,标志位置1时调用接收函数接收数据,再调用HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0)将中断使能。

void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)//接收回调函数

{

if(hfdcan == &hfdcan1)

{

if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)

{

Notification_flag1=1;

}

}

if(hfdcan == &hfdcan2)

{

if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)

{

Notification_flag2=1;

}

}

if(hfdcan == &hfdcan3)

{

if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)

{

Notification_flag3=1;

}

}

}

主函数判断标志位

While(1)

{

if(Notification_flag1 == 1)

{

Notification_flag3=0;

HAL_FDCAN_GetRxMessage(&hfdcan1,FDCAN_RX_FIFO0,&pRxHeader,FDCAN3_rbuff);

PrintFDCANFrame(FDCAN3_rbuff,64);

//printf("id:%x\n",pRxHeader.Identifier);

HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);

}

}

  1. 代码流程

  1. 选择fdcan时钟频率,初始化fdcan。
  2. 配置txheader,发送函数把txheader和数据段添加到队列。
  3. 过滤器配置,用于接收的时候删选id。
  4. 回调函数,回调函数在中断服务函数中已经弱定义过了,我们实现的callback函数会覆盖它。
  5. 回调函数中触发FDCAN_IT_RX_FIFO0_NEW_MESSAGE中断。
  6. 主函数中,调用发送函数,接收时调用HAL_FDCAN_GetRxMessage()将数据接收到缓冲区。

8.测试

8.1发送测试

1.主函数调用发送函数

2.连接CANFD分析仪,打开CANtoolPro软件设置仲裁波特率和数据段波特率,就能接收到数据

8.2 接收测试

1.canfdtool软件设置,将数据发送到板子

2.主函数调用接收函数,把接收到的数据打印到串口。 

9常见问题

  1. 程序正常运行,canfdtool接收不到数据。检查canfd接线有没有接反。
  2. 注意板子波特率和canfdtool波特率要设置一样的,才能正常通信。
  3. 当数据段和仲裁段波特率设置的不一致时,设置FrameFormat为可变波特率。
  4. 采样点占比一般取80%,seg1和seg2要通过公式计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值