【BLE】STM32WB55_定时器碎片(九)

STM32WB BLE协议栈开发实战:双核架构与低功耗蓝牙应用指南 蓝牙低功耗(BLE)技术作为物联网设备无线通信的主流方案,正被广泛应用于智能家居、可穿戴设备与工业传感器等领域。其核心协议栈承担着链路层调度、连接管理与数据交互等关键任务。在嵌入式工程实践中,STM32WB系列凭借独特的双核架构——Cortex-M4应用核与Cortex-M0+无线核分离,为开发者提供了高效稳定的BLE协议栈运行环境。理解双核间的IPCC通信机制与事件驱动编程模型,是规避阻塞、优化连接稳定性的基础。本文从BLE技术原理切入,结合STM32WB的实际开发流程,系统讲解协议栈配置、GATT服务创 阅读详情

(一)硬件定时器开启前 停止操作

  1. 初始化定时器,重置参数,开启定时器,运行正常
  • 打了两个断点,看到正常运行通过
    在这里插入图片描述
  1. 定时器开启后,重复开启定时器,再来一遍操作
  • 看到第二次启动定时器就进入错误中断中
    在这里插入图片描述
  1. 定时器开启之前 先停止操作
  • 看到第二轮启动通过,不进入错误中断
    在这里插入图片描述
  • 使用定时器17再验证一下结论,现象相同
  • 为什么会关注这个?因为发现在某项目中在某些用户操作逻辑下会有概率进入错误中断Error_Handler,然后回溯发现定时器启动失败导致的,
  • 结论【定时器开启前,先保护停止操作】

(二)定时器重复启动,为何会失败

在这里插入图片描述

  • 官方库函数中-启动的时候直接判断状态非就绪状态就错误
  • 那么对于调用,启动之前一定要是就绪状态
  • 顺便看看停止函数干了什么
    在这里插入图片描述
  • 直接重置定时器状态为 就绪态

(三)定时器更新参数,常规流程

  1. 停止定时器:通过库函数(如 HAL_TIM_Base_Stop(&htimx) 或直接操作寄存器)禁用定时器计数器。
  2. 更新参数:安全地修改自动重载值(ARR)、预分频器(PSC)、比较/捕获值(CCR)等关键参数。
  3. 重新启动定时器:再次使能定时器计数器,使其从新参数开始运行。

(四)虚拟定时器,启动函数

//枚举列出-虚拟定时器运行状态
typedef enum
{
  TimerID_Free,
  TimerID_Created,
  TimerID_Running
}TimerIDStatus_t;

void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
{
  uint16_t time_elapsed;
  uint8_t localcurrentrunningtimerid;

#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
  uint32_t primask_bit;
#endif
   
  //看看 启动的时候会判断定时器的状态 
  //如果是运行状态 会调用停止函数 停止定时器
  if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
  {
    HW_TS_Stop( timer_id );
  }

#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
  primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
  __disable_irq();          /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
#endif

  HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);    /**<  Disable NVIC */

  /* Disable the write protection for RTC registers */
  __HAL_RTC_WRITEPROTECTION_DISABLE( &hrtc );

  aTimerContext[timer_id].TimerIDStatus = TimerID_Running;

  aTimerContext[timer_id].CountLeft = timeout_ticks;
  aTimerContext[timer_id].CounterInit = timeout_ticks;

  time_elapsed =  linkTimer(timer_id);

  localcurrentrunningtimerid = CurrentRunningTimerID;

  if(PreviousRunningTimerID != localcurrentrunningtimerid)
  {
    RescheduleTimerList();
  }
  else
  {
    aTimerContext[timer_id].CountLeft -= time_elapsed;
  }

  /* Enable the write protection for RTC registers */
  __HAL_RTC_WRITEPROTECTION_ENABLE( &hrtc );

  HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**<  Enable NVIC */

#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
  __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
#endif

  return;
}

(五)IAR DEBUG模式 Call Stack(函数回溯)

  • IAR Call Stack窗口的功能详解
    在IAR的DEBUG模式下,Call Stack窗口为你提供了这个“调用堆栈”的可视化视图。它的核心作用是让你清晰地了解:当前程序执行到断点或暂停时,是经过怎样的函数调用链才到达当前位置的。
    通过菜单 View > Call Stack 可以打开该窗口。它通常显示以下关键信息:

  • 调用链:窗口以列表形式显示从 main 函数开始,到当前暂停位置(如断点处)的所有函数调用。

  • 最上面的一行是当前正在执行的函数,往下则是调用它的父函数,依此类推,直到最底层的 main 函数。

  • 位置信息:每一行通常会显示函数名以及该函数所在的源文件及行号。

  • 使用上面的Error_Handler();测试一下

  • 在Error_Handler中打一个断点,等运行到此处,使用Call Stack 回退到上一个函数

  • 通过黄色的箭头可以看到从哪里进入的,看到上一个函数,如下图所示
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

