DA14580软件开发平台参考(一)

在这里插入图片描述
翻译的是这个文档。
它介绍了整个系统架构,组件,应用程序编程接口(API)以及开发工具链,环境和过程。
问题点请在评论中留言,我看到了回去改正。

3 介绍

本文档旨在通过为蓝牙低功耗标准提供实用的高级理解,然后为DA1458x片上系统(SoC)的系统架构提供概述,从而为嵌入式软件开发人员提供参考。 系列集成电路(IC)器件,包括DA14580 / 581/583和

最后,不仅概述了DA1458x软件架构,而且还尽可能全面地了解了其组件和支持方面,包括开发工具链和环境。

3.1 文档目标用户

文档目标是嵌入式软件工程师。
建议不熟悉DA1458x片上系统(SoC)平台的开发人员通读本文档的全部内容,以熟悉此处介绍的内容以及特定信息的位置。

经验丰富的嵌入式固件工程师在阅读了内容和一些关键章节之后,将准备更深入地研究SDK及其提供的示例应用程序。 然后,建议他们仔细阅读详细的技术文档,以更清晰地了解如何在Dialog的DA1458x低功耗蓝牙®设备上开发和执行应用程序,以及如何最好地利用Dialog的DA1458x SoC平台提供的功能。

3.2 如何使用文档

本文档的重点是作为参考,即开发人员无需通读本文档的全部内容; 读者的关键是要熟悉此处描述的概念,以便在开发过程中能够使用《软件开发人员指南》来获得所需的结果。

建议对BLE和/或Dialog的DA1458x片上系统(SoC)平台不熟悉的嵌入式软件开发人员阅读内容,然后通读第3.1节至第4.8节,然后从第11节通读,以熟悉所支持的开发环境。
之后,他们安排阅读和使用文档[15]。
[15] UM-B-050, DA1458x Software Developer’s Guide, User manual, Dialog Semiconductor.

本参考文档无意于全面了解低功耗蓝牙技术,也无意涵盖其数据组织方式的内部原理,或者BLE设备如何相互通信以及可能需要进行的关键设计决策和取舍。但是,它打算为软件开发人员提供对Dialog的BLE及其外围设备的DA1458x平台高级API方法的充分了解,以及对这些方法如何在使用DA1458x SoC时开发更快,更好的BLE应用程序的信心。

请注意,以下部分基于《低功耗蓝牙入门》一书,由Kevin Townsend,CarlesCufí,Akiba和Robert Davidson撰写。

3.3设备模式

同时支持BLE和BR / EDR的设备称为双模式设备。 通常,在蓝牙生态系统内部,移动电话或便携式计算机为双模设备。
仅支持BLE的设备称为单模设备。

3.3.1单模设备
单模就是BLE,能和BLE通信,能和双模设备里面的BLE通信。
不能和支持BR和EDR的设备通信。

3.3.2双模设备
没啥说的,R和EDR,BLE,它都可以通信。

3.4主要组成部分

在经典的蓝牙标准中,协议栈由两个模块组成:控制器和主机。
在蓝牙BR / EDR设备中,这两个通常是分开实现的。

然而,更多的最新蓝牙设备包括数量增加的构件块。 几乎每个蓝牙设备中都存在以下主要构建块:
●使用蓝牙协议栈接口实现特定用例的应用程序。
●包含蓝牙协议栈上层的主机。
●控制器,它包含蓝牙协议栈的下层,包括无线电。

蓝牙规范还提供了主机与控制器之间的标准通信协议,称为主机控制器接口(HCI),该协议允许主机与主机之间的互操作性由不同实体开发的控制器。

3.5硬件配置

没啥说的,就是集成MCU的SOC,或者是外部MCU的这两种。
在这里插入图片描述

3.6网络

BLE设备使用两种不同的通信方法,每种方法都有某些优点和限制:广播和连接。
两种方法均遵循通用访问配置文件(GAP)建立的某些过程,如3.7节所述。
3.6.1 广播
翻译的不好,可以找其它资料来看广播。
使用无连接广播时,BLE设备会将数据发送到可接受的听觉范围内的任何扫描设备或接收器。 本质上,此机制允许BLE设备执行以下操作:
将数据单向发送给任何能够进行传输的人或任何事物。
广播定义了两个单独的角色:
●广播者:周期性地将不可连接的广告包发送给愿意接收它们的任何人。
●观察者:重复扫描预设频率以接收任何不可连接的广告数据包。
广播是设备一次向多个对等方传输数据的唯一方法。 这些广播的数据通过使用BLE的广告功能发送出去。

