STM32HAL库USART外设配置流程及库函数讲解

【stm32】hal库学习笔记-UART/USART串口通信(超详细!) (图片来自网络) 阅读详情

HAL库中USART外设配置流程及库函数讲解

一说到串口通信,及必须说一下aRS-232/485协议。232协议标准物理接口就是我们常用的DB9串口线
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

RS-232电平:
逻辑1:-15~-3
逻辑0: +3~+15
COMS电平:
逻辑1:3.3
逻辑0: 0v
TTL电平
逻辑1:5v
逻辑0:0v

电平转换问题:

TTL和COMS电平不能和232电平直接通信,会烧坏单片机。
经过电平转换芯片

常见转换芯片

MAX232
串口通信一般三根线:两个设备之间TX,RX必须交叉连接,。
现在电脑一般都没有DB9接口了,STM32一般都用USB口与电脑通信,开发板连接串口模块,USB插入电脑。
若开发板中没有板载电平转换芯片,要借助串口转换模块。

注意

现在电脑中一般已经没有了串口外设,现在要使用串口,要安装驱动用USB来模拟串口,所以电脑中需要安装对应芯片驱动CH340

USART/UART异步通信配置步骤:

HAL库初始化USART:
bsp_usart.c


  
#include "./usart/bsp_debug_usart.h"

UART_HandleTypeDef UartHandle;
//extern uint8_t ucTemp;  

 /**
  * @brief  DEBUG_USART GPIO 配置,工作模式配置。115200 8-N-1
  * @param  无
  * @retval 无
  */  
void DEBUG_USART_Config(void)
{ 
  
  UartHandle.Instance          = DEBUG_USART;
  
  UartHandle.Init.BaudRate     = DEBUG_USART_BAUDRATE;
  UartHandle.Init.WordLength   = UART_WORDLENGTH_8B;
  UartHandle.Init.StopBits     = UART_STOPBITS_1;
  UartHandle.Init.Parity       = UART_PARITY_NONE;
  UartHandle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;
  UartHandle.Init.Mode         = UART_MODE_TX_RX;
	
  
  HAL_UART_Init(&UartHandle);
   
 /*使能串口接收断 */
  __HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);  
}


/**
  * @brief UART MSP 初始化 
  * @param huart: UART handle
  * @retval 无
  */
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{  
  GPIO_InitTypeDef  GPIO_InitStruct;
  
  DEBUG_USART_CLK_ENABLE();
	
	DEBUG_USART_RX_GPIO_CLK_ENABLE();
  DEBUG_USART_TX_GPIO_CLK_ENABLE();
  
/**USART1 GPIO Configuration    
  PA9     ------> USART1_TX
  PA10    ------> USART1_RX 
  */
  /* 配置Tx引脚为复用功能  */
  GPIO_InitStruct.Pin = DEBUG_USART_TX_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed =  GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStruct);
  
  /* 配置Rx引脚为复用功能 */
  GPIO_InitStruct.Pin = DEBUG_USART_RX_PIN;
  GPIO_InitStruct.Mode=GPIO_MODE_AF_INPUT;	//模式要设置为复用输入模式!	
  HAL_GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStruct); 
 
  HAL_NVIC_SetPriority(DEBUG_USART_IRQ ,0,1);	//抢占优先级0,子优先级1
  HAL_NVIC_EnableIRQ(DEBUG_USART_IRQ );		    //使能USART1中断通道  
}


/*****************  发送字符串 **********************/
void Usart_SendString(uint8_t *str)
{
	unsigned int k=0;
  do 
  {
      HAL_UART_Transmit(&UartHandle,(uint8_t *)(str + k) ,1,1000);
      k++;
  } while(*(str + k)!='\0');
  
}
//重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
	/* 发送一个字节数据到串口DEBUG_USART */
	HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 1000);	
	
	return (ch);
}

//重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{		
	int ch;
	HAL_UART_Receive(&UartHandle, (uint8_t *)&ch, 1, 1000);	
	return (ch);
}

/*********************************************END OF FILE**********************/

bsp_usart.h

#ifndef __DEBUG_USART_H
#define	__DEBUG_USART_H

#include "stm32f1xx.h"
#include <stdio.h>

//串口波特率
#define DEBUG_USART_BAUDRATE                    115200

//引脚定义
/*******************************************************/
#define DEBUG_USART                             USART1
#define DEBUG_USART_CLK_ENABLE()                __HAL_RCC_USART1_CLK_ENABLE();

#define DEBUG_USART_RX_GPIO_PORT                GPIOA
#define DEBUG_USART_RX_GPIO_CLK_ENABLE()        __HAL_RCC_GPIOA_CLK_ENABLE()
#define DEBUG_USART_RX_PIN                      GPIO_PIN_10