(六)STM32复位类型查看

复位类型触发原因CSR寄存器标志位典型场景
上电/掉电复位电源上电/掉电POR/PDRRCC_CSR_PORRSTF开机、断电重启
外部复位NRST引脚低电平(硬件复位)RCC_CSR_PINRSTF按下复位按钮、外部电路触发
独立看门狗复位IWDG超时(硬件看门狗)RCC_CSR_IWDGRSTF程序卡死、看门狗未喂狗
窗口看门狗复位WWDG超时(窗口看门狗)RCC_CSR_WWDGRSTF低功耗模式下看门狗超时
软件复位软件触发(如NVIC_SystemReset()RCC_CSR_SFTRSTF程序主动复位(如错误处理)
低功耗复位从待机/停止模式唤醒(LPWR)RCC_CSR_LPWRRSTF从低功耗模式唤醒后复位
欠压复位电源电压低于阈值(BOR)RCC_CSR_BORRSTF电源不稳定、电池电压过低

关键点

所有复位标志位存储在 RCC_CSR寄存器低8位(位0-7)
复位后标志位自动置位,需手动清除(设置RCC_CSR_RMVF位)
SRAM数据:系统复位后可能保留,但不建议依赖此特性

  • 每次调试模式点击复位按钮,用示波器连接芯片复位脚观察到低电平,
  • 说明此复位是硬件引脚复位
    在这里插入图片描述
    在这里插入图片描述
  • 测试一下设置看门狗不喂狗,然后在调试模式运行,在看门狗复位中断处打断点,发现进入,
  • 说明看门狗复位已经发生,且获取到看门狗复位标志
/**
 * @brief 判断并打印当前的系统复位原因

 */
void CheckResetSource(void) 
{
    int reset_count = 0;
    // 选项字节加载器复位
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_OBLRST) == SET) 
    {
        reset_count++;
    }
    // 引脚复位
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) == SET) 
    {
        reset_count++;
    }
    // 欠压复位(BOR)
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST) == SET) 
    {
        reset_count++;
    }
    // 软件复位
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) == SET) 
    {
        reset_count++;
    }
    // 独立看门狗复位
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) == SET) 
    {
        reset_count++;
    }
    // 窗口看门狗复位
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) == SET) 
    {
        reset_count++;
    }
    // 低功耗复位
    if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST) == SET) 
    {
        reset_count++;
    }

    // 在判断完复位原因后,清除所有标志
    __HAL_RCC_CLEAR_RESET_FLAGS();
}
AI预测彩票,使用chatgpt和lstm神经网络(文末附源码) AI预测彩票,使用chatgpt和lstm神经网络(文末有彩蛋) 阅读详情

相关推荐

利用Pandas进行高效网络数据获取

本文将重点介绍如何使用Pandas库进行网络爬虫。爬取数据是获取互联网上信息的常见方式之一,而Pandas作为一种强大的数据处理和分析工具,为我们提供了便捷的方法来处理和清洗从网页上获取的数据。文章将从爬取网页数据开始,包括使用Python的Requests库发送HTTP请求获取网页内容,并使用Pandas的功能来解析和提取所需的数据。我们还将讨论如何处理网页中的表格数据、处理和清洗数据、保存数据到文件等常见任务。

ak_bingbing的博客 1437

STM32无线MCU实战:用单芯片搞定Zigbee 3.0开发

在物联网节点开发中,无线MCU正逐渐取代传统“MCU+透传模组”方案。Zigbee 3.0基于IEEE 802.15.4标准,统一了应用层协议,并强化了AES-128加密和安装码机制,从底层保障设备互操作与网络安全。STM32WB系列采用双核架构,Cortex-M4F处理业务逻辑,Cortex-M0+专跑无线协议栈,使无线链路与应用代码完全解耦,显著提升开发效率。单芯片方案不仅降低BOM成本,还简化了低功耗管理、OTA升级和故障排查。无论是智能台灯、环境监测节点,还是工业无线传感网络,掌握STM32WB的Z

weixin_30553777的博客 307

全网最全 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置

