stm32f10x.h文件分析理解

本文详细解析了STM32F10x.h文件的作用与结构,阐述其在STM32开发中的核心地位,包括寄存器映射、中断定义、数据类型、寄存器操作等关键内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  今天再看过半年前自己写的这篇发现自己当时理解有误,stm32f10x.h与库开发并未存在太大关系,只是一个最为重要的寄存器地址寄存器结构体变量的映射。

  stm32f10x.h 这个头文件是STM32开发最为重要的一个头文件相当于51单片机那个 reg52.h 。但对于STM32来说,它的寄存器数量是非常多的,如果按照操作51一样的方法来操作32的话,查数据手册来配置寄存器是非常麻烦的。所以ST开发了这个库,方便大家开发,缩短开发周期。在 stm32f10x.h 中前面一开始就出现了:

#ifndef __STM32F10x_H
#define __STM32F10x_H

#ifdef __cplusplus
 extern "C" {
#endif

  一开始不解   extern "C" {   这个语句的意思,后来了解到原来是用来说明后面的定义都是使用C语言写的。这个 __cplusplus 是指C++,4、5句的意思就是说如果用C++编译器的话,它里面是定义有__cplusplus 的,而通过 extern "C" { 告知编译器,这段代码是用C编写的,要按照C语言编译。这是因为C++里面有函数重载,编译的时候把参数也编译了,而C的话,编译只编译函数名。

  下面这段是用来定义器件容量,可以通过自己取消注释来选择,也可以在KEIL里面设置全局宏定义,2种方式。

#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) 
  /* #define STM32F10X_LD */     /*!< STM32F10X_LD: STM32 Low density devices */
  /* #define STM32F10X_LD_VL */  /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
  /* #define STM32F10X_MD */     /*!< STM32F10X_MD: STM32 Medium density devices */
  /* #define STM32F10X_MD_VL */  /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
  /* #define STM32F10X_HD */     /*!< STM32F10X_HD: STM32 High density devices */
  /* #define STM32F10X_HD_VL */  /*!< STM32F10X_HD_VL: STM32 High density value line devices */  
  /* #define STM32F10X_XL */     /*!< STM32F10X_XL: STM32 XL-density devices */
  /* #define STM32F10X_CL */     /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif


#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
 #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
#endif

  如果没有定义器件的话,编译的时候就会出现以下错误:

"Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"

  用于定义是否使用外设驱动,如果注释掉或者keil中没设全局宏定义的话,则代表不使用ST库提供的外设驱动库,在本文倒数第二段代码中有句

  #ifdef USE_STDPERIPH_DRIVER

   #include "stm32f10x_conf.h"

  #endif

  stm32f10x_conf.h用于外设注释配置。

#if !defined  USE_STDPERIPH_DRIVER
/**
 * @brief Comment the line below if you will not use the peripherals drivers.
   In this case, these drivers will not be included and the application code will 
   be based on direct access to peripherals registers 
   */
  /*#define USE_STDPERIPH_DRIVER*/
#endif

  下面应该是对于器件HSE的设置

/**
 * @brief In the following line adjust the value of External High Speed oscillator (HSE)
   used in your application 
   
   Tip: To avoid modifying this file each time you need to use different HSE, you
        can define the HSE value in your toolchain compiler preprocessor.
  */           
#if !defined  HSE_VALUE
 #ifdef STM32F10X_CL   
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
 #else 
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
 #endif /* STM32F10X_CL */
#endif /* HSE_VALUE */

  设置启动超时值和HSI

/**
 * @brief In the following line adjust the External High Speed oscillator (HSE) Startup 
   Timeout value 
   */
#define HSE_STARTUP_TIMEOUT   ((uint16_t)0x0500) /*!< Time out for HSE start up */

#define HSI_VALUE    ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/

  标准外设库版本号的定义

/**
 * @brief STM32F10x Standard Peripheral Library version number
   */
#define __STM32F10X_STDPERIPH_VERSION_MAIN   (0x03) /*!< [31:24] main version */                                  
#define __STM32F10X_STDPERIPH_VERSION_SUB1   (0x05) /*!< [23:16] sub1 version */
#define __STM32F10X_STDPERIPH_VERSION_SUB2   (0x00) /*!< [15:8]  sub2 version */
#define __STM32F10X_STDPERIPH_VERSION_RC     (0x00) /*!< [7:0]  release candidate */ 
#define __STM32F10X_STDPERIPH_VERSION       ( (__STM32F10X_STDPERIPH_VERSION_MAIN << 24)\
                                             |(__STM32F10X_STDPERIPH_VERSION_SUB1 << 16)\
                                             |(__STM32F10X_STDPERIPH_VERSION_SUB2 << 8)\
                                             |(__STM32F10X_STDPERIPH_VERSION_RC))

  配置Cortex-M3处理器和核内外设

/**
 * @brief Configuration of the Cortex-M3 Processor and Core Peripherals 
 */
#ifdef STM32F10X_XL
 #define __MPU_PRESENT             1 /*!< STM32 XL-density devices provide an MPU */
#else
 #define __MPU_PRESENT             0 /*!< Other STM32 devices does not provide an MPU */
#endif /* STM32F10X_XL */
#define __NVIC_PRIO_BITS          4 /*!< STM32 uses 4 Bits for the Priority Levels    */
#define __Vendor_SysTickConfig    0 /*!< Set to 1 if different SysTick Config is used */

  中断线定义,前部分对于所有STM32F10x都有相同定义,后部分根据不同器件容量采用条件编译定义不同中断线。

/**
 * @brief STM32F10x Interrupt Number Definition, according to the selected device 
 *        in @ref Library_configuration_section 
 */
typedef enum IRQn
{
/******  Cortex-M3 Processor Exceptions Numbers ***************************************************/
  NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */
  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */
  BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */
  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */
  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */
  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */
  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */
  SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */

/******  STM32 specific Interrupt Numbers *********************************************************/
  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */
  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */
  TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */
  RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */
  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */
  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */
  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */
  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */
  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */
  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */
  DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */
  DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */
  DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */
  DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */
  DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */
  DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */
  DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */

  #ifdef STM32F10X_LD
  ...
  #endif /* STM32F10X_LD */  

  #ifdef STM32F10X_LD_VL
  ...
  #endif /* STM32F10X_LD_VL */

  #ifdef STM32F10X_MD
  ...
  #endif /* STM32F10X_MD */  

  #ifdef STM32F10X_MD_VL
  ...
  #endif /* STM32F10X_MD_VL */

  #ifdef STM32F10X_HD
  ...
  #endif /* STM32F10X_HD */  

  ...
  ...
  ...
} IRQn_Type;

  为兼容旧版本。

@addtogroup Exported_types
/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */
typedef int32_t  s32;
typedef int16_t s16;
typedef int8_t  s8;

typedef const int32_t sc32;  /*!< Read Only */
typedef const int16_t sc16;  /*!< Read Only */
typedef const int8_t sc8;   /*!< Read Only */

typedef __IO int32_t  vs32;
typedef __IO int16_t  vs16;
typedef __IO int8_t   vs8;

typedef __I int32_t vsc32;  /*!< Read Only */
typedef __I int16_t vsc16;  /*!< Read Only */
typedef __I int8_t vsc8;   /*!< Read Only */

typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;

typedef const uint32_t uc32;  /*!< Read Only */
typedef const uint16_t uc16;  /*!< Read Only */
typedef const uint8_t uc8;   /*!< Read Only */

typedef __IO uint32_t  vu32;
typedef __IO uint16_t vu16;
typedef __IO uint8_t  vu8;

typedef __I uint32_t vuc32;  /*!< Read Only */
typedef __I uint16_t vuc16;  /*!< Read Only */
typedef __I uint8_t vuc8;   /*!< Read Only */

typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;

typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))

typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
/*!< STM32F10x Standard Peripheral Library old definitions (maintained for legacy purpose) */
#define HSEStartUp_TimeOut   HSE_STARTUP_TIMEOUT
#define HSE_Value            HSE_VALUE
#define HSI_Value            HSI_VALUE

  把全部外设寄存器定义成结构体

/* @addtogroup Peripheral_registers_structures  */  

/** 
  * @brief Analog to Digital Converter  
  */
typedef struct
{
} ADC_TypeDef;

/** 
  * @brief Backup Registers  
  */
typedef struct
{
} BKP_TypeDef;

/** 
  * @brief Controller Area Network TxMailBox 
  */
typedef struct
{
} CAN_TxMailBox_TypeDef;

/** 
  * @brief Controller Area Network FIFOMailBox 
  */
typedef struct
{
} CAN_FIFOMailBox_TypeDef;

/** 
  * @brief Controller Area Network FilterRegister 
  */
typedef struct
{
} CAN_FilterRegister_TypeDef;

/** 
  * @brief Controller Area Network 
  */
typedef struct
{
} CAN_TypeDef;

/** 
  * @brief Consumer Electronics Control (CEC)
  */
typedef struct
{
} CEC_TypeDef;

/** 
  * @brief CRC calculation unit 
  */