3.6.2连接
翻译的不好,可以找其它资料来看连接。
对于BLE中的双向数据传输,需要存在一个连接。 BLE中的连接无非是涉及的两个BLE设备之间在特定的特定时间点(连接事件)之间已建立的周期性间隔的数据交换。
通常,仅在两个BLE连接对等方之间交换数据,并且不涉及其他设备。 连接定义了两个单独的角色:
●中央(主机):重复扫描预设的BLE频率以查找可连接的广告数据包,并在适当时启动连接。 建立连接后,中央管理定时并启动定期数据交换。
●外围设备(从属设备):一种设备,该设备定期发送可连接的广告包并接受传入的连接。 一旦建立活动连接,外围设备就会按照中心的时间进行定时并与之定期交换数据。

为了启动连接,中央设备从外围设备接收可连接的广告包,然后向外围设备发送请求以在两个设备之间建立排他连接。 建立连接后,外围设备将停止通告,并且两个设备可以开始在两个方向上交换数据。
尽管中央设备是管理连接建立的设备,但是在每个连接事件期间,任何一个设备都可以独立发送数据,并且这些角色不会对数据吞吐量或优先级施加任何限制。
因此,一个设备可以同时充当中心设备和外围设备,一个中心设备连接到多个外围设备,以及一个外围设备连接到多个中心设备。

这一段可能有点绕,意思是master和slave只是建立蓝牙周期性传输时候的角色,这里周期性交换数据的时候,是双工的,都可以互相发送接受数据,所以站在数据传输方向的角度,是都可以做发送方(master)和接收方(slave)。
如果还是难以理解,找其它资料参考吧。
再强行解释一下,BLE主机设备,BLE从机设备,都可以某个数据传输的发起者或者接收者。
解释:
邮递员(BLE主机设备)周期性去邮箱(BLE从机设备)取信。
信可以是服务A寄给服务B的,所以服务A是发起者,那认为它是主。
信也可以是服务B寄给服务A的,所以服务B是发起者,那认为它是主。
建立这个通信,只需要保证:邮递员(BLE主机设备)周期性去邮箱(BLE从机设备)取信。
邮递员只是个干活的,跑腿的,它不是数据/服务的发起者。
另一个理解,就是BLE主机设备,BLE从机设备,这是BLE的底层去实现物理通信的“现实规矩”,就像邮递员要周期性去邮箱取信。而对于BLE主/从机设备的上层应用,都可以把自己作为数据传输的发起者。原因就在于,每一次的周期性的通信,都是双向数据传输。
对吧,邮递员取信的时候,也放了信进去,就是双工嘛。

通过使用附加协议层,更具体地说是通用属性配置文件(GATT),连接提供了对数据进行组织的能力,并且可以对每个字段或属性进行更细粒度的控制。
数据围绕称为服务和特征的单位进行组织。services and characteristics
此外,连接允许更高的吞吐量,并具有建立安全加密链接的能力,以及协商连接参数以适合数据模型的能力。
BLE设备可以具有有意义的结构,并具有多种服务和特性。
服务可以包含多个特征,每个特征都有其自己的访问权限和描述性元数据。

3.7 Profiles 配置

蓝牙规范明确区分了协议和配置文件的概念。 进行这种区分是由于每个概念服务的目的不同,并且总体规范分为:

●协议:它们是所有符合Bluetooth规范的设备所使用的构件。 协议实质上构成了实现不同数据包格式,路由,多路复用,编码和解码的层,从而允许在对等点之间有效地发送数据。

●配置文件:是垂直功能的切片,定义了所有设备所需的基本操作模式(例如通用访问配置文件和通用属性配置文件)或特定用例(邻近配置文件,葡萄糖配置文件); 配置文件实质上指定了应如何使用协议来实现特定目标,无论是通用的还是特定的。
在这里插入图片描述
YouYube大佬也粗略解释了下Profile干嘛用的。
蓝牙的基础通信原理,规则,多在CSDN找文章学习吧,视频也没有讲这些。

3.7.1 Generic Profiles
通用配置文件由蓝牙规范定义,其中两个是基础,因为它们可确保来自不同供应商的BLE设备之间的互操作性:
●通用访问配置文件(Generic Access Profile,GAP):指定下层无线协议的使用模型,以定义角色,过程和模式,以允许设备广播数据,发现设备,建立连接,管理连接以及协商安全级别;本质上,GAP是BLE的最上层控制层。所有BLE设备都必须具有此配置文件,并且所有配置文件都必须遵守该配置文件。
●通用属性配置文件(GATT):解决BLE中的数据交换并指定基本数据模型和过程,以使设备能够发现,读取,写入和推送它们之间的数据元素。它基本上是BLE的最顶层数据层。

GAP和GATT是BLE的基础,因此它们经常被用作提供应用程序编程接口(API)的基础,这些API充当应用程序进行交互的入口点
与协议栈。

3.7.2 Use-Case-Specific Profiles.
特定于用例的配置文件通常仅限于基于GATT的配置文件。 这些配置文件几乎都使用GATT配置文件的过程和操作模型作为所有进一步扩展的基础。
但蓝牙版本4.1中,引入了逻辑链接控制和适配协议(L2CAP)面向连接的通道,没有GATT的配置文件也是可能的。

###3.7.2.1 SIG-Defined GATT-Based Profiles
蓝牙SIG不仅为BLE网络中涉及的设备的控制和数据层提供了可靠的参考框架,而且还提供了基于GATT的预定义用例配置文件集,该配置文件完全涵盖了实现所需的所有过程和数据格式各种特定的用例,例如:
●查找我配置文件:它使设备可以物理定位其他设备(例如,使用智能手机查找启用了BLE的密钥环,反之亦然)。
●接近配置文件:它检测附近设备的存在或不存在(如果离开房间等区域时忘记了某项物品,则发出哔哔声)。
●通过GATT配置文件的HID:它通过BLE(用于键盘,鼠标,遥控器)传输人机接口设备(HID)数据。
●葡萄糖曲线:它可以通过BLE安全地转移葡萄糖水平。
●健康温度计配置文件:它通过BLE传输体温读数。

Bluetooth SIG的“通过的文档”页面中的规范提供了SIG批准的配置文件的完整列表(有关更多信息,请访问https://www.bluetooth.com/specifications/specs/)。开发人员还可以在Bluetooth Developer Portal上直接浏览所有当前采用的蓝牙服务和特性的服务列表。

###3.7.2.2 Vendor-Specific Profiles
蓝牙规范允许供应商为SIG定义的配置文件未涵盖的用例定义自己的配置文件。 这些配置文件可以对特定用例中涉及的两个对等方(例如,新传感器附件和智能手机应用程序)保持私有,或者也可以由供应商发布,以便其他各方可以提供基于配置文件的实现 根据供应商提供的规范。 Apple的iBeacon是已发布的特定于供应商的配置文件的一个示例。

3.7.3 Generic Access Profile Layer
通用访问配置文件(GAP)层负责总体连接功能;它处理设备的访问模式和过程,包括设备发现,直接与应用程序和/或配置文件接口以及处理设备发现和与设备相关的连接服务。此外,GAP会注意安全功能的启动。本质上,考虑到GAP指定设备如何执行控制程序(例如设备发现和安全连接建立),以确保互操作性,从而允许不同供应商的设备之间进行数据交换,因此可以将其视为BLE最高控制层。

GAP指定设备可以在BLE网络中采用的四个角色:
●广播器:该设备正在发布特定数据,例如,让所有启动设备知道它是可连接设备。该广告包含设备地址和可选的其他数据,例如设备名称。
●观察者:扫描设备在收到广告后,向广告商发送“扫描请求”。广告商以“扫描响应”进行响应。这是设备发现的过程,此后扫描设备知道广告设备的存在,并知道可以与其建立连接。
●中央:中央连接时,中央必须指定要连接的对等设备地址。如果收到与对等设备地址匹配的广告,则中央设备将发出请求,以与具有特定连接参数的广告设备建立连接(链接)。
●外围设备:建立连接后,如果设备是广告商,则它将作为从属设备;如果设备是发起者,则将作为主设备。

从根本上说,GAP建立了不同的规则和概念集,以规范和标准化设备的低级操作,尤其是:
●它们之间的角色和相互作用。
●这些设备的操作模式和转换。
●操作步骤,以实现一致且可互操作的通信。
●所有安全方面,包括安全模式和过程。
●非协议数据的其他数据格式。

3.7.4 Generic Attribute Profile Layer
通用属性概要文件(GATT)层是一个服务框架,它定义了所有使用属性协议(ATT)的子过程。 它详细描述了如何通过BLE连接交换配置文件和用户数据。 与定义与设备的低级交互的GAP相比,GATT仅处理实际的数据传输过程和格式。

GATT还为SIG定义的所有基于GATT的配置文件提供了参考框架。有效地通过涵盖配置文件的精确用例,它可以确保不同供应商的设备之间的互操作性; 因此,所有标准BLE概要文件都基于GATT,并且必须遵守该规范才能正确运行,这使GATT成为BLE规范的关键部分,因为与应用程序和用户相关的每个数据收集都必须根据其规则进行格式化,打包和传输。

GATT为交互的BLE设备定义了两个角色:
●客户端:它将请求发送到服务器,接收响应以及服务器可能发起的更新。 GATT客户端事先不了解服务器的属性,因此必须首先通过执行服务发现来查询这些属性的存在和性质。完成服务发现后,它开始读取和写入在服务器中找到的属性以及 接收服务器启动的更新。 它对应于ATT客户端。
●服务器:它接收来自客户端的请求并发出响应。 在配置时,它还会发送服务器启动的更新,并且它是按属性组织的,负责存储并使用户数据可供客户端使用的角色。 每个出售的BLE设备都必须至少包括一个基本的GATT服务器,该服务器可以响应客户端请求,即使仅返回错误响应也是如此。 它对应于ATT服务器。

再次值得一提的是,GATT和GAP角色是完全独立的,但彼此同时兼容。 例如,GAP中心和GAP外设都可以充当GATT客户端或服务器,甚至可以同时充当两者。
意思是,一个设备,在GAP配置为Central(中央),在GATT层可作为Client(主机)或Service(服务器),亦或者both角色。

翻译不出味道,自己品尝。
GATT uses ATT as a transport protocol for data exchange between devices. This data is organized
hierarchically in sections called services, which group conceptually related pieces of user data called characteristics.

3.8 协议栈Protocol Stack

在这里插入图片描述

3.9 Controller

3.9.1 PHY

3.9.2 LL
它是协议栈的硬实时约束层,因为它必须符合规范中定义的所有时序要求。
鉴于LL执行的许多计算在计算上都是消耗时间资源的,因此通常在硬件中自动实现功能,以避免使运行堆栈中所有软件层的中央处理器(CPU)过载,因此LL的实现需要结合使用自定义 硬件和软件 。
LL提供的功能通常包括:前同步码,访问地址和空中协议成帧,CRC生成和验证,数据白化,随机数生成以及AES加密。
通常通过隐藏这种复杂性及其实时要求的接口将其与协议栈的高层隔离。

设备只能处于以下五个状态之一:待机,通告,扫描,启动或连接,如下图所示:
在这里插入图片描述
广告商无需连接就可以传输数据,而扫描仪则在监听广告商。启动器是使用连接请求响应广告商的设备。如果广告商接受,则广告商和发起者都将进入连接状态。当设备处于连接状态时,它将以以下两种角色之一进行连接:主设备或从设备。通常,发起连接的设备将是主设备,发布其可用性并接受连接的设备将是从设备。因此,链路层定义了以下角色:
●Advertiser:发送广告包的设备。
●扫描器:一种扫描广告数据包的设备。
●主设备:启动连接(发起方)并在以后进行管理的设备。
●从设备:一种接受连接请求并遵循主机时间的设备。
从逻辑上讲,这些角色可以分为两对:广告客户和扫描程序(不在活动连接中时)和主角色和从属角色(在连接中时)。

###3.9.2.1 Bluetooth Device Address
蓝牙设备地址是蓝牙设备的主要标识符,类似于以太网媒体访问控制(MAC)地址用于网络设备的地址。 它是一个48位(6字节)数字,可唯一标识对等设备中的设备。 设备地址有两种,一种设备可以获取一种或两种:
公用设备地址
这也等同于BR / EDR设备中使用的固定的,工厂编程的设备地址。 它必须在电气和电子工程师协会(IEEE)注册机构中注册,并且在设备的整个使用期限内都不得更改。
随机设备地址
该地址可以预先编程,也可以在设备运行时动态生成。 在许多用例中,此类地址在BLE中很有用。

###3.9.2.2 Advertising and Scanning
BLE规范仅允许一种数据包格式和两种类型的数据包,即广告数据包和数据数据包。广告数据包用于两个目的,特别是为了:
○广播不需要完全连接建立开销的应用程序的数据
○发现奴隶并与他们联系
数据包以双向方式用于主设备和从设备之间的用户数据传输。最后,链路层充当可靠的数据载体,因为所有接收到的数据包均根据24位循环冗余校验(CRC),并且当错误检查机制检测到传输失败时,将安排重传。 由于没有预定义的重传上限,因此链路层将不断重发数据包,直到最终被接收方确认为止。

###3.9.3 HCI– Controller side

3.10Host

###3.10.1 HCI– Host Side

###3.10.2 L2CAP
逻辑链路控制和适配协议(L2CAP)层为上层提供数据封装服务,从而允许使用数据传输进行逻辑端到端通信。从本质上讲,它用作协议多路复用器,从上层获取多个协议并将其封装为标准BLE数据包格式,反之亦然。 L2CAP还负责包装的分段和重新组装。在此过程中,源自发送方上层的大数据包将装入BLE数据包的最大27字节有效负载大小。反向过程发生在接收端,在这里,分段的较大的上层数据包由多个较小的BLE数据包重新组合,并向上游发送到适当的较高层实体。
L2CAP层负责路由两个主要协议:属性协议(ATT)和安全管理器协议(SMP)。此外,L2CAP可以创建自己的用户定义通道来进行高通量数据传输,这一功能称为“基于LE信用的流量控制模式”。
个人理解这层就是数据封装,大小包的拆包组包,但是并不解析数据。

###3.10.3 ATT
ATT层使BLE设备可以将某些数据(称为属性)提供给另一个BLE设备。 在ATT的上下文中,公开属性的设备称为服务器,而对这些属性感兴趣并使用它们的对等设备称为客户端(the device exposing attributes is referred to as the server, and the peer device interested and working with these attributes is referred to as the client.)。 设备的链路层状态(主设备或从设备)独立于设备的ATT角色。 例如,主设备可以是ATT服务器或ATT客户端,而从设备也可以是ATT服务器或ATT客户端。 设备也可能同时是ATT服务器和ATT客户端。

本质上,ATT是基于设备提供的属性的简单客户端/服务器无状态协议。 客户端从服务器请求数据,服务器将数据发送到客户端。 该协议是严格的,意味着在请求挂起的情况下(即,对于已发出的请求尚未收到响应),在接收到响应并进行处理之前,无法提交其他请求。 在两个对等方同时充当客户端和服务器的情况下,这独立地适用于两个方向。

每个ATT服务器都包含以属性形式组织的数据,每个属性都分配有一个16位的属性句柄,称为通用唯一标识符(UUID),一组权限以及最后一个值。实际上,属性句柄仅仅是用于访问属性值的标识符。 UUID指定值中包含的数据的类型和性质。 当客户端想要从服务器读取属性值或向服务器写入属性值时,它会使用属性句柄向服务器发出读取或写入请求。服务器将使用属性值或确认进行响应。 对于读取操作,由客户端根据属性的UUID解析值并了解数据类型。 另一方面,在写操作期间,期望客户端提供与属性类型一致的数据,如果不是这种情况,则服务器可以自由拒绝该操作。

which is assigned a 16-bit attribute handle, called Universally Unique Identifier (UUID), a set of permissions, and finally a value.
理解,这个ATT就是查看一个属性?里面提到a value,也就是单个value。所以传输数据量不行?
in case of a pending request, (i.e. no response yet received for an already issued request), no further requests can be submitted until the response is received and processed.
另,这个ATT的请求会被pending挂起,会阻塞新进来的请求,这样好像不适应我想做的事情。

###3.10.4 SM
安全管理器(SM)层定义了配对和密钥分发的手段,并为协议栈的其他层提供了功能,以安全地连接和交换与另一个BLE设备的数据。它同时包含一个协议和一系列安全算法,旨在为BLE协议栈提供生成和交换安全密钥的能力,以允许对等方通过加密的链路安全地进行通信,以信任远程设备的身份。 ,如果需要,可以隐藏公共蓝牙地址。它定义了两个角色:
●发起方:始终对应于链路层master
●响应者:始终对应于链路层slave

此外,它为以下三个过程提供支持:
●配对:生成和操作安全加密密钥的过程,以使设备能够切换到安全的加密链接。该密钥是临时密钥,不存储或不可用于后续连接。
●绑定:配对的顺序,接着是生成和交换永久性安全密钥,通常将其存储在非易失性存储器中,因此允许在两个设备之间创建永久性绑定,这将使它们能够快速在其中建立安全链接。后续连接,而无需再次执行绑定过程。
●加密重建:绑定过程完成后,密钥可能已存储在连接的两侧。如果已存储加密密钥,则此过程定义如何在后续连接中使用那些密钥来重新建立安全的加密连接,而无需再次执行配对(或绑定)过程。

因此,配对可以创建仅在连接的整个生命周期中都持续存在的安全链接,而绑定实际上以共享安全密钥的形式创建了永久关联(也称为绑定),将在以后的连接中使用,直到双方决定删除为止 他们。 某些文档和API有时会使用术语“绑定”而不是简单的绑定,因为绑定过程之前总是包含一个配对阶段。

尽管始终由发起者来触发特定安全过程的开始,但是响应者可以异步请求开始上述任何过程。但是,对于响应者,不能保证发起者实际上会遵守该请求,从而使请求呈现为更多的可选请求,而不是绑定请求。 从逻辑上讲,此安全请求只能由连接的从属设备或外围设备发出。

###3.10.5 Application应用
与所有其他类型的系统一样,该应用程序位于最高层,并且负责包含与该应用程序实现的实际用例相关的所有内容的逻辑,用户界面和数据处理。 应用程序的体系结构高度依赖于每个特定的实现,并且在BLE中,它通常使用BLE配置文件提供的功能。

3.11 DA1458X片上系统资源介绍

略。

3.11.2 ARM Cortex-M0 CPU
它使用了一个称为Thumb的指令集,该指令集是在ARM7TDMI处理器中首次引入并受其支持的。 但是,还包括一些来自ARMv6架构的较新指令以及一些Thumb-2技术的指令。
Thumb-2中设置的指令包括16位和32位指令。 C编译器生成的大多数指令都使用16位指令,而当16位版本无法执行所需的操作时,将使用32位指令。
从学术上讲,Cortex-M0处理器被归类为load-store架构,因为它具有用于读取和写入存储器的独立指令以及用于使用寄存器的算术或逻辑运算的指令。
Interrupts can have four different programmable priority levels.

3.11.3.1 ROM
This is an 84 kB ROM containing the Bluetooth Low Energy protocol stack as well as the boot code
sequence.
ROM已经放的就是蓝牙协议栈了,还有就是启动顺序。
所以用户代码就别打ROM这里主意了,老老实实放在OTP。

3.11.6.2 Wake-Up Timer
它具有监视GPIO状态变化的功能,同时实现从0 ms到63 ms的去抖动时间。
这个timer不仅仅是定时,还监测IO状态,后续仔细看看怎么用。
It accumulates external events and compares their number to a programmed value, and generates an interrupt to the CPU.
这个类似针对外部IO翻转的计数,满足计数后触发timer,所以猜测这个timer是个计数器模式

3.11.7 Clock and Reset
高定平复位。

3.11.9.3 DA14583
This offers you to the developer the flexibility of Software Upgrades Over The Air (SUOTA), enabling devices that are upto-date in the field.
带片内flash,方便做OTA升级。
当然,14580+外部flash方案也可以做OTA。

本小节完,继续看下一节。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值