GPIOx->IDR & GPIO_Pin 解释说明

本文详细解析了STM32开发中常见的GPIO宏定义及其使用方法,包括如何通过宏定义检查GPIO引脚状态和控制GPIO输出。同时,文章还讨论了指针与结构体成员访问的相关知识点。

一 .

#define KEY0 (GPIOD->IDR&GPIO_Pin_0)

就是一个宏定义,即后面的 KEY0 将全部用后面的这一串代替:“(GPIOD->IDR&GPIO_Pin_0)”
所以使用宏定义后如果编译出错,你又看不出来的话,需要你仔细你的宏定义是否正确定义且被正确地使用。

其中的"->“是表示访问结构指针对应对象下的IDR成员,可以改写为“(*GPIOC).IDR”。
也就是说,如果GPIOD不是一个指针变量,或者不是指向拥有IDR成员的结构对象则编译就会出错;而如果对某个指针进行强制转换后编译成功了并不一定保证执行不会出错。如:

void *ptr=.../*某个结构对象的地址,但该结构没有IDR成员*/;
(struct stru_name_with_IDR*)ptr->IDR=...../*对ptr强制转换以便对其中的IDR成员进行操作*/;

上述两句编译时不会报错,因为使用强制转换,编译器认为你是了解你的目的的,但运行中可能出错,比如ptr指向的对象尺寸不够就会越界,其他的错误取决于IDR的类型等。

二 .

#define WARM_KEY_PIN     (GPIOC->IDR&(1<<5))
#define Speak(tmp)       GPIOA->ODR=tmp?(GPIOA->ODR|1<<12):(GPIOA->ODR&(~(1<<12)))

(1)IDR是查看引脚电平状态用的寄存器(只读),ODR是引脚电平输出的寄存器。

(2)1<<5表示:1左移5位(0000 0001---->0010 0000)

  1. ->在C语言中称为间接引用运算符,是二目运算符,优先级同成员运算符“.”。
  2. 用法:
    p->a,其中p是指向一个结构体的指针,a是这个结构体类型的一个成员。表达式p->a引用了指针p指向的结构体的成员a。
  3. 例如:
struct T
{
 int a;
 char b;
}s;
struct T* p=&s;
那么,p->a相当于s.a。显然,有个等价写法:(*p).a,和p->a完全等效。
/** * 文件名: main.c * 功能: STM32F103 波形发生器 * 输出: PA6(TIM3_CH1) PWM &rarr; RC滤波 &rarr; 模拟信号 * 按键: PA15(切换波形), PB4/PB5(&plusmn;100Hz), PB6/PB7(&plusmn;256幅度) */ #include &quot;stm32f10x.h&quot; #include &lt;math.h&gt; // ⚠️ 必须包含!用于 sinf() // ------------------------------- // 自定义 GPIO_PIN_x 宏(兼容命名) // ------------------------------- #ifndef GPIO_PIN_0 #define GPIO_PIN_0 ((uint16_t)0x0001) #define GPIO_PIN_1 ((uint16_t)0x0002) #define GPIO_PIN_2 ((uint16_t)0x0004) #define GPIO_PIN_3 ((uint16_t)0x0008) #define GPIO_PIN_4 ((uint16_t)0x0010) #define GPIO_PIN_5 ((uint16_t)0x0020) #define GPIO_PIN_6 ((uint16_t)0x0040) #define GPIO_PIN_7 ((uint16_t)0x0080) #define GPIO_PIN_8 ((uint16_t)0x0100) #define GPIO_PIN_9 ((uint16_t)0x0200) #define GPIO_PIN_10 ((uint16_t)0x0400) #define GPIO_PIN_11 ((uint16_t)0x0800) #define GPIO_PIN_12 ((uint16_t)0x1000) #define GPIO_PIN_13 ((uint16_t)0x2000) #define GPIO_PIN_14 ((uint16_t)0x4000) #define GPIO_PIN_15 ((uint16_t)0x8000) #endif // ------------------------------- // AFIO MAPR 掩码宏(标准库可能未定义) // ------------------------------- #ifndef AFIO_MAPR_SWJ_CFG_MASK #define AFIO_MAPR_SWJ_CFG_MASK ((uint32_t)0x07 &lt;&lt; 24) #endif #ifndef AFIO_MAPR_TIM3_REMAP_MASK #define AFIO_MAPR_TIM3_REMAP_MASK ((uint32_t)0x03 &lt;&lt; 28) #endif // ------------------------------- // 波形类型定义 // ------------------------------- #define WAVE_SINE 0 #define WAVE_SQUARE 1 #define WAVE_TRIANGLE 2 // ------------------------------- // 全局变量 // ------------------------------- __IO uint8_t current_wave = WAVE_SINE; __IO uint16_t current_frequency = 1000; // 初始频率: 1000Hz __IO uint16_t current_amplitude = 2048; // 幅度: 0~4095 (12-bit) __IO float phase_accumulator = 0.0f; // 相位累加器 __IO float phase_step = 360.0f; // 每毫秒相位增量 uint16_t sine_table[360]; // 正弦查找表 // ------------------------------- // 延时函数:基于 72MHz 的粗略 ms 延时 // ------------------------------- void Delay_ms(uint32_t ms) { for (; ms &gt; 0; ms--) { for (uint32_t i = 0; i &lt; 7200; i++) { __NOP(); } } } // ------------------------------- // 按键扫描函数(带消抖) // ------------------------------- uint8_t Key_Scan(GPIO_TypeDef* GPIOx, uint16_t pin) { if (!(GPIOx-&gt;IDR &amp; pin)) { // 检测低电平 Delay_ms(5); // 消抖 if (!(GPIOx-&gt;IDR &amp; pin)) { while (!(GPIOx-&gt;IDR &amp; pin)); // 等待释放 return 1; } } return 0; } // ------------------------------- // GPIO 初始化:按键输入 + TIM3_CH1 输出 // ------------------------------- void GPIO_Init(void) { RCC-&gt;APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN; // 合并设置:禁用 JTAG-SWD 冲突,并启用 TIM3 部分重映射 (TIM3_CH1 -&gt; PA6) AFIO-&gt;MAPR = (AFIO-&gt;MAPR &amp; ~(AFIO_MAPR_SWJ_CFG_MASK | AFIO_MAPR_TIM3_REMAP_MASK)) | (0x02 &lt;&lt; 24) // SWJ_CFG = 2&#39;b010 &rarr; JTAG-DP 禁用,SW-DP 使能 | AFIO_MAPR_TIM3_REMAP_PARTIALREMAP; // TIM3_REMAP = 01 &rarr; PA6/7 // PA15: 浮空输入,内部上拉(波形切换) GPIOA-&gt;CRH &amp;= ~(GPIO_CRH_CNF15 | GPIO_CRH_MODE15); GPIOA-&gt;CRH |= GPIO_CRH_CNF15_0; // 浮空输入模式 GPIOA-&gt;ODR |= GPIO_ODR_ODR15; // 上拉 // PB4~PB7: 按键输入(频率/幅度控制) GPIOB-&gt;CRL &amp;= ~(GPIO_CRL_CNF4 | GPIO_CRL_MODE4 | GPIO_CRL_CNF5 | GPIO_CRL_MODE5 | GPIO_CRL_CNF6 | GPIO_CRL_MODE6 | GPIO_CRL_CNF7 | GPIO_CRL_MODE7); GPIOB-&gt;CRL |= GPIO_CRL_CNF4_0 | // 浮空输入 GPIO_CRL_CNF5_0 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0; GPIOB-&gt;ODR |= GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; // 上拉 // PA6: 复用推挽输出 (TIM3_CH1) GPIOA-&gt;CRL &amp;= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); GPIOA-&gt;CRL |= GPIO_CRL_CNF6_1 | GPIO_CRL_MODE6_1; // AF PP, 50MHz } // ------------------------------- // TIM3 PWM 初始化 (PA6 输出) // ------------------------------- void TIM3_Init(void) { RCC-&gt;APB1ENR |= RCC_APB1ENR_TIM3EN; TIM3-&gt;PSC = 71; // 72MHz / 72 = 1MHz 计数频率 TIM3-&gt;ARR = 3999; // PWM 频率 = 1MHz / 4000 = 250kHz TIM3-&gt;CCR1 = 2000; // 初始占空比 50% // CH1: PWM Mode 1, Enable Output TIM3-&gt;CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE; TIM3-&gt;CCER |= TIM_CCER_CC1E; // 使能通道1输出 TIM3-&gt;CR1 |= TIM_CR1_CEN; // 启动定时器 } // ------------------------------- // 构建正弦查找表(0~359&deg;) // ------------------------------- void BuildSineTable(void) { for (int i = 0; i &lt; 360; i++) { float angle_rad = i * 3.14159265f / 180.0f; // 将正弦值映射到 [0, current_amplitude] sine_table[i] = (uint16_t)(current_amplitude * (1.0f + sinf(angle_rad)) / 2.0f); } } // ------------------------------- // 更新 PWM 输出值(根据当前波形) // ------------------------------- void UpdateWaveform(void) { uint16_t compare_val = 0; uint16_t phase_deg = (uint16_t)phase_accumulator % 360; switch (current_wave) { case WAVE_SINE: compare_val = sine_table[phase_deg]; break; case WAVE_SQUARE: compare_val = (phase_deg &lt; 180) ? current_amplitude : 0; break; case WAVE_TRIANGLE: if (phase_deg &lt; 180) compare_val = (current_amplitude * phase_deg) / 180; else compare_val = (current_amplitude * (360 - phase_deg)) / 180; break; } // 限幅 if (compare_val &gt; 4095) compare_val = 4095; TIM3-&gt;CCR1 = compare_val; } // ------------------------------- // TIM2 初始化:每 1ms 中断一次,更新相位 // ------------------------------- void TIM2_Init(void) { RCC-&gt;APB1ENR |= RCC_APB1ENR_TIM2EN; TIM2-&gt;PSC = 71; // 1MHz 计数频率 TIM2-&gt;ARR = 999; // 1ms 定时中断 TIM2-&gt;DIER |= TIM_DIER_UIE; // 使能更新中断 TIM2-&gt;CR1 |= TIM_CR1_CEN; // 启动定时器 NVIC_EnableIRQ(TIM2_IRQn); // 使能中断 } // ------------------------------- // TIM2 中断服务程序 // ------------------------------- void TIM2_IRQHandler(void) { if (TIM2-&gt;SR &amp; TIM_SR_UIF) { TIM2-&gt;SR &amp;= ~TIM_SR_UIF; // 清除中断标志 // 更新相位 phase_accumulator += phase_step; while (phase_accumulator &gt;= 360.0f) { phase_accumulator -= 360.0f; } UpdateWaveform(); // 更新 PWM 输出 } } // ------------------------------- // 检查所有按键状态 // ------------------------------- void CheckButtons(void) { uint8_t updated = 0; if (Key_Scan(GPIOA, GPIO_PIN_15)) { current_wave = (current_wave + 1) % 3; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_4)) { current_frequency += 100; if (current_frequency &gt; 10000) current_frequency = 10000; phase_step = 360.0f * current_frequency / 1000.0f; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_5)) { current_frequency -= 100; if (current_frequency &lt; 100) current_frequency = 100; phase_step = 360.0f * current_frequency / 1000.0f; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_6)) { current_amplitude += 256; if (current_amplitude &gt; 4095) current_amplitude = 4095; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_7)) { current_amplitude -= 256; if (current_amplitude &lt; 100) current_amplitude = 100; updated = 1; } if (updated) { BuildSineTable(); // 重建正弦表 } } // ------------------------------- // 系统时钟设置为 72MHz(外部晶振+PLL) // ------------------------------- void SystemClock_Init(void) { RCC-&gt;CR |= RCC_CR_HSEON; // 开启 HSE while (!(RCC-&gt;CR &amp; RCC_CR_HSERDY)); // 等待就绪 RCC-&gt;CFGR &amp;= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL); RCC-&gt;CFGR |= RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR_PLLMULL9; // HSE&times;9=72MHz RCC-&gt;CFGR |= RCC_CFGR_PPRE1_DIV2; // APB1 = 36MHz RCC-&gt;CR |= RCC_CR_PLLON; // 开启 PLL while (!(RCC-&gt;CR &amp; RCC_CR_PLLRDY)); // 等待锁定 RCC-&gt;CFGR &amp;= ~RCC_CFGR_SW; RCC-&gt;CFGR |= RCC_CFGR_SW_PLL; while ((RCC-&gt;CFGR &amp; RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); // 切换完成 } // ------------------------------- // 主函数 // ------------------------------- int main(void) { SystemClock_Init(); // 设置系统时钟为 72MHz GPIO_Init(); // 初始化 IO 口 TIM3_Init(); // 启动 PWM 输出 TIM2_Init(); // 启动 1ms 定时中断 // 初始化相位步长和正弦表 phase_step = 360.0f * current_frequency / 1000.0f; BuildSineTable(); while (1) { CheckButtons(); // 扫描按键事件 Delay_ms(10); // 每 10ms 检查一次,响应灵敏 } } 完善并删改注释
12-19
/** * main.c * STM32F103 波形发生器 * 输出: PA6 (TIM3_CH1) &rarr; PWM &rarr; RC滤波 &rarr; 模拟信号 * 按键: PA15(切换), PB4/PB5(&plusmn;100Hz), PB6/PB7(&plusmn;256) */ #include &quot;stm32f10x.h&quot; #include &lt;math.h&gt; // ------------------------------- // GPIO 引脚宏定义(若未定义) // ------------------------------- #ifndef GPIO_PIN_0 #define GPIO_PIN_0 ((uint16_t)0x0001) #define GPIO_PIN_1 ((uint16_t)0x0002) #define GPIO_PIN_2 ((uint16_t)0x0004) #define GPIO_PIN_3 ((uint16_t)0x0008) #define GPIO_PIN_4 ((uint16_t)0x0010) #define GPIO_PIN_5 ((uint16_t)0x0020) #define GPIO_PIN_6 ((uint16_t)0x0040) #define GPIO_PIN_7 ((uint16_t)0x0080) #define GPIO_PIN_8 ((uint16_t)0x0100) #define GPIO_PIN_9 ((uint16_t)0x0200) #define GPIO_PIN_10 ((uint16_t)0x0400) #define GPIO_PIN_11 ((uint16_t)0x0800) #define GPIO_PIN_12 ((uint16_t)0x1000) #define GPIO_PIN_13 ((uint16_t)0x2000) #define GPIO_PIN_14 ((uint16_t)0x4000) #define GPIO_PIN_15 ((uint16_t)0x8000) #endif // ------------------------------- // AFIO MAPR 掩码(标准库可能缺失) // ------------------------------- #ifndef AFIO_MAPR_SWJ_CFG_MASK #define AFIO_MAPR_SWJ_CFG_MASK ((uint32_t)0x07 &lt;&lt; 24) #endif #ifndef AFIO_MAPR_TIM3_REMAP_MASK #define AFIO_MAPR_TIM3_REMAP_MASK ((uint32_t)0x03 &lt;&lt; 28) #endif // ------------------------------- // 波形类型 // ------------------------------- #define WAVE_SINE 0 #define WAVE_SQUARE 1 #define WAVE_TRIANGLE 2 // ------------------------------- // 全局变量 // ------------------------------- __IO uint8_t current_wave = WAVE_SINE; __IO uint16_t current_frequency = 1000; // Hz __IO uint16_t current_amplitude = 2048; // 0~4095 __IO float phase_accumulator = 0.0f; // 相位 [0, 360) __IO float phase_step = 360.0f; // 每毫秒增量 uint16_t sine_table[360]; // 正弦查找表 // ------------------------------- // 延时函数(基于 72MHz CPU) // ------------------------------- void Delay_ms(uint32_t ms) { while (ms--) { for (uint32_t i = 0; i &lt; 7200; i++) { __NOP(); } } } // ------------------------------- // 按键扫描(带消抖和释放检测,含超时保护) // ------------------------------- uint8_t Key_Scan(GPIO_TypeDef* GPIOx, uint16_t pin) { if (!(GPIOx-&gt;IDR &amp; pin)) { Delay_ms(5); if (!(GPIOx-&gt;IDR &amp; pin)) { // 等待释放,最多等待 500ms uint32_t timeout = 0; while (!(GPIOx-&gt;IDR &amp; pin) &amp;&amp; ++timeout &lt; 500) { Delay_ms(1); } return 1; } } return 0; } // ------------------------------- // GPIO 初始化 // ------------------------------- void GPIO_Init(void) { RCC-&gt;APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN; // 配置 AFIO: 禁用 JTAG-DP,启用 TIM3 部分重映射 (PA6/PA7) AFIO-&gt;MAPR = (AFIO-&gt;MAPR &amp; ~(AFIO_MAPR_SWJ_CFG_MASK | AFIO_MAPR_TIM3_REMAP_MASK)) | (0x02 &lt;&lt; 24) // SW-DP only | AFIO_MAPR_TIM3_REMAP_PARTIALREMAP; // PA15: 浮空输入 + 上拉(波形切换) GPIOA-&gt;CRH &amp;= ~(GPIO_CRH_CNF15 | GPIO_CRH_MODE15); GPIOA-&gt;CRH |= GPIO_CRH_CNF15_0; GPIOA-&gt;ODR |= GPIO_PIN_15; // PB4~PB7: 浮空输入 + 上拉(控制键) GPIOB-&gt;CRL &amp;= ~((GPIO_CRL_CNF4 | GPIO_CRL_MODE4) | (GPIO_CRL_CNF5 | GPIO_CRL_MODE5) | (GPIO_CRL_CNF6 | GPIO_CRL_MODE6) | (GPIO_CRL_CNF7 | GPIO_CRL_MODE7)); GPIOB-&gt;CRL |= GPIO_CRL_CNF4_0 | GPIO_CRL_CNF5_0 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0; GPIOB-&gt;ODR |= GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; // PA6: 复用推挽输出 (TIM3_CH1) GPIOA-&gt;CRL &amp;= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); GPIOA-&gt;CRL |= GPIO_CRL_CNF6_1 | GPIO_CRL_MODE6_1; // 50MHz } // ------------------------------- // TIM3 PWM 初始化 (PA6 输出) // ------------------------------- void TIM3_Init(void) { RCC-&gt;APB1ENR |= RCC_APB1ENR_TIM3EN; TIM3-&gt;PSC = 71; // 1MHz 计数频率 TIM3-&gt;ARR = 3999; // PWM 频率 = 250kHz TIM3-&gt;CCR1 = 2000; // 初始占空比 50% TIM3-&gt;CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE; TIM3-&gt;CCER |= TIM_CCER_CC1E; TIM3-&gt;CR1 |= TIM_CR1_CEN; } // ------------------------------- // 构建正弦查找表 // ------------------------------- void BuildSineTable(void) { for (int i = 0; i &lt; 360; i++) { float angle_rad = i * 3.14159265f / 180.0f; sine_table[i] = (uint16_t)(current_amplitude * (1.0f + sinf(angle_rad)) / 2.0f); } } // ------------------------------- // 更新 PWM 输出值 // ------------------------------- void UpdateWaveform(void) { uint16_t compare_val = 0; uint16_t deg = (uint16_t)phase_accumulator % 360; switch (current_wave) { case WAVE_SINE: compare_val = sine_table[deg]; break; case WAVE_SQUARE: compare_val = (deg &lt; 180) ? current_amplitude : 0; break; case WAVE_TRIANGLE: compare_val = (deg &lt; 180) ? (current_amplitude * deg) / 180 : (current_amplitude * (360 - deg)) / 180; break; } if (compare_val &gt; 4095) compare_val = 4095; TIM3-&gt;CCR1 = compare_val; } // ------------------------------- // TIM2 初始化:1ms 定时中断 // ------------------------------- void TIM2_Init(void) { RCC-&gt;APB1ENR |= RCC_APB1ENR_TIM2EN; TIM2-&gt;PSC = 71; // 1MHz TIM2-&gt;ARR = 999; // 1ms 中断 TIM2-&gt;DIER |= TIM_DIER_UIE; TIM2-&gt;CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(TIM2_IRQn); } // ------------------------------- // TIM2 中断服务程序 // ------------------------------- void TIM2_IRQHandler(void) { if (TIM2-&gt;SR &amp; TIM_SR_UIF) { TIM2-&gt;SR &amp;= ~TIM_SR_UIF; phase_accumulator += phase_step; if (phase_accumulator &gt;= 360.0f) { phase_accumulator -= 360.0f; } UpdateWaveform(); } } // ------------------------------- // 检查按键状态 // ------------------------------- void CheckButtons(void) { uint8_t updated = 0; if (Key_Scan(GPIOA, GPIO_PIN_15)) { current_wave = (current_wave + 1) % 3; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_4)) { current_frequency += 100; if (current_frequency &gt; 10000) current_frequency = 10000; phase_step = 360.0f * current_frequency / 1000.0f; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_5)) { current_frequency -= 100; if (current_frequency &lt; 100) current_frequency = 100; phase_step = 360.0f * current_frequency / 1000.0f; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_6)) { current_amplitude += 256; if (current_amplitude &gt; 4095) current_amplitude = 4095; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_7)) { current_amplitude -= 256; if (current_amplitude &lt; 100) current_amplitude = 100; updated = 1; } if (updated) { BuildSineTable(); // 重建正弦表 } } // ------------------------------- // 系统时钟初始化:HSE+PLL &rarr; 72MHz // ------------------------------- void SystemClock_Init(void) { RCC-&gt;CR |= RCC_CR_HSEON; while (!(RCC-&gt;CR &amp; RCC_CR_HSERDY)); RCC-&gt;CFGR &amp;= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL); RCC-&gt;CFGR |= RCC_CFGR_PLLSRC; RCC-&gt;CFGR |= RCC_CFGR_PPRE1_DIV2; RCC-&gt;CR |= RCC_CR_PLLON; while (!(RCC-&gt;CR &amp; RCC_CR_PLLRDY)); RCC-&gt;CFGR &amp;= ~RCC_CFGR_SW; RCC-&gt;CFGR |= RCC_CFGR_SW_PLL; while ((RCC-&gt;CFGR &amp; RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); } // ------------------------------- // 主函数 // ------------------------------- int main(void) { SystemClock_Init(); GPIO_Init(); TIM3_Init(); TIM2_Init(); phase_step = 360.0f * current_frequency / 1000.0f; BuildSineTable(); while (1) { CheckButtons(); Delay_ms(10); } } 现在没有RC滤波器,请修改代码,让示波器直接显示清晰波形,可重写代码,其中设备为stm32f103vc,按键引脚为PA15,PB4,PB5,PB6,PB7
最新发布
12-19
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值