typedef struct
{
} CRC_TypeDef;

/** 
  * @brief Digital to Analog Converter
  */
typedef struct
{
} DAC_TypeDef;

/** 
  * @brief Debug MCU
  */
typedef struct
{
}DBGMCU_TypeDef;

/** 
  * @brief DMA Controller
  */
typedef struct
{
} DMA_Channel_TypeDef;
typedef struct
{
} DMA_TypeDef;

/** 
  * @brief Ethernet MAC
  */
typedef struct
{
} ETH_TypeDef;

/** 
  * @brief External Interrupt/Event Controller
  */
typedef struct
{
} EXTI_TypeDef;

/** 
  * @brief FLASH Registers
  */
typedef struct
{
} FLASH_TypeDef;

/** 
  * @brief Option Bytes Registers
  */
typedef struct
{
} OB_TypeDef;

/** 
  * @brief Flexible Static Memory Controller
  */
typedef struct
{
} FSMC_Bank1_TypeDef; 

/** 
  * @brief Flexible Static Memory Controller Bank1E
  */
typedef struct
{
} FSMC_Bank1E_TypeDef;

/** 
  * @brief Flexible Static Memory Controller Bank2
  */
typedef struct
{
} FSMC_Bank2_TypeDef;  

/** 
  * @brief Flexible Static Memory Controller Bank3
  */
typedef struct
{
} FSMC_Bank3_TypeDef; 

/** 
  * @brief General Purpose I/O
  */
typedef struct
{
} GPIO_TypeDef;

/** 
  * @brief Alternate Function I/O
  */
typedef struct
{
} AFIO_TypeDef;

/** 
  * @brief Inter Integrated Circuit Interface
  */
typedef struct
{
} I2C_TypeDef;

/** 
  * @brief Independent WATCHDOG
  */
typedef struct
{
} IWDG_TypeDef;

/** 
  * @brief Power Control
  */
typedef struct
{
} PWR_TypeDef;

/** 
  * @brief Reset and Clock Control
  */
typedef struct
{
} RCC_TypeDef;

/** 
  * @brief Real-Time Clock
  */
typedef struct
{
} RTC_TypeDef;

/** 
  * @brief SD host Interface
  */
typedef struct
{
} SDIO_TypeDef;

/** 
  * @brief Serial Peripheral Interface
  */
typedef struct
{
} SPI_TypeDef;

/** 
  * @brief TIM
  */
typedef struct
{
} TIM_TypeDef;

/** 
  * @brief Universal Synchronous Asynchronous Receiver Transmitter
  */
typedef struct
{
} USART_TypeDef;

/** 
  * @brief Window WATCHDOG
  */
typedef struct
{
} WWDG_TypeDef;

  对上面定义的结构体的成员,即寄存器映射到相应的地址上,以下包括一个是地址映射,一个是寄存器声明。

