Cortex-M3/M4/M7 芯片 Fault 分析原理与实战

RTT-系统移植Finsh报错bus fault: SCB_CFSR_BFSR:0x04 IMPRECISERR 移植Finsh串口打印**hard fault on thread: main**、**thread pri status sp stack size max used left tick error**、**bus fault: SCB_CFSR_BFSR:0x04 IMPRECISERR** 报错信息; 阅读详情
AI摘要

本文围绕Cortex - M3/M4/M7芯片Fault展开,介绍异常类型、优先级、同步异步问题,详细讲解Fault exception registers,包括控制寄存器和状态地址寄存器。还阐述了Fault Handlers的实现,最后通过实例演示非法读取、非对齐访问等多种Fault情况及定位方法。


一、简介

1、异常类型

HardFault(硬件错误)是一类在嵌入式系统开发中较为常见的系统异常,优先级仅低于复位和 NMI(不可屏蔽中断)。当系统运行过程中遇到了某些错误时程序就会跳转至 HardFault_Handler 函数中,引发程序故障进而影响程序的正常运行。

一般而言,我们遇到的错误有如下几种:

  • HardFault(硬件故障):默认异常,由于异常处理过程中的错误或由于任何其他异常机制无法管理异常而触发。
  • MemManage(内存管理故障):检测内存管理单元(MPU)中定义的区域的内存访问违规;例如,在一个只有读/写访问权限的内存区域中执行代码。
  • BusFault(总线故障):在指令取指、数据读/写、中断向量取指和寄存器入栈(保存/恢复)中断(进入/退出)时检测内存访问错误。
  • UsageFault(使用故障):检测未定义指令的执行,加载/存储多个未对齐的内存访问。启用时,将检测除 0 和其他非对齐内存访问。

2、异常优先级

每个异常都有一个相关联的异常号和一个相关联的优先级号。为简化软件层,CMSIS 只使用 IRQ 编号,因此对中断以外的异常使用负值。下表按优先级顺序列出故障异常:

Exception Exception Number 优先级 IRQ Number 激活方式
HardFault 3 -1 -13 -
MemManage fault 4 可配置 -12 同步
BusFault 5 可配置 -11 精确时同步,不精确时异步
UsageFault 6 可配置 -10 同步

由这张表可以看出,HardFault 异常总是启用的,并且具有固定的优先级(高于其他中断和异常,但低于不可屏蔽中断 NMI)。因此,在禁用故障异常或在执行故障异常处理程序期间发生故障的情况下,将执行 HardFault 异常。通过下面的例子来理解一下这段话。

在 stm32f4xx_it.c 文件中有如下几个中断服务程序:

void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);

以 MemManage_Handler 为例,如果你没有使能这个中断的话,那它肯定也不会进入这个中断,而是会进入 HardFault_Handler,也就是硬件异常!这也是下面要讲的优先级提升。

而所有其他故障异常(MemManage fault、Bus Fault 和 Usage Fault)都具有可编程优先级。重置后,这些异常被禁用,可以在系统或应用软件中使用系统控制块(SCB)中的寄存器启用。

通常,异常优先级和异常掩码寄存器的值一起确定处理器是否进入错误处理程序,以及错误处理程序是否可以抢占另一个错误处理程序。在某些情况下(例如刚才的例子),具有可配置优先级的故障被视为 Hard Fault。这被称为优先级提升,即故障升级为 HardFault。升级到 HardFault 发生在:

  1. 当一个 Fault 触发时,并再次触发相同的 Fault。之所以会升级到 HardFault,是因为处理程序不能抢占自己(它必须具有与当前优先级相同的优先级)。
  2. 当一个 Fault 执行时,有一个优先级比它低或者同级的 Fault 被触发。因为新错误的处理程序不能抢占当前执行的错误处理程序。
  3. 当一个(普通的)中断在执行的时候,有一个优先级比它低或者同级的(普通的)中断触发了 Fault。
  4. 发生了 Fault,但未启用该错误的处理程序(上面介绍过的例子)。