昨天(2024年7月23日)我们分享了学生及科研人员电脑配置推荐 | 笔记本+外置显卡配置,性能足够支持完成你博士论文文本内容,那么今天我们就分享一文解决 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置的教程,我们使用一文来解决大家在做生信时遇到安装系统、配置环境的问题。在此文中,我们尽快可能给出一套全网最全的教程。目标是解决新手小白同学查资源的困惑和难题。但是,每个童鞋遇到的问题不一样,此教程也不可能把你遇到的每个问题都归纳在其中。我们也希望,

BioinfoDu 2260

【STM32】 ADC 完全指南:从模拟信号采样量化到五大架构原理

本文系统介绍ADC核心概念与五大主流架构。模拟信号具时间与幅值连续性,需经采样(满足奈奎斯特准则防混叠)、量化(引入±1/2LSB误差,SNR≈6.02N+1.76dB)、编码三步转为数字信号。重点解析Flash(并行高速但受限于比较器数量)、SAR(逐次逼近,低功耗适合MCU如STM32)、双积分(高精度抗工频,用于万用表)、流水线(高速吞吐)及Σ-Δ(高分辨率,靠过采样与噪声整形)五类架构原理、优缺点与应用场景。强调分辨率≠精度,选型本质是速度、精度、功耗与面积的权衡。

专注后端与底层技术,分享实战干货与学习笔记,梦想进入字节跳动,步履不停,热爱不止。 456

Unity Scriptable Build Pipeline (SBP) 详解

Unity 的可编程构建管线(Scriptable Build Pipeline, SBP)标志着引擎构建架构的一次关键转变,它从不透明的 C++ 实现转向了灵活、可扩展的 C# 框架。SBP 旨在满足现代游戏开发日益增长的需求,通过改进增量处理和高效缓存机制显著提升了构建性能。它赋予开发者对内容构建过程前所未有的控制力,从而能够针对特定项目需求进行深度定制。尽管 SBP 是 Unity 推荐的 Addressables 系统的重要基础层,但理解其核心组件、构建流程和高级功能对于优化大型项目、简化 CI/C

m0_57771536的博客 2208

用AI画电路板AI EDA初探Creating WiFi Radio with CELUS: A Step-by-Step Tutorial 使用CELU.IO创建WiFi收音机:分步教程

结论:整体还不太成熟,所选器件单元是欧美思维,器件选型成本和咱们华强北还是无法比。可以关注迭代,看客就当走马观花就行了;不过里面的单元模块还带有AI提问的这个比较好,值得国内EDA从业者学习。话不多说上正文:本教程目的是让我们深入了解如何使用CELUS设计平台构建WiFi收音机实战项目。本指南的重点是使用该平台来选择正确的解决方案,并整合一个项目,让您可以将音乐和节目从互联网直接传输到您自己构建的扬声器。

2301_81235726的博客 1万+

嵌入式:2.STM32底层基础(存储、寄存器、时钟、总线、GPIO、寄存器点灯)

存储系统用来存放程序、数据、设备状态,核心三大作用:存放程序代码、保存运行时数据(全局、局部、栈、堆)、数据持久化(比如W25Q64 Flash,可以搭配文件系统)。

2401_86731574的博客 108

python画弗里德曼(Friedman) 检验和秩和检验(Nemenyi)检验图

python画弗里德曼(Friedman) 检验和秩和检验(Nemenyi)检验图 画好后效果图 实现代码如下 import matplotlib.pyplot as plt #算法平均排名 _alg_=[1.405,2.643,2.786,2.167] y=[1,2,3,4]#alg1,alg2,alg3,alg4 通过Nemenyi测试计算得到的临界值CD CD=1.024 h_CD=CD/2 plt.figure(figsize=(10,6)) plt.scatter(_alg_,y,s=10

大模型天花板 4464

TMS320F28335 学习笔记(二):系统时钟、PLL 与看门狗

本文系统介绍F28335的时钟架构与看门狗应用,涵盖外部晶振、PLL倍频生成系统时钟(SYSCLKOUT)、高速/低速外设时钟分频配置,以及看门狗的启用、关闭与喂狗机制。强调时钟配置准确性对延时、PWM、通信等外设的重要性,指出常见错误如晶振不匹配、未等待PLL锁定、随意修改PLL或喂狗周期过长等问题,并提供初始化框架与验证方法,帮助开发者正确配置时钟系统,确保程序稳定运行。

2403_83044722的博客 265

Altium Designer 20/21/22/23版本汉化与库管理全攻略(附避坑指南)

本文系统梳理了Altium Designer 20/21/22/23等多个版本的汉化方案与库管理全流程。针对不同版本的中文支持差异,提供了安全的汉化设置指南与版本选择建议。重点详解了原理图库、PCB封装库及集成库的创建、管理与团队协作最佳实践,并附有常见问题避坑指南,帮助硬件工程师高效搭建稳定的设计环境。