#define DEBUG_USART_TX_GPIO_PORT                GPIOA
#define DEBUG_USART_TX_GPIO_CLK_ENABLE()       __HAL_RCC_GPIOA_CLK_ENABLE()
#define DEBUG_USART_TX_PIN                      GPIO_PIN_9

#define DEBUG_USART_IRQHandler                  USART1_IRQHandler
#define DEBUG_USART_IRQ                 		    USART1_IRQn
/************************************************************/

void Usart_SendString(uint8_t *str);
void DEBUG_USART_Config(void);
int fputc(int ch, FILE *f);
int fgetc(FILE *f);
extern UART_HandleTypeDef UartHandle;
#endif /* __USART1_H */

mian.c

int main(void)
{
  HAL_Init();        
  /* 配置系统时钟为72 MHz */ 
  SystemClock_Config();
	   
  /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  DEBUG_USART_Config();
  
	/*调用printf函数,因为重定向了fputc,printf的内容会输出到串口*/
	printf("欢迎使用野火开发板\n");	

	/*自定义函数方式*/
	Usart_SendString( (uint8_t *)"自定义函数输出:这是一个串口中断接收回显实验\n" );
	
  while(1)
	{		
	}
}

HAL库USART外设驱动函数:

/** @addtogroup UART_Exported_Functions_Group2
  * @{
  */