如果在入栈过程中进入 BusFault handler 时发生 BusFault,BusFault 不会升级为 HardFault。这意味着,如果崩溃的栈导致了错误,即使处理程序的入栈失败,也会执行错误处理程序。错误处理程序正常运行,但栈内容已损坏。

注意:只有 Reset(复位中断) 和 NMI(不可屏蔽中断) 可以抢占固定优先级的 HardFault。HardFault 可以抢占除 Reset、NMI 或其他 HardFault 之外的任何异常。如下图所示:

3、同步异步问题

BusFault 错误处理程序可以使用 BFSR 来确定错误是异步的(IMPRECISERR,不精确的)还是同步的(PRECISERR,精确的)。

同步总线故障也被称为精确总线故障。何谓精确?就是总线触发异常之后,我们可以找到它触发异常的地址。如果同步总线故障发生在 NMI 或 HardFault 处理程序内,则会升级为锁定。缓存维护操作也可能触发总线故障。调试访问也可能触发总线故障。调试器的加载或存储访问是同步的,并且仅对调试器接口可见。

异步总线故障被称为为不精确总线故障,同理,就是总线触发异常之后,我们不能找到它触发异常的地址。它可能发生在处理器设计中存在写缓冲时。因此,在观察到总线错误响应之前,处理器流水线会继续执行后续的指令。当异步总线故障被触发时,总线故障异常被挂起。如果另一个高优先级的中断事件同时到达,则首先执行高优先级的中断处理程序,然后发生 BusFault。如果总线故障处理程序未启用,则挂起 HardFault。由异步总线故障引起的硬故障不会升级为锁定。异步错误通常是不可恢复的,因为你不知道是哪段代码导致了错误。

现代的芯片都是多级流水线执行的,它触发的时候,多级流水线人在执行,我们无法锁定是哪一级出了问题,也就无法找到精确的错误地址。

4、异常具体类型

下表中列出了 Fault 类型、Fault Handler、Fault status register 和故障发生的寄存器位名:

  • HardFault - HFSR
Fault type Bit Name
Bus error on a vector read error VECTTBL
Fault that is escalated to a hard fault FORCED
Fault on breakpoint escalation DEBUGEVT
  • MemManage - MMFSR
Fault type Bit Name
Fault on instruction access IACCVIOL
Fault on direct data access DACCVIOL
Context stacking, because of an MPU access violation MSTKERR
Context unstacking, because of an MPU access violation MUNSTKERR
During lazy floating-point state preservation MLSPERR
  • BusFault - BFSR
Fault type Bit Name
During exception stacking STKERR
During exception unstacking UNSTKERR
During instruction prefetching, precise IBUSERR
During lazy floating-point state preservation LSPERR
Precise data access error, precise PRECISERR
Imprecise data access error, imprecise IMPRECISERR
  • UsageFault - UFSR
Fault type Bit Name
Undefined instruction UNDEFINSTR
Attempt to enter an invalid instruction set state INVSTATE
Failed integrity check on exception return INVPC
Attempt to access a non-existing coprocessor NOCPC
Illegal unaligned load or store UNALIGNED
Stack overflow STKOF
Divide By 0 DIVBYZERO

下面就来看一下这些寄存器。

二、Fault exception registers

1、Control registers

系统控制块(SCB)提供系统实施信息和系统控制。这包括系统异常的配置、控制和报告。它的一些寄存器用于控制 Fault 异常。

这里有三个寄存器:

  • CCR(The Configuration and Control Register,配置和控制寄存器),控制 Usage Fault 的除零和非对齐内存访问的行为
  • SHP(The System Handler Priority Registers,系统处理程序优先级寄存器),控制异常优先级
  • SHCSR(The System Handler Control and State Register,系统处理程序控制和状态寄存器),使能系统处理程序,表示Bus Fault、MemManage fault 和 SVC异常的待处理状态。