rgv234567的博客 1111

2080Ti双卡开启NVLink

本文介绍了如何在Ubuntu 22.04系统下给2080Ti双卡开启NVLink的方法。

flymyd的博客 2900

从寄存器层面重学STM32(7)——定时器

本文系统梳理了STM32定时器的架构与工作原理,以时基单元为核心,涵盖计数模式、预分频、影子寄存器及定时周期计算。重点解析输出比较(PWM生成)与输入捕获(脉冲测量)机制,阐明CCR与CNT比较逻辑及波形生成流程。深入探讨通用定时器的从模式(如编码器、触发、门控等)与主模式(TRGO同步),明确主从定时器间信号传递关系。结合寄存器配置(CR1、SMCR、CCMR、CCER等),总结定时器在中断、DMA、PWM输出、信号捕获中的应用,实现精准定时与事件控制。

2403_88517351的博客 285

UE4打包为Framework库嵌入iOS原生工程

UE4打包为Framework库嵌入iOS原生工程

tangfuling1991的博客 1294

K210+STM32+LVGL:手搓边缘AI智能安防监控网关

在传统的物联网或嵌入式毕设中,“智能安防”往往沦为“温湿度+蜂鸣器”的简单堆砌。由于单片机(如STM32)算力有限,无法在本地运行复杂的视觉AI模型,导致很多项目只能在云端处理图像,带来高延迟和隐私风险。本文将分享一个真正的边缘计算安防网关项目。我们采用“K210视觉协处理 + STM32F407主控 + LVGL高颜值UI”的分布式架构,完美解决了单芯片算力不足的痛点。项目不仅实现了明火与陌生人脸识别,还加入了多源传感器融合、5秒智能防抖、以及硬件与UI的双向闭环控制,是一套工业级标准的开源方案。

186

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STM32+RC522读取MIFARE 1K卡排坑实录

本文记录了基于STM32F103C8T6与RC522模块读写MIFARE 1K卡的调试全过程,重点剖析三大核心问题:认证失败因缺失选卡步骤(需完成SELECT进入ACTIVE态)、通信超时源于硬件CRC配置错误与SPI速率过高(建议降速至1MHz并动态控制CRC)、写块仅写入首字节系时序截断导致(应拆分发送指令与数据)。通过补全协议流程、优化时序与通信逻辑,最终实现稳定读写。强调深入理解ISO14443A状态机、合理降速及关注芯片底层特性的重要性,为同类项目提供实用避坑指南。

努力,学习! 170

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【STM32】 程序从源码到运行:编译、烧录与启动全流程详解(下)

本文深度解析STM32从上电到main函数执行的完整启动流程,涵盖复位本质、地址别名机制、向量表布局、启动文件作用及C运行环境初始化。重点揭示0x0别名映射原理、MSP与PC硬件自动加载、.data/.bss搬运机制、栈管理与异常处理等核心概念,阐明硬件与软件协同完成“镜像→运行态”转换的设计哲学,为嵌入式开发提供底层认知支撑。

专注后端与底层技术,分享实战干货与学习笔记,梦想进入字节跳动,步履不停,热爱不止。 720

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32制作单手鼠标键盘

以 STM32G431 单手键盘为例,解析按键矩阵、ADNS-9800 轨迹球、滚轮编码器与 QMK 的配合,说明 SPI 位移读取、USB 输入报告及装配调试要点。

不脱发的程序猿 341

【STM32+K210】从零打造智能安防系统:明火检测 + LVGL 可视化监控平台

层次收获架构视觉与逻辑分离,事件驱动通信,最小化串口带宽RTOS单一 LVGL 上下文原则,标志位 + 定时器同步LVGL局部动画 > 全屏动画,flex 布局防重叠,提升可点性调试遇到"点不动"先分两层:回调有没有进(继电器咔哒)→ 进来后界面刷不刷。

318

FPGA 脉冲伺服 + 编码器采集,ARM 主控数据交互完整方案(Zynq / 独立 FPGA+NXP i.MX/STM32 通用)

本文系统阐述FPGA与ARM协同实现高精度脉冲伺服控制的架构设计,核心为“FPGA做硬实时信号处理,ARM负责轨迹规划与上层逻辑”。重点解决丢脉冲、Z相误判、数据撕裂等工程痛点:采用四倍频正交解码、硬件Z相锁存、双口乒乓缓冲及跨时钟域CDC防护;推荐Zynq平台使用AXI-Lite交互,独立方案用DPRAM+FMC;强调参数整帧交换、差分走线与实时系统部署,确保5Mpps高速下稳定运行,适用于多轴高精度运动控制场景。

XMAIPC_Robot的博客 308

STM32 等精度频率计实测:测频法测周法中界频率、双定时器同步闸门与±1误差消除落地

频率测量是电子测量中最基础也最容易做糙的功能:直接数脉冲的测频法在低频段误差爆炸,测周期的测周法在高频段被标准时钟精度拖垮,两者误差曲线存在一个交叉点——中界频率。本文基于STM32F103C8T6,先用TIM3输入捕获分别实现测频法与测周法并实测出各自误差曲线,推导出中界频率约632Hz的分界点;随后针对闸门与被测信号不同步引入的±1误差,升级为TIM3作门控计数器、TIM2作标准时钟的双定时器同步闸门方案,把1kHz~1MHz全频段相对误差从最大0.5%压到0.02%以内;最后落地工程界通用

LCG米的博客 476

STM32内部FLASH(STM32标准库学习笔记)

本文系统讲解STM32F1系列内部FLASH的结构与应用,涵盖程序存储器、选项字节及电子签名等组成部分。重点介绍FLASH解锁/加锁机制、读写操作流程(指针访问、页擦除、编程)、选项字节配置及工程实践方法。通过分层设计实现参数掉电保存,结合实例演示芯片ID读取与数据持久化。强调擦写次数有限、避免频繁操作,并建议合理规划存储空间,为IAP升级与嵌入式系统开发奠定基础。

xiaolitongxue222的博客 697

STM32机房环境监控安防报警系统

本系统基于STM32F103C8T6设计,实现机房环境监控与安防报警。可实时采集温湿度、光照、烟雾及人数,通过OLED显示数据,支持自动/手动模式切换。自动模式下智能调控风扇、灯光、电源,并在异常时声光报警;防盗模式启用人体检测报警。支持阈值调节,通过ESP8266连接机智云APP远程监控与控制,配备完整资料及实物演示视频。

送外卖的工程师 268

STM32核心板高阶布线全解析学习笔记

本文介绍了STM32F103RCT6核心板的PCB设计流程。通过设置6mil最小间距与禁止布线区实现电气隔离与机械避让。采用分层布线策略:电源线(5V、3.3V)加粗并辅以铺铜,保障电流承载与散热;地线大面积铺铜,降低阻抗、抑制EMI;信号线短直走线,避免直角,关键信号远离干扰源。布局分区清晰,模块集中,去耦电容就近放置。完成顶层铺铜后,切换至底层铺铜,并添加30mil间距缝合孔,增强连接与散热。最终实现完整3D PCB结构,提升可靠性与性能。

comyccccc的博客 176

STM32 驱动 MAX7219 点阵屏实测:上电黑屏双陷阱、级联数据错位根因与取模映射定标落地

8×8LED点阵是电子时钟、小游戏和竞赛展示界面的常客,但MAX7219的调试资料零散,上电黑屏、级联错位、显示镜像三个问题反复消耗调试时间。本文基于STM32F103C8T6与双片级联MAX7219模块,从16位帧格式和上电默认寄存器状态入手,给出硬件SPI(Mode0、2.25MHz)驱动方案与帧缓存刷新架构。实测:3.3V供电下SPI时钟安全上限为2.25MHz(4.5MHz时万帧误码7帧);双片级联全帧刷新实测116μs,与理论值偏差+2.1%;亮度寄存器0x00~0x0F对应模块平均电

LCG米的博客 227

STM32 I2C 通信协议详解:从通信过程到开漏输出、线与和总线仲裁

本文详解STM32 I2C通信协议,涵盖其同步串行、双线(SDA/SCL)特性及主从架构。重点解析起始/停止信号、地址传输、读写方向位、应答机制与重复起始信号的应用。深入探讨开漏输出原理及其在总线“线与”逻辑中的关键作用,确保多设备共用总线时无电平冲突,并实现总线仲裁,保障通信可靠性。

记录代码路上的点滴思考。 256

水深水位传感器(STM32)

本文介绍基于STM32F103C8T6的水深水位传感器实验,采用HS-S37A模块通过导电原理实现水位检测。传感器输出模拟电压,经ADC采集后在OLED显示实时数据。程序通过多次采样求平均值,提升测量稳定性。适用于花盆积水、漏水报警等场景,适合教学与物联网开发。项目代码完整,含初始化、读取与显示功能,资料可于文末获取。

qq_44016222的博客 127
上一篇: 【BLE】STM32WB55_资料链接(八)
下一篇: 【BLE】STM32WB55低功耗实测(十)
Long-Run
博客等级 码龄3年 4600粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值