/* IO operation functions *******************************************************/
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart);
/* Transfer Abort functions */
HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart);

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);
void HAL_UART_AbortCpltCallback (UART_HandleTypeDef *huart);
void HAL_UART_AbortTransmitCpltCallback (UART_HandleTypeDef *huart);
void HAL_UART_AbortReceiveCpltCallback (UART_HandleTypeDef *huart);
/**
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
作用:以中断的方式接收指定字节的数据
形参1是UART_ HandleTypeDef结构体类型指针变量
形参2是指向接收数据缓冲区
形参3是要接收的数据大小,以字节为单位
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
作用:以阻塞的方式发送指定字节的数据
形参1 : UART_ HandleTypeDef 结构体类型指针变量
形参2:指向要发送的数据地址
形参3:要发送的数据大小,以字节为单位
形参4:设置的超时时间,以ms单位
STM32F407 USART配置 STM32F4系列USART串口配置详解 阅读详情

相关推荐

STM32F103HAL库学习7——串口通信学习及USART使用

本章开始学习STM32hal库的USART串口使用,了解是串行和并行通信,了解单工/半双工/全双工通信,了解同步/异步通信,以及一些常见的串行通信接口,掌握usart的配置使用,能够借助电脑串口调试助手与电脑进行收发通信。末尾附带源代码供参考学习。

weixin_44457715的博客 1807

【STM32】HAL库-串口USART

USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 一个波特率寄存器(USART_BRR),12位的整数和4位小数 任何USART双向通信至少需要两个脚: 接收数据输入(RX)和发送数据输出(TX) 当发送器被激活并且不发送数据时,TX引脚处于高电平 在起始位期间,TX脚处于低电平,在停止位期间处于高电平。 发送和接收由一共用的波特率发生器驱动,当发送器和接收器的使

熠熠L的博客 1万+

HAL库(STM32CubeMX)——USART串口配置学习(中断接收/STM32G431RBT6)

UART与USART介绍: USART(universal synchronous asynchronous receiver and transmitte): 通用同步异步收发器 USART是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。 UART(universal asynchronous receiver and transmitter): 通用异步收发器 异步串行通信口(UART)就是我们在嵌入式中常说的串口,它还是一种通用的数据通信议。 区别: USART是指单片机

贾saisai的博客 1万+

STM32HAL库 串口USART的使用

本文为串口输出打印的hal库,参考洋桃电子的入门30步总结而来。例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

weixin_43002939的博客 6852

【RTOS】 Vxworks 653 第一章 —— 初识 vx653 3.x

。。不是很重要,自己搜吧鲁棒分区是一种确保共享计算资源中独立运行功能实现​​时空隔离​​的机制,其目标是为集成模块中的混合临界性应用提供与联邦式部署(federated implementation)同等级别的功能隔离保障。具体表现为:​​多关键性共存​​:支持不同安全等级应用(如飞控系统A级与娱乐系统D级)在同一模块中协同运行。​​抗干扰能力​​:防止未授权或意外的时空干扰(如内存越界、时间窗口冲突),确保应用间互不影响。​​。

qq_38183694的博客 1279

PyTorch 深度学习实战(28):对比学习(Contrastive Learning)与自监督表示学习

本文实现了基于对比学习的自监督表征学习框架,通过 InfoNCE 损失在 CIFAR-10 数据集上学习到具有判别性的特征表示。实验表明,仅使用线性分类器即可达到 82% 以上的验证准确率,证明了对比学习的有效性。在下一篇文章中,我们将深入计算机视觉的核心任务之一——《目标检测与 YOLO 实战》,探讨如何利用深度学习实现高效的目标检测系统。

m0_60414444的博客 2383

【STM32】HAL库——串口中断通信(二)

摘要: 本文介绍了基于STM32F103RCT6开发板的串口中断配置与实现方法。首先通过STM32CubeMX配置时钟(72MHz)、USART1串口(115200波特率)及GPIO引脚,并生成工程代码。随后在Keil MDK中重定义Printf函数实现串口打印,并详细讲解串口中断接收函数HAL_UART_Receive_IT和回调函数HAL_UART_RxCpltCallback的使用。通过中断接收数据控制GPIO电平翻转,最终结合串口助手验证功能。文章涵盖硬件配置、代码重定向及中断处理流程,为STM32

Q大帅 3万+

LS-DYNA中的流固耦合

在LS-DYNA中对流固耦合问题的求解提供了两种方法,ALE流固耦合和基于ICFD的流固耦合。本文将对两种方法的各自特点进行分析。 ALE方法的流固耦合 适用范围 ALE求解器主要用于层流。ALE求解器也不是完全的NS求解器,因此不考虑边界层的影响,比如阻力。流体粘性效应仅通过材料模型获得,也就是*mat_null的MU。ale求解器是为了求解高压高速度梯度的短时问题而开发的。该求解器并不适用于求解低压力梯度问题比如声学,也不适用于长时间问题(秒的尺度甚至更长)。时间的限制是显式时...

m0_69812055的博客 8554

STM32CubeMx+HAL库:USART串口收发数据的三种方式

手把手教你STM32CubeMx+HAL库实现USART串口收发数据,带有练习!!

枫-琳的博客 1万+

S32K144 ADC硬件触发实战:PDB模块配置与DMA传输全流程解析

本文详细解析了S32K144微控制器中ADC硬件触发的全流程实现。通过配置PDB模块产生精确的定时触发信号,并联动DMA实现转换数据的自动搬运,构建了一个无需CPU干预的高效、低抖动数据采集系统。文章深入讲解了时钟配置、模块初始化、DMA引擎搭建及实战调试技巧,为汽车电子和工业控制应用提供了可靠的解决方案。

weixin_29174141的博客 225

OpenEuler内核编译及替换

一、内核源码下载 在gitee上下载OpenEuler内核源码 下载地址 选择需要的内核版本源码压缩包进行下载 二、内核编译 1.解压缩 将下载好的源码进行解压 tar xvf openeuler-kernel-4.19.90-2107.1.0.tar.gz 2.清理源代码树 解压后得到一个名为kernel的内核源码文件夹,进入后执行命令 make mrproper 清理过去内核编译产生的config,第一次编译时可不执行此命令 3.生成内核配置文件.config 先将将系统原配置文件拷贝过来,原

m0_56602092的博客 2万+

【HAL库】HAL库STM32cubemx快速使用

stm32cubemx快速使用,各类模块汇众。OLED、BH1750、MQ2、MQ4、DHT11、SGM SIM900A、BMP180、ESP8266 Onenet MQTT、HTTP

xifan的博客 5651

大语言模型在金融风险预警中的推理应用探索

金融行业一直面临着各种风险,如信用风险、市场风险、操作风险等。准确及时的风险预警对于金融机构的稳定运营和投资者的利益保护至关重要。传统的金融风险预警方法主要基于结构化数据和统计模型,虽然在一定程度上能够识别风险,但对于非结构化数据的处理能力有限,难以捕捉到复杂的风险因素和潜在的风险趋势。大语言模型作为自然语言处理领域的重要突破,具有强大的语言理解和生成能力,能够处理各种形式的文本数据。

AI天才研究院 1167

【STM32】HAL库——串口DMA通信(三)

摘要: 本文详细介绍了STM32中DMA(直接存储器访问)的原理与应用。首先阐述了DMA的基本概念、工作模式(正常/循环传输)及优先级管理机制,分析了其在高速数据传输中的优势。接着通过STM32CubeMX配置流程,展示了如何为USART1设置DMA传输通道,包括时钟配置、DMA参数设定等关键步骤。最后提供了基于Keil MDK的DMA串口发送实现代码,并介绍了利用串口空闲中断实现接收数据长度判断的方法。文章完整呈现了从理论到实践的DMA应用过程,为STM32开发中的高效数据传输提供了实用参考。

Q大帅 2万+

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略 目录 Knowledge Engineering知识工程的简介 0.1、What 0.2、How 0.3、Why 1、知识工程过程的5个活动 2、知识图谱的应用 Knowledge Engineering知识工程的发展 1、前知识工程时期——1950-1970时期:图...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 5335

【Halcon-2D测量】add_metrology_object_rectangle2_measure 函数功能(用于向2D计量模型中添加旋转矩形(rectangle2类型)计量对象)

HALCON算子add_metrology_object_rectangle2_measure解析摘要 该算子是HALCON 2D计量模块的核心算子,用于添加旋转矩形计量对象并配置测量参数。主要功能包括:定义旋转矩形几何轮廓(中心坐标、主轴角度、长短半长);生成垂直于矩形边界的测量区域;设置边缘提取预处理参数(高斯平滑、振幅阈值)。关键注意事项:MeasureLength1必须小于矩形长短半长;角度参数Phi需使用弧度单位;多线程需同步模型句柄。该算子适用于方形螺母、PCB板边框等矩形零件的精密测量,需与a

weixin_45590420的博客 1223

STM32 HAL库函数入门指南:从原理到实践

本文详细的阐述了STM32的HAL库函数相关内容,并且以及各个常见外设的HAL库函数的配置过程以及注意事项,深入浅出的加以代码理解

可喜~可乐的博客 7140

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STM32Cube HAL库中断处理机制,以及回调函数实现原理

置顶/星标公众号,不错过每一条消息! 最近有较多关于STM32Cube HAL的问题,侧面反应了使用STM32CubeMX的人不少。所以,最近可能会重点写这方面内容...

strongerHuang 2万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

基于STM32的串口收发讲解(HAL库)

本文详细的介绍如何来编写一个串口收发程序,我们采用常用的收发逻辑,发送直接编写函数进行实现,而接收使用中断进行完成。接收中断使用接收到一个字节和一帧数据两种中断触发方式。

1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

基于STM32CubeMX和HAL库的USART串口收发数据

r\n";//输出信息char c;//指令 0:停止 1:开始//输出信息//出错char tips1[]="开始.....\r\n";//开始发送char tips2[]="停止......\r\n";//停止发送int flag=0;//标志 0:停止发送 1.开始发送DMA(Direct Memory Access,直接内存访问)是一种计算机系统中用于数据传输的机制。它允许数据在外设和内存之间直接传输,而不需要CPU的介入,从而减轻了CPU的负担,提高了数据传输的效率。

2201_75737320的博客 3753

【STM32H7教程】第29章 STM32H7的USART串口基础知识和HAL库API

完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第29章 STM32H7的USART串口基础知识和HAL库API 本章节为大家讲解USART(Universal synchronous asynchronous receiver transmitter,通用同步异步收发器)的基础知识和对...

Simon223的博客 8628

STM32CubeIDE开发笔记4:USART异步通信+DMA

使用HAL库的UART函数实现串口通信,以及带DMA的串口通信 stm32CubeIDE所用版本:1.1.0 固件库包:f1 1.8.0 测试平台stm32f103c8t6

遥望的博客 6937

【6】STM32·HAL库·串口

串行通信接口:指按位发送和接收的接口。如:RS-232/422/485等RS-232接口(DB9)数据:TXD(pin 3):串口数据输出RXD(pin 2):串口数据输入握手:RTS(pin 7):请求发送CTS(pin 8):清除发送DSR(pin 6):数据发送就绪DCD(pin 1):数据载波检测DTR(pin 4):数据终端就绪地线:GND(pin 5):信号地其他:RI(pin 9):振铃指示。

Cute758的博客 2785

STM32——驱动外设的原理

也许你可能知道,STM32的外设功能是由STM32的内核(CPU)通过配置各种外设的寄存器来实现的。那么,这篇文章就来揭秘这个神秘的过程,到底是怎样配置寄存器才能达到控制外设的目的,进而实现各种复杂的功能的。

脑壳有点痒,好像要长脑子了! 2972

STM32HAL库开发-串口篇

串口 是 串行通信接口的简称,指的是按位发送和接收数据的接口。如RS-232/422/485等RS-232被称为标准串口。

荒野 3670

stm32常用hal库函数

STM32 HAL库(Hardware Abstraction Layer)是STMicroelectronics推出的硬件抽象层库,它通过提供统一的接口实现了跨STM32系列芯片的代码兼容性。与传统标准库相比,HAL库采用更高级的封装设计理念,将复杂的外设初始化和控制逻辑抽象为简洁的API函数。这种设计使开发者无需深入研究每个芯片的寄存器配置细节,就能快速构建稳定可靠的嵌入式应用。跨系列兼容性:基于HAL库编写的代码可在F0/F1/F4/F7等不同系列STM32芯片间无缝移植(需外设功能相同)

杰杰桀桀桀的博客 2154
上一篇: STM32HAL库中外设初始化MSP回调机制及中断回调机制详解
下一篇: 单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)
Execution_
博客等级 码龄5年 1605粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值