/** @addtogroup Peripheral_memory_map
  * @{
  */
#define FLASH_BASE            ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
#define SRAM_BASE             ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */
#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */

#define SRAM_BB_BASE          ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */
#define PERIPH_BB_BASE        ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */

#define FSMC_R_BASE           ((uint32_t)0xA0000000) /*!< FSMC registers base address */

/*!< Peripheral memory map */
#define APB1PERIPH_BASE       PERIPH_BASE
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)

#define TIM2_BASE             (APB1PERIPH_BASE + 0x0000)
#define TIM3_BASE             (APB1PERIPH_BASE + 0x0400)

...
...

/** @addtogroup Peripheral_declaration
  * @{
  */  

#define TIM2                ((TIM_TypeDef *) TIM2_BASE)
#define TIM3                ((TIM_TypeDef *) TIM3_BASE)
#define TIM4                ((TIM_TypeDef *) TIM4_BASE)
#define TIM5                ((TIM_TypeDef *) TIM5_BASE)
#define TIM6                ((TIM_TypeDef *) TIM6_BASE)

...
...

  一开头讲过,如果定义使用外设驱动,则包含 stm32f10x_conf.h  用来配置所使用外设的库函数

#ifdef USE_STDPERIPH_DRIVER
  #include "stm32f10x_conf.h"
#endif

  定义一些宏的操作,下面是位操作。

/** @addtogroup Exported_macro
  * @{
  */

#define SET_BIT(REG, BIT)     ((REG) |= (BIT))

#define CLEAR_BIT(REG, BIT)   ((REG) &= ~(BIT))

#define READ_BIT(REG, BIT)    ((REG) & (BIT))

#define CLEAR_REG(REG)        ((REG) = (0x0))

#define WRITE_REG(REG, VAL)   ((REG) = (VAL))

#define READ_REG(REG)         ((REG))

#define MODIFY_REG(REG, CLEARMASK, SETMASK)  WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))
#ifdef __cplusplus
}
#endif

#endif /* __STM32F10x_H */

  上面的代码源自 ST3.5版本库的 stm32f10x.h 文件。综合以上,可以看出 stm32f10x.h 用于定义了器件、中断线、数据类型、结构体封装的寄存器、寄存器地址映射、寄存器位操作以及防C++编译的条件编译。