Address / Access Register Reset Value Description
0xE000ED14
RW privileged
CCR 0x00000000 包含捕获与 UsageFault 的除零和非对齐访问的启用位
0xE000ED18
RW privileged
SHP[12] 0x00 控制异常处理器的优先级
0xE000ED24
RW privileged
SHCSR 0x00000000 表示硬故障原因的位

1.1 CCR

  • DIV_0_TRP:在处理器执行除数为 0 的 SDIV 或 UDIV 指令时启用 Usage Fault
    • 0:除 0 不触发;除以 0 得到的商是 0
    • 1:除 0 触发
  • UNALIGN_TRP:当对非对齐地址进行内存访问时,启用 Usage Fault:
    • 0:不捕获非对齐的半字和字访问
    • 1:捕获非对齐的半字和字访问;非对齐访问会产生 Usage Fault
    • 请注意,使用 LDM、STM、LDRD 和 STRD 指令的非对齐访问总是会产生 Usage Fault,即使 UNALIGN_TRP 设置为 0

1.2 SHP

SHP 寄存器设置异常处理程序的优先级。故障异常通过以下方式控制:

  • SHP[0]:内存管理故障的优先级
  • SHP[1]:总线故障的优先级
  • SHP[2]:Usage Fault 的优先级

对于编程中断和异常优先级,CMSIS 提供了 NVIC_SetPriority 和 NVIC_GetPriority 函数。故障异常的优先级可以修改如下:

NVIC_SetPriority (MemoryManagement_IRQn, 
【技术支持案例】S32K146的hard fault问题处理 最近有个客户使用S32K146的产品在量产之后出现了三个售后件,ABBA测试之后的结果表明失效现象跟着S32K146走;同时客户反馈说试着将其中一个售后件重新烧录程序,S32K146又正常工作了。结合这两种情况,S32K146应该是没有损坏的,那就需要从软件程序方面排查了。 阅读详情

相关推荐

代码调试跟踪与优化(三)--- 如何调试Fault 异常?

我们在开发嵌入式代码时,经常会遇到处理器无法启动或系统停止响应的情况,比较常见的是处理器触发了Fault 异常,并停留在Fault 异常处理程序内循环,我们如何分析产生Fault 异常的原因呢?如何借助fault status / address registers 获知产生fault 的原因呢?如何跟踪定位产生fault 的具体代码行呢?有哪些调试工具可以帮我们快速分析定位解决fault 呢?如何设计fault handlers 以输出fault log 帮我们快速定位分析解决系统bug?

流云 8760

Cortex-M3异常处理与调试接口实战:从Hard Fault诊断到ICEPick连接

在嵌入式系统开发中,异常处理和调试是保障系统稳定性的核心技术。异常是处理器响应内部或外部紧急事件的硬件机制,而调试接口则是开发者探查系统内部状态的生命线。理解其原理,需要从处理器自动保存现场的核心机制——异常栈帧入手,它记录了程序状态、返回地址等关键信息,是诊断问题的第一手资料。结合Fault状态寄存器,开发者可以精准定位如内存访问违规、指令错误等根源。在工程实践中,高效的调试离不开对JTAG、cJTAG等调试接口协议的掌握,以及ICEPick模块在安全访问与资源调度中的关键作用。这些技术共同应用于实时性要

weixin_34259232的博客 385

Cortex-M4 FPU与MPU配置实战:从原理到RTOS集成

在嵌入式系统开发中,浮点运算单元(FPU)和存储器保护单元(MPU)是提升系统性能与可靠性的核心硬件模块。FPU通过硬件加速浮点运算,显著提升了PID控制、FFT变换等实时信号处理算法的效率,其工作模式(如清零模式)可根据应用场景在性能与精度间权衡。MPU则通过划分内存区域并设置访问权限,构建了坚实的内存安全防线,能有效防止栈溢出、野指针等常见问题,保障系统稳定。在实时操作系统(RTOS)环境下,二者协同工作尤为重要:FPU的惰性上下文保存机制需与任务调度配合以优化中断响应,而MPU可为每个任务提供独立的内

weixin_30673611的博客 327

Cortex-M3异常定位指南

本文系统阐述了 Cortex-M3 异常定位的完整方法论,从现场捕获到故障原因分析,再到多层嵌套回溯,每一步都有明确的原理和代码实现。现场捕获:通过 naked 函数在异常入口获取正确的堆栈指针,提取 PC 和压栈 LR。故障分析:读取 CFSR、HFSR、BFAR 等寄存器,确定具体故障类型(如总线错误、用法错误)。嵌套回溯:利用压栈的 LR 是否为 EXC_RETURN 来判断是否存在上一层异常,并根据 EXC_RETURN 计算上一层的栈帧位置,循环直到找到最原始 PC。国产芯片实践。

内容主要在公众号OneChan讲Soc嵌入式上更新 726

深入解析Cortex-M3核心架构:NVIC、MPU与调试系统实战指南

在嵌入式系统开发中,实时中断处理、内存安全与高效调试是保障系统稳定与性能的三大基石。中断控制器(NVIC)通过硬件自动压栈、尾链优化等机制,实现了微秒级的快速响应,是系统实时性的核心。内存保护单元(MPU)则为多任务或安全敏感应用提供了硬件级的内存访问隔离与权限控制,防止非法访问导致系统崩溃。为了洞察系统运行细节,强大的片上调试系统(如DWT、ITM)提供了非侵入式的性能分析、数据观测与实时日志输出能力。这些基础硬件特性共同构成了现代微控制器可靠运行的保障。本文以经典的ARM Cortex-M3处理器为具体

weixin_34268843的博客 390

ARM Cortex-M系统锁死:PC=0xFFFFFFFE的硬件错误分析与调试实战

在嵌入式系统开发中,硬件错误处理是保障系统稳定性的关键技术。ARM Cortex-M架构通过异常机制管理运行时错误,当发生总线错误、内存访问违规等严重故障时,系统会触发硬件异常。若错误未被正确处理,可能升级为HardFault,甚至进入Lockup(锁死)状态,此时程序计数器PC会被硬件强制设置为0xFFFFFFFE,导致系统完全停止响应。理解这一机制对嵌入式调试至关重要,开发者需要掌握状态寄存器分析和栈帧回溯技术,通过检查CFSR、HFSR等寄存器标志位,结合异常发生时自动保存的现场信息,定位引发错误的根

weixin_30875157的博客 510

Cortex-M4硬故障、MPU与FPU寄存器实战调试与配置指南

在嵌入式系统开发中,内存保护和异常处理是保障系统稳定性的核心机制。其原理是通过硬件单元对内存访问权限和程序执行流程进行监控与约束。这些机制的技术价值在于能有效防止非法内存访问、栈溢出、代码注入等常见软件缺陷,从而提升系统的鲁棒性和安全性。典型的应用场景包括实时操作系统(RTOS)中的任务隔离、中断服务程序的安全执行,以及对浮点运算上下文的可靠管理。本文聚焦于Cortex-M4内核的**硬故障(Hard Fault)寄存器**、**内存保护单元(MPU)** 和**浮点单元(FPU)** 的深度解析,提供从寄

weixin_30263277的博客 351

Cortex-M4内存保护单元(MPU)与故障处理实战:从寄存器到RTOS任务隔离

在嵌入式系统开发中,内存安全与系统可靠性是核心挑战。内存保护单元(MPU)作为一种硬件机制,其原理在于为不同的内存区域设定访问权限(如只读、读写、不可执行),从而在软件模块间建立隔离墙,防止非法访问导致的数据损坏或系统崩溃。这项技术的核心价值在于提升系统的健壮性和安全性,尤其适用于汽车电子、工业控制等对可靠性要求苛刻的场景。故障处理机制则与MPU协同工作,当发生非法访问时,它能触发异常并记录详细的故障状态与地址信息,为问题定位提供“黑匣子”。本文以Cortex-M4架构和**实时操作系统(RTOS)** 环

weixin_30457465的博客 509

Cortex-M4异常处理机制:从复位到中断的底层原理与调试实战

在嵌入式系统开发中,异常处理是保障系统稳定性的核心技术。异常是处理器响应异步事件(如中断、故障)的机制,其核心原理在于硬件自动保存现场、优先级仲裁与向量跳转。通过嵌套向量中断控制器(NVIC)管理优先级,系统能够实现快速响应与抢占式调度,这对于实时性要求高的应用(如电机控制、通信网关)至关重要。异常处理机制的技术价值在于为复杂任务调度、故障诊断提供了底层支撑,尤其在资源受限的微控制器(如ARM Cortex-M4)上,是实现高可靠性系统的基石。应用场景广泛覆盖工业控制、物联网设备、汽车电子等领域,其中,Ha

weixin_34212762的博客 818

Cortex-M4中断与异常处理:从NVIC原理到实战避坑指南

在嵌入式系统与实时操作系统开发中,中断和异常处理是保障系统实时性与可靠性的核心技术。其本质是处理器响应内部或外部事件的硬件机制,通过中断控制器自动完成现场保存、优先级裁决和向量跳转。理解其原理对于实现毫秒级响应、避免优先级反转和系统死锁至关重要,尤其在工业控制、电机驱动和物联网设备等多任务并发场景中。本文以ARM Cortex-M4的嵌套向量中断控制器和异常状态机为核心,深入解析中断优先级分组、栈帧操作及故障处理等底层机制,并结合NVIC配置与中断服务程序编写的最佳实践,帮助开发者构建稳定、高效的嵌入式系统

weixin_30824479的博客 502

ARM Cortex-M3 NVIC、MPU与调试系统深度解析与实战指南

在嵌入式系统开发中,中断管理与内存保护是保障系统实时性与可靠性的核心基础。中断控制器(NVIC)通过硬件自动化的优先级管理与现场保存机制,实现了纳秒级的确定性响应,这对于电机控制、数字电源等高实时性场景至关重要。内存保护单元(MPU)则通过定义内存区域的访问权限,为不同任务或模块构建了隔离的“防火墙”,有效防止了内存越界等错误导致系统级崩溃,提升了复杂RTOS应用下的系统健壮性。本文聚焦于ARM Cortex-M3处理器,深入剖析其集成的NVIC与MPU两大硬核特性,并结合ITM、DWT等调试工具,系统讲解

cong84596496的博客 373

ARM Cortex-A8与Cortex-M3异构双核架构深度解析与协同编程实战

在嵌入式系统开发中,异构多核处理器架构通过整合高性能应用处理器与高能效实时控制核心,有效解决了复杂应用与实时控制并存的设计挑战。其核心原理在于利用ARM Cortex-A系列核心运行富操作系统处理复杂任务,而Cortex-M系列核心则凭借其确定性实时响应能力,专精于外设驱动与实时控制。这种分工协作的技术价值在于显著提升了系统的整体性能与能效比,广泛应用于视频处理、工业自动化及汽车电子等领域。本文以德州仪器TMS320DM8127视频处理器为例,深入剖析其内部ARM Cortex-A8与双Cortex-M3子

weixin_33843409的博客 521

Cortex-M3 NVIC寄存器详解:中断优先级、故障诊断与RTOS实战

中断是嵌入式实时系统的核心机制,它允许处理器快速响应外部事件。其工作原理基于硬件中断控制器,通过优先级管理实现任务的即时调度。这项技术的核心价值在于保障系统的确定性和实时性,广泛应用于工业控制、汽车电子和物联网设备。嵌套向量中断控制器(NVIC)作为ARM Cortex-M系列的标准组件,通过硬件化的寄存器实现了高效、可预测的中断管理。本文聚焦于Cortex-M3的NVIC,深入解析其**中断优先级分组**模型和**故障状态寄存器**的实战应用。你将掌握如何配置抢占与子优先级以优化实时任务调度,并学会利用系

weixin_30873847的博客 552

概率数据关联(PDA):多目标跟踪的基石算法

1. 为什么需要概率数据关联? 2. 核心思想与假设条件 3. 算法核心:概率分配与状态更新 4. 典型应用场景与优势 5. 挑战与改进方向 6. 下期预告

qq_44965657的博客 1462

如何设计QR反激变换器

摘要:本文分析了基于GaN技术的PD适配器市场现状,重点探讨了准谐振反激变换器(QR Flyback)的工作原理及设计方法。文章首先介绍了反激变换器的三种工作模式(CCM、DCM、CRM/QR)及其特点,指出QR模式通过谷底开通技术能显著降低开关损耗。随后以65W适配器为例,详细阐述了变压器参数设计流程,包括匝比确定、原边电感计算和绕组匝数设计等关键步骤。文章强调QR反激变换器凭借高效率、小体积和低成本优势,已成为20W-65W PD适配器的主流拓扑方案,配合GaN技术进一步提升了功率密度和便携性。

m0_62868254的博客 1495

逆变器专题(3)-锁相环-PLL

锁相环作为并网逆变器的第一道门户,其锁相的精度将直接影响逆变器是否并网成功,若锁相精度较差,则会直接导致系统的功率因数下降,产生无功等等。在有关文献中指出,提高PLL带宽可以准确且快速进行锁相,而当电网电压含有谐波时,可适当降低带宽抵制谐波的干扰。成为变化量,而如果两者旋转速度达到一致时,所在的交轴分量。ki很大,即带宽很大时,稳定裕度不够,锁相环锁不住。为交流量,当频率锁定而相位没有锁定时,即。,即控制环前馈,可实现将锁相速度的加快。控为0,则可实现系统完美锁相。mod,取余,可减少存储空间。

cyc19980105的博客 6179

从MySQL到数据仓库:手把手教你用Airflow实现自动化ETL流水线

本文详细介绍了如何利用Airflow构建从MySQL到数据仓库的自动化ETL流水线,涵盖增量抽取策略、PySpark转换优化和数据质量监控等实战细节。特别适合中小规模企业构建高效数据仓库,提升数据处理效率和质量。

rnn9storyteller的博客 827

YOLOv10注意力革新:小波域注意力(WDA)如何实现多尺度特征精准聚焦

本文深入解析YOLOv10中的小波域注意力(WDA)机制,探讨其如何通过频域分解与动态聚焦实现多尺度特征精准提取。WDA模块结合离散小波变换与注意力机制,显著提升小目标检测性能,在VisDrone数据集上AP提升达12.6%。文章详细介绍了两种集成方案及代码实现,为计算机视觉开发者提供实用指南。

weixin_29079671的博客 250

《派出你的AI同事:WorkBuddy案例实战》067:按行业分类的案例索引

按行业分类的案例索引 —— 《派出你的AI同事:WorkBuddy案例实战》系列文章,配图已统一为规范示意图。

LuckyHanMo的博客 91

基于深度学习的工业零件缺陷检测系统

工业零件缺陷检测系统摘要 本文介绍了一个基于深度学习的工业零件缺陷检测系统解决方案。该系统采用Faster R-CNN目标检测算法,结合PyTorch框架和OpenCV图像处理库,实现了对工业零件表面缺陷(如裂纹、划痕、凹坑等)的自动检测与定位。系统包含完整的开发流程:从数据采集与标注、数据增强预处理、模型构建与训练,到最终的评估与部署。相比传统机器视觉方法,该深度学习方案具有更强的特征表示能力和环境适应性,能够有效提升工业质检的准确率和效率。文章详细阐述了系统架构设计、实现细节和优化策略,并提供了完整的代

huanghm88的专栏 286

AttributeError: module ‘lib‘ has no attribute ‘X509_V_FLAG_CB_ISSUER_CHECK‘解决方案

本文主要介绍了AttributeError: module ‘lib’ has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK’解决方案,希望能对使用python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 基于 STM32F407 的 SPI Flash下载算法
下一篇: STM32 位带操作
Projectsauron
博客等级 码龄4年 2587粉丝 100原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值