深入解析GD32F30x闪存控制器FMC的读写保护机制与安全配置

GD32篇 一、GD32程序设置读保护,防止程序被读取 在实际发布的产品中,在GD32芯片的内部FLASH存储了控制程序,如果不作任何保护措施的话,可以使用下载器直接把内部FLASH的内容读取回来,得到bin或hex文件格式的代码拷贝,别有用心的厂商会利用该方法山寨产品。为了解决这个问题,GD32芯片提供了好几种保护内部Flash不被轻易读取的方式,但是一般在默认的情况下这个功能是没有打开的。安装下载完成之后打开就是这个界面对于GD32F10x_MD,闪存页大小为1KB。 阅读详情

1. GD32F30x闪存控制器FMC的安全保护机制解析

第一次接触GD32F30x的FMC模块时,我被它的安全保护设计惊艳到了。这个看似普通的闪存控制器,实际上内置了多重防护措施,就像给数据上了好几道保险锁。FMC的安全保护主要分为两个层面:读写保护和擦除/编程保护,这两套机制共同构成了芯片内部存储器的安全防线。

在实际项目中,我遇到过因为误操作导致关键配置参数被覆盖的情况。后来深入研究FMC的保护机制后,发现只要合理配置选项字节,完全可以避免这类问题。FMC的读写保护通过硬件级别的访问控制实现,当保护使能时,任何通过调试接口(如JTAG/SWD)或非法指针访问的尝试都会被阻断。

特别值得一提的是FMC的双重解锁机制。就像银行金库需要两把钥匙才能开启一样,对FMC控制寄存器的修改需要先通过密钥解锁,再进行操作确认。这种设计有效防止了程序跑飞时意外修改闪存内容。我曾经做过实验,在未解锁状态下强行写FMC寄存器,结果触发了硬件错误中断,但存储区的数据完好无损。

2. 选项字节的配置与安全应用

选项字节是FMC安全配置的核心所在,这个16字节的特殊存储区就像FMC的"控制面板"。每次芯片复位时,选项字节的内容会自动加载到FMC_OBSTAT和FMC_WP寄存器,决定着整个闪存的安全状态。

2.1 选项字节的结构解析

选项字节包含几个关键配置位:

  • RDP(读保护):0xAA表示禁用保护,其他值使能保护
  • USER:用户配置选项,包括复位模式、看门狗设置等
  • DATA:用户自定义数据,可用于存储产品序列号等信息
  • WP:写保护位,每位对应闪存的一个页(1=未保护,0=保护)

在GD32F303项目实践中,我推荐使用以下配置流程:

void OptionBytes_Config(void)
{
    fmc_unlock();  // 解锁FMC控制寄存器
    fmc_ob_unlock(); // 解锁选项字节操作
    
    ob_erase();  // 擦除原有选项字节
    while(fmc_busy());
    
    ob_write_protection_enable(OB_WP_1|OB_WP_2); // 保护前两页
    ob_security_protection_config(OB_RDP_LEVEL_1); // 启用读保护
    ob_user_write(OB_USER_IWDG_SW|OB_USER_nRST_STOP); // 配置用户选项
    
    fmc_lock();  // 重新锁定FMC
}

2.2 选项字节的实时更新技巧

选项字节的一个特点是修改后需要系统复位才能生效。但在某些应用场景下,我们可能希望动态调整保护设置。通过实践,我总结出一个实用技巧:可以在RAM中维护一份选项字节的镜像,运行时根据需要修改镜像内容,然后在安全时机(如系统待机前)将其写入实际的选项字节区域。

特别注意选项字节的补码校验机制。每个配置字节后都紧跟它的补码字节,如果两者不匹配,FMC_OBSTAT寄存器的OBERR位会被置1。有次调试时就因为漏掉了补码写入,导致配置始终不生效,花了半天才找到这个坑。

3. 擦除与编程保护实现详解

3.1 页保护机制的工作原理

FMC的页保护功能就像给每个闪存页贴上了"禁止修改"的标签。当WP寄存器的某位被清零时,对应的闪存页就会进入保护状态。尝试擦除或编程受保护页时,FMC_STAT寄存器的WPERR位会被置1,操作本身会被静默忽略。

我在智能家居项目中就利用了这一特性,将固件核心代码放在受保护的页中,即使用户程序跑飞也不会破坏关键代码。保护配置示例:

// 设置第0-3页写保护
ob_write_protection_enable(OB_WP_0|OB_WP_1|OB_WP_2|OB_WP_3); 

// 擦除前检查保护状态
if(FMC_WP & (1<<page_num)) {
    fmc_page_erase(page_addr); // 只有未保护页才能擦除
} else {
    printf("Error: Page is write-protected!\n");
}

3.2 中断保护机制的实战应用

FMC提供了完善的中断机制来监控保护状态,包括:

  • 操作结束中断(ENDIE)
  • 错误中断(ERRIE)
  • 写保护错误中断(WPERR)

合理配置这些中断可以大幅提高系统可靠性。我的经验是至少启用ERRIE中断,这样当发生非法操作时能及时捕获:

void FMC_IRQHandler(void)
{
    if(fmc_flag_get(FMC_FLAG_WPERR)) {
        fmc_flag_clear(FMC_FLAG_WPERR);
        log_error("Write protection violation!");
    }
    // 其他错误处理...
}

// 初始化时启用中断
fmc_interrupt_enable(FMC_INT_ERR);
nvic_irq_enable(FMC_IRQn, 0, 0);

4. 安全配置的典型应用场景

4.1 固件防篡改方案

在物联网设备中,防止固件被非法修改是基本安全需求。通过组合使用FMC的读保护和写保护,可以实现多层次的防护:

  1. 生产阶段:烧录完成后启用读保护,防止通过调试接口提取固件
  2. 运行时:保护bootloader区域写保护,确保即使应用层被攻破也无法修改启动代码
  3. 关键数据:将加密密钥等敏感信息存放在受保护的独立页中

实测表明,启用读保护后,通过J-Link读取闪存只会得到全FF或随机数据,有效保护了知识产权。

4.2 安全升级的实现技巧

OTA升级时需要临时解除部分区域的保护,这个过程存在安全风险。我的解决方案是:

  1. 升级前验证数字签名
  2. 仅解除目标区域的写保护
  3. 升级完成后立即恢复保护
  4. 使用硬件CRC校验写入内容

关键代码片段:

void secure_update(uint32_t addr, uint8_t *data, uint32_t len)
{
    uint32_t page = addr / FMC_PAGE_SIZE;
    
    // 临时解除目标页保护
    ob_write_protection_disable(1<<page);  
    delay_ms(10);
    
    // 擦除并编程
    fmc_page_erase(addr);
    for(int i=0; i<len; i+=4) {
        fmc_word_program(addr+i, *(uint32_t*)(data+i));
    }
    
    // 立即恢复保护
    ob_write_protection_enable(1<<page);
}

5. 常见问题与调试技巧

5.1 保护状态判断方法

调试保护相关问题时,需要准确获取当前保护状态。除了读取选项字节内容外,还可以通过以下寄存器实时监控:

  • FMC_OBSTAT:选项字节加载状态
  • FMC_WP:当前写保护位映射
  • FMC_STAT:操作状态和错误标志

一个实用的调试函数:

void print_protection_status(void)
{
    printf("RDP Level: %s\n", (FMC_OBSTAT&0xFF)==0xAA?"Disabled":"Enabled");
    printf("Write Protection: 0x%08X\n", FMC_WP);
    
    if(FMC_STAT & FMC_STAT_WPERR) {
        printf("Last operation hit write protection!\n");
    }
}

5.2 解除保护的注意事项

当需要完全解除保护(如产品返修时),必须执行整片擦除操作。但这里有个容易忽略的细节:GD32F30x的选项字节擦除和主存储区擦除是独立的操作。我曾经遇到过只做了主存储擦除,结果读保护仍然存在的尴尬情况。

正确的完整解除流程应该是:

  1. 连接调试器,保持芯片复位状态
  2. 通过工具发送整片擦除命令
  3. 单独执行选项字节擦除
  4. 重新上电后验证保护状态

在代码中实现保护解除时,务必确保中断和看门狗等不会干扰擦除过程。我的做法是:

void full_unprotect(void)
{
    disable_irq();  // 关闭所有中断
    iwdg_disable(); // 关闭看门狗
    
    fmc_unlock();
    fmc_ob_unlock();
    
    fmc_mass_erase();  // 整片擦除
    ob_erase();       // 选项字节擦除
    
    nvic_system_reset(); // 强制复位
}

6. 性能优化与安全平衡

6.1 零等待区域的保护策略

GD32F30x的前256KB闪存具有零等待特性,通常我们会把关键代码放在这个区域。但这也带来了安全矛盾:频繁校验会影响性能。我的解决方案是:

  1. 对零等待区代码启用写保护但不启用读保护
  2. 使用硬件CRC模块定期校验代码完整性
  3. 在检测到篡改时触发安全恢复流程

这样既保证了性能,又能及时发现代码篡改。

6.2 安全操作的时间优化

保护操作本身会增加额外开销,在实时性要求高的场景需要特别注意。通过实测发现:

  • 启用读保护:增加约2ms启动时间
  • 页保护检查:每次约50us额外开销
  • 选项字节修改:需要完整擦除-编程周期(约20ms)

对于时间敏感操作,可以预先在RAM中缓存保护状态,减少实时检查的开销。例如:

static uint32_t cached_wp = 0;

void update_wp_cache(void)
{
    cached_wp = FMC_WP; // 启动时缓存保护状态
}

int is_page_protected(uint32_t page)
{
    return !(cached_wp & (1<<page)); 
}

7. 高级安全增强技巧

7.1 动态保护切换方案

在某些安全敏感应用中,可能需要根据运行状态动态调整保护级别。通过研究GD32F30x的参考手册,我发现可以通过以下步骤实现运行时保护调整:

  1. 在安全环境中预先写入多组选项字节配置
  2. 通过特定触发条件(如安全认证通过)切换到对应配置
  3. 使用芯片复位使新配置生效

虽然这会带来一定的性能中断,但对金融支付等场景非常有用。

7.2 与加密模块的协同防护

GD32F30x的高端型号内置了硬件加密模块,可以与FMC保护机制形成互补:

  1. 使用加密模块对敏感数据进行实时加密
  2. 将密钥存放在FMC写保护的特定页中
  3. 通过读保护防止密钥提取
  4. 利用加密模块的认证功能控制保护状态切换

这种硬件级的安全协同,比纯软件方案可靠得多。在智能电表项目中采用这种设计后,顺利通过了行业安全认证。

GD32F303RCT6不小心将读保护开启,导致后续程序烧不进去的解决办法 每次系统复位后,闪存的可选字节块被重加载到FMC_OBSTAT和FMC_WP寄存器,可选字节生效。当可选字节被重装载时,如果可选字节的补字节和可选字节不匹配,FMC_OBSTAT寄存器的OBERR位将被置1,可选字节被强制设置为0xFF。这里选择ST的型号,为啥选ST的,一方面因为GD的型号不全,另一方面选择GD的型号可能解锁指令不能用,后面新的J-Flash版本应该会逐步完善GD。GD32F10X,GD32F30X,GD32E103,GD32F3X0 STM32F103系列。 阅读详情

相关推荐

GD32片内Flash实战:手把手教你实现数据存储与读取(含代码示例)

本文详细介绍了GD32片内Flash的数据存储与读取实战技巧,涵盖Flash物理结构、FMC控制器工作机制及开发环境配置。通过代码示例演示了安全解锁、数据写入和擦除操作的最佳实践,并提供了高级应用与故障排查指南,帮助开发者高效利用GD32的片内Flash功能。

weixin_29165465的博客 387

GD32看门狗硬件启动

代码功能:设置GD32F303CC看门狗硬件启动。硬件看门狗设置地址:0x1ffff802

weixin_46934277的博客 672

GD32F1x0_User_Manual_CN_v3.1

GD32F1x0_User_Manual_CN_v3.1 兆易创新的 F1x0系列的 3.0版本的描述文档

【GD32】系统时钟解析

介绍GD32时钟配置相关的笔记,重点在理解时钟树、查看PLL相关寄存器如何配置。

frank 9892

国央企创新负责人如何通过平台提升技术需求挖掘与资源配置的精准性?.docx

国央企创新负责人如何通过平台提升技术需求挖掘与资源配置的精准性?

科技中介服务机构在协助企业对接科研成果时,如何提升服务响应速度与专业化水平.docx

科技中介服务机构在协助企业对接科研成果时,如何提升服务响应速度与专业化水平

GD32的flash读保护和写保护

介绍   在实际发布的产品中,在GD32芯片的内部FLASH存储了控制程序,如果不作任何保护措施的话,可以使用下载器直接把内部FLASH的内容读取回来,得到bin或hex文件格式的代码拷贝,别有用心的厂商会利用该方法山寨产品。为此,GD32芯片提供了多种方式保护内部FLASH的程序不被非法读取,但在默认情况”下该保护功能是不开启的,若要开启该功能,需要改写内部FLASH选项字节(Option Bytes)中的配置。   GD32的选项字节地址和功能都跟STM32一样:   其中前面带“n”的是不带“n”的

qlexcel的专栏 1万+

国央企创新负责人在推动内部技术成果转化与外部协同创新时,如何实现资源的高效整合与协同联动?.docx

国央企创新负责人在推动内部技术成果转化与外部协同创新时,如何实现资源的高效整合与协同联动?

虚拟同步发电机(VSG)惯量阻尼自适应控制仿真模型(simulink仿真实现)

内容概要:本文提供了“虚拟同步发电机(VSG)惯量阻尼自适应控制仿真模型”的Simulink仿真实现方法,系统阐述了如何通过仿真手段研究VSG在电力系统中的动态响应特性,重点聚焦于其惯量与阻尼的自适应控制策略。文中详细说明了模型构建流程,涵盖控制算法设计、参数调节、根轨迹分析等内容,并通过对比不同调节系数下的系统响应,深入探讨了控制参数对系统稳定性与动态性能的影响。该仿真模型有效复现了VSG模拟传统同步发电机惯性与阻尼特性的能力,对于提升新能源并网系统的频率稳定性和抗扰动能力具有重要研究价值。; 适合人群:具备电力系统、自动化或相关领域基础知识,从事新能源并网、微电网控制、电力电子与电力系统仿真研究的研究生、科研人员及工程师。; 使用场景及目标:①用于教学与科研中深入理解虚拟同步发电机的工作原理及其在现代电力系统中的应用;②为新能源发电系统接入电网时的稳定性分析与控制策略设计提供仿真验证平台;③支持对VSG控制参数进行优化,提升系统应对负荷波动和扰动的能力。; 阅读建议:建议读者结合Matlab/Simulink软件动手实践,按照文档结构逐步搭建仿真模型,重点关注控制环路设计与参数整定部分,同时参考提供的代码与仿真结果进行对比分析,以加深对VSG自适应控制机制的理解。

机器人入门实战:用 ROS2 和 Gazebo 先把差速车 URDF 跑起来,再做一版 SLAM 建图(含教学手册与源码骨架)

原创教学资源包(VIP专属)。围绕机器人开发项目实战搭建可复现闭环:用差速车 URDF 把 base_link、左右轮和激光连杆的关节树写自洽,配一间教学库房的 Gazebo 世界与 launch 骨架;再提供一版合成二维占用栅格建图,对比纯里程计写入和扫描匹配修正,用来分辨 odom 系漂移与 map 系 SLAM 输出。内含中文实战手册与可 make 抽检的 ROS 2 源码骨架。实现均为教学桩,注释标明不是完整 Navigation2 栈,不能替代实机传感器标定,也不是 Cartographer / slam_toolbox 的生产方案。 使用方法:解压后进入 src/ 目录(需 Linux、Python 3;不必安装 ROS 2 或 Gazebo 也能抽检)。先执行 make clean && make test,或运行 python3 scripts/smoke_test.py,看到 ALL SMOKE TESTS PASSED 后再阅读手册.md、README.md 与源码注释。若本机已安装 ROS 2 Humble/Jazzy 与 Gazebo,再把 src/diffbot_slam_tutor 放入工作空间,按 README 中「读者本地环境再跑」的 launch 命令启动仿真。细节见手册.md 与 src/README_SRC.txt。 适合作为成长任务「机器人开发项目实战」的自制合规 VIP 资源上传。建议售价 9.90 元。模型与数据均为虚构示例,不含刷量、搬运或真实个人信息。

两路半桥LLC谐振变换器软开关Simulink仿真(模拟谐振参数不同、分裂电容)

内容概要:本文介绍了“两路半桥LLC谐振变换器软开关Simulink仿真”资源包,重点在于基于Simulink平台对两路半桥LLC谐振变换器进行高精度建模与动态仿真,特别考虑了谐振参数不一致及分裂电容等非理想工况对系统性能的影响。该仿真模型不仅涵盖了主电路拓扑、软开关实现机制与谐振网络设计,还深入分析了不同参数配置下系统的启动特性、稳态效率、动态响应及软开关条件的满足情况。通过参数扫描与对比仿真,帮助用户掌握LLC变换器的关键设计要素与优化方法,具备较强的工程指导价值和科研教学意义。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校师生,以及从事高频开关电源、新能源变换器、车载充电机等领域的研发工程师和技术人员。; 使用场景及目标:① 掌握两路并联半桥LLC谐振变换器的建模与仿真方法;② 理解软开关技术在提升变换器效率与降低EMI方面的关键作用;③ 分析谐振参数偏差与分裂电容结构对系统均流特性、增益曲线及软开关范围的影响;④ 支持科研项目中的拓扑验证、控制策略开发与故障工况分析; 阅读建议:建议结合Simulink仿真模型与配套说明文档进行学习,重点关注谐振腔参数设置、驱动时序设计及软开关波形观测;可通过调整谐振电感、电容值或引入参数失配,观察系统行为变化,深入理解LLC变换器的稳定边界与优化设计原则。

两相交错并联Boost电路仿真模型(Simulink仿真实现)

内容概要:本文介绍了“两相交错并联Boost电路仿真模型(Simulink仿真实现)”的技术资源,属于电力电子变换器领域的仿真研究内容。该模型基于Simulink平台构建,旨在深入分析两相交错并联Boost电路的工作原理、动态响应特性及控制策略。交错并联结构通过错开各相开关管的导通时刻,有效降低输入电流纹波、提升系统效率与功率密度,适用于中高功率DC-DC变换应用场景。资源包含完整的主电路建模、PWM驱动信号生成、闭环控制器设计(如电压/电流双闭环控制)等关键模块,并可能涵盖软启动、均流控制等关键技术问题。整个仿真模型强调理论分析与工程实践的紧密结合,不仅有助于理解电路基本行为,也为优化控制算法提供验证平台,服务于科研与教学需求。; 适合人群:电气工程、自动化、电力电子及相关专业的高校本科生、研究生,以及从事电源系统研发的工程技术人员,具备一定的电路理论、自动控制原理和Simulink仿真基础者更佳。; 使用场景及目标:① 学习和掌握两相交错并联Boost电路的拓扑结构、工作机理及性能优势;② 利用Simulink进行电力电子电路的建模与仿真,深入理解PWM控制、闭环调节、均流控制等核心技术的应用;③ 为科研项目、课程设计或毕业设计提供可复用的仿真案例和技术支持,辅助开展中高功率电源系统的创新设计与优化研究。; 阅读建议:建议结合Simulink软件动手搭建并调试模型,通过调整占空比、开关频率、电感参数等变量,观察其对输入电流纹波、输出电压稳定性及动态响应的影响,以深化对电路特性的理解;同时可参考文中列出的其他相关资源(如LLC、PFC等仿真模型)进行横向对比学习,拓宽电力电子系统设计视野。

双向全桥CLLC谐振变换器仿真模型(Simulink仿真实现)

内容概要:本文系统介绍了双向全桥CLLC谐振变换器的Simulink仿真模型,重点阐述了变频控制、闭环仿真及其与多种电力电子拓扑(如维也纳整流器、DAB变换器、图腾柱PFC等)的联合仿真设计。资源包涵盖2.5kW双向全桥LLC、V2G电动汽车充放电系统、三相PFC、多相交错LLC等多种变换器的仿真案例,并深入展示了三电平VIENNA整流器在双闭环PI控制与SVPWM调制策略下,结合上下电容电压差值补偿实现中点电位平衡的先进控制方法。通过仿真验证,该策略不仅有效维持了800V直流母线电压的稳定,还在动态工况下显著提升了电容电压的均衡度,同时保持了较低的输入电流THD,充分体现了SVPWM与中点平衡控制协同优化的技术优势。; 适合人群:具备电力电子与自动控制理论基础,从事新能源发电、电动汽车、工业电源、微电网等领域的研究生、工程师及科研人员。; 使用场景及目标:① 学习并构建高频谐振变换器(如LLC、CLLC)的Simulink仿真模型,掌握其变频与混合控制策略;② 深入理解并应用中点电位平衡、双闭环PI控制、SVPWM调制等核心技术于VIENNA等三电平变换器中;③ 复现高水平期刊论文中的控制算法,服务于科研项目申报、学术论文撰写或工程产品开发。; 阅读建议:该资源为综合性仿真资料库,建议使用者结合自身研究方向(如电动汽车充电、新能源并网)选择对应案例进行精学,重点关注控制策略的设计逻辑、仿真参数的整定方法以及SVPWM与中点平衡的协同机制,并充分利用附带的计算书和参考文献深化理解,以实现从仿真模型到实际工程应用的顺利转化。

区域电网含风光火压缩空气储能抽水蓄能以及电化学储能的联合调度,加入IEEE39系统,进行潮流计算,分析电能质量研究(Matlab代码实现)

内容概要:本文研究了包含风能、太阳能、火电以及压缩空气储能、抽水蓄能和电化学储能等多种能源形式的区域电网联合调度问题,通过将系统接入IEEE 39节点标准测试系统,利用Matlab平台开展潮流计算与电能质量分析,旨在提升高比例可再生能源接入背景下电网运行的稳定性与供电品质。研究重点涵盖多类型电源与多种储能系统的协调优化调度策略设计,深入探讨储能系统在削峰填谷、平滑新能源出力波动方面的关键作用,并对复杂运行工况下电压偏差、频率波动、谐波污染等电能质量问题进行评估与改善。通过构建完整的仿真模型,系统性地分析了联合调度对电网电能质量的影响机制,为现代电力系统中多能互补与协同控制提供了理论依据和技术参考。; 适合人群:具备电力系统分析、优化调度及电能质量相关基础知识,熟悉Matlab/Simulink仿真环境的研究生、科研人员及电力系统相关领域的工程师。; 使用场景及目标:①为含多种储能的区域电网联合调度研究提供完整的Matlab仿真案例与开源代码参考;②分析大规模新能源接入对IEEE 39系统潮流分布及电能质量的综合影响,并定量评估不同类型储能系统的调控效果;③为电力系统优化调度、电能质量综合治理、多能协同控制等学术研究与工程项目提供可复现的技术支撑与解决方案。; 阅读建议:本资源以Matlab代码实现为核心,读者应在掌握电力系统基本理论的基础上,重点关注联合调度的数学建模过程、储能系统充放电策略的制定逻辑以及电能质量各项评价指标的计算方法。建议在学习过程中动手调试仿真代码,尝试调整系统参数、优化目标权重或改变新能源渗透率,以深入理解系统动态行为与控制策略的有效性。

全桥LLC谐振(变频+移相混合控制)变换器闭环仿真模型(Simulink仿真实现)

全桥LLC谐振(变频+移相混合控制)变换器闭环仿真模型(Simulink仿真实现)

STM32F4驱动ES8388音频芯片的I²S时钟与DMA流设计

I²S(Inter-IC Sound)是一种广泛应用于嵌入式音频系统的同步串行总线协议,其核心在于精确的时钟同步与稳定的数据流传输。理解I²S时钟树结构(含MCLK、SCLK、WS生成逻辑)和分频机制,是保障CD级音质(如44.1kHz/16bit)的基础;而DMA双缓冲技术则解决了实时音频播放中数据供给连续性的关键工程问题。在STM32F4等Cortex-M4平台中,需协同配置PLLI2S锁相环、I²S预分频寄存器(I2SxPR)及DMA循环模式,同时兼顾ES8388等Codec芯片的I²C初始化时序与寄

weixin_35390379的博客 245
上一篇: ThingJS避坑指南:从模型优化到性能调优的7个实战技巧
下一篇: 实战指南:如何用Frida绕过安卓应用的Hook检测(附完整代码)
devops8pract
博客等级 码龄4年 533粉丝 849原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值