<think>好的,用户现在的问题是没有stm32f10x.h文件怎么办。之前他问过如何用寄存器方式驱动舵机,我给出了代码示例,里面引用了这个头文件。现在他可能在实际操作中遇到了文件缺失的问题,需要解决。 首先,我需要确认用户的情况。他可能刚开始学习STM32开发,不熟悉开发环境的搭建。stm32f10x.h是标准外设库中的核心头文件,如果缺少这个文件,可能是因为他没有安装相应的库或者工程配置不正确。 接下来,我需要考虑用户可能的开发环境。常见的有Keil MDK、IAR或者基于GCC的IDE如STM32CubeIDE。不同的环境配置方式不同,但缺少头文件通常是因为库未正确安装或路径未包含。 用户的问题可能包括: 1. 未安装标准外设库。 2. 工程中没有正确包含头文件路径。 3. 使用了其他库(如HAL库)但代码是基于标准外设库写的。 4. 项目配置错误,比如选择了错误的芯片型号。 我需要分步骤给出解决方法。首先建议安装标准外设库,提供下载链接。其次,指导如何添加头文件路径到工程中。如果用户不想使用标准库,可以改用HAL库,但需要相应的代码调整。或者直接使用寄存器地址定义,但这样可能代码可读性差。 另外,用户可能不太清楚不同库之间的区别,需要简单解释标准外设库和HAL库的不同,以及为什么会出现头文件缺失的情况。还需要提醒用户根据开发环境进行配置,比如在Keil中如何设置include路径,或者使用CubeMX生成代码。 可能用户遇到的具体问题是编译时报错找不到stm32f10x.h,这时候需要检查安装和路径。或者他可能尝试了示例代码,但不知道如何正确设置工程,所以需要详细步骤。 另外,用户可能没有正确选择芯片型号,导致IDE没有自动包含相关头文件,这也是需要检查的一点。或者他可能使用的是新版本的开发环境,默认不支持旧的标准外设库,这时候需要手动添加。 总结解决方案: 1. 安装标准外设库,并配置工程包含路径。 2. 使用HAL库替代,并修改代码。 3. 直接定义寄存器地址,避免依赖库文件。 需要以用户友好的方式逐步说明,确保即使新手也能理解。同时,提供备选方案,让用户根据实际情况选择。最后提醒注意事项,比如不同库的兼容性,确保代码能正确编译运行。</think>如果在开发STM32F103项目时缺少 `stm32f10x.h` 文件,通常是因为未正确配置标准外设库(Standard Peripheral Library)或工程环境。以下是几种解决方案: --- ### 方法1:安装标准外设库(推荐) `stm32f10x.h` 是STM32标准外设库的核心头文件,需先安装库: 1. **下载标准外设库** - 官方下载地址: [STM32F10x Standard Peripheral Library](https://www.st.com/en/embedded-software/stsw-stm32054.html)(需注册ST账号) 2. **集成到工程** - 将库文件解压后,将以下内容复制到工程目录中: ``` Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ Libraries/STM32F10x_StdPeriph_Driver/ ``` - 在IDE(如Keil、IAR)中添加头文件路径: ```plaintext Project Options → C/C++ → Include Paths → 添加路径: - Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ - Libraries/STM32F10x_StdPeriph_Driver/inc/ ``` --- ### 方法2:使用HAL库替代(适用于STM32CubeIDE) 如果使用STM32CubeMX生成的代码(基于HAL库),需改用HAL库的头文件: 1. **替换头文件** 将代码中的 `#include "stm32f10x.h"` 替换为: ```c #include "stm32f1xx.h" // HAL库通用头文件 ``` 2. **修改代码逻辑** HAL库使用不同的寄存器访问方式,原寄存器操作需改写为HAL函数(需重新生成代码)。 --- ### 方法3:手动定义寄存器(极简方案) 如果不想依赖库文件,可直接定义寄存器地址(需参考《STM32F103参考手册》): ```c // 手动定义关键寄存器(示例) #define RCC_APB2ENR (*(volatile uint32_t*)0x40021018) #define GPIOB_CRL (*(volatile uint32_t*)0x40010C00) #define TIM3_BASE 0x40000400 #define TIM3_CR1 (*(volatile uint32_t*)(TIM3_BASE + 0x00)) #define TIM3_PSC (*(volatile uint32_t*)(TIM3_BASE + 0x28)) #define TIM3_ARR (*(volatile uint32_t*)(TIM3_BASE + 0x2C)) #define TIM3_CCR3 (*(volatile uint32_t*)(TIM3_BASE + 0x3C)) // ... 其他寄存器定义省略(需根据手册补充) ``` --- ### 方法4:使用STM32CubeMX生成代码(自动化配置) 1. 下载并安装 [STM32CubeMX](https://www.st.com/en/development-tools/stm32cubemx.html)。 2. 新建工程,选择芯片型号 `STM32F103RCT6`。 3. 配置引脚和定时器(TIM3通道3 → PB0)。 4. 生成代码(支持HAL库或LL库),直接获得完整工程框架。 --- ### 注意事项 1. **开发环境兼容性**: - Keil MDK需安装 `STM32F1xx_DFP` 设备支持包。 - 如果使用GCC(如STM32CubeIDE),需确保链接脚本包含芯片定义。 2. **代码移植性**: - 寄存器版本代码高度依赖硬件,不同STM32型号需调整寄存器地址。 3. **资源参考**: - [STM32F103参考手册](https://www.st.com/resource/en/reference_manual/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf) - [STM32F10x标准外设库用户手册](https://www.st.com/resource/en/user_manual/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf) 根据实际开发环境选择合适的方案,推荐优先使用 **方法1(标准外设库)** 或 **方法4(STM32CubeMX生成代码)**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值