与STM32相关的各种外设、通信协议、

通信

RS485\串口UART

UART:(Universal Asynchronous Receiver Transmitter:通用异步收发器/异步串行通信口),是一种通用的串行数据总线,用于异步通信,支持全双工。

它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。

485通信为异步通信:收发不能同时进行;由485通信芯片的一个管脚控制接收或者发送模式

CAN

CAN 是 Controller Area Network 的缩写(以下称为 CAN),

显性电平对应逻辑 0, CAN_H 和 CAN_L 之差为 2 V 左右。而隐性电平对应逻辑 1, CAN_H 和 CAN_L 之差为 0V。

在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。

CAN协议经过ISO标准化后有两个标准ISO11898标准和IS011519-2标准。

CAN协议的基本概念包括数据帧、报文、标识符、控制域、数据域、CRC校验等。

其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准(闭环),

而IS011519-2是针对通信速率为125Kbps以下的低速通信标准(开环)。

  数据帧是在 CAN 通讯中最主要、最复杂的报文,它以一个显性位(逻辑 0)开始,以 7 个连续的隐性位(逻辑 1)结束。在它们之间,分为仲裁段、控制段、数据段、CRC 段和 ACK 段,以标准数据帧为例。

CAN数据帧标准格式
域段域段名位宽:bit描述
帧起始SOF(Start Of Frame)1数据帧起始标志,固定为1bit显性('b0)
仲裁段Identify(ID)11本数据帧的 ID 信息, ID 信息的作用:① 如果同时有多个节点发送数据时,作为优先级依据(仲裁机制);② 目标节点通过 ID 信息来接受数据(验收滤波技术)
RTRRemote Transmission Request BIT1RTR标识是否是远程帧(0,数据帧;1,远程帧),在数据帧里这一位为显性('b0)
IDEIdentifier Extension Bit1IDE用于区分标准格式与扩展格式,在标准格式中 IDE 位为显性(‘b0),在扩展格式里 IDE 位为隐性(’b1)
R0保留位11bit保留位,固定为1'b0
DLCdata length4由 4 位组成,MSB 先行(高位先行),它的二进制编码用于表示本报文中的数据段含有多少个字节,DLC 段表示的数字为0到8,若接收方接收到 9~15 的时候并不认为是错误
数据段data0~64据帧的核心内容,它由 0~8 个字节(0 ~ 64位)组成,MSB 先行
CRC段CRC15段用于检查帧传输错误,发送方以一定的方法计算包括:帧起始、仲裁段、控制段、数据段;接收方以同样的算法计算 CRC 值并进行比较,如果不同则会向发送端反馈出错信息,重新发送;计算和出错处理一般由 CAN 控制器硬件完成或由软件控制最大重发数。
CRC界定符1CRC 界定符(用于分隔的位),为隐性位(1'b1),主要作用是把CRC 校验码与后面的 ACK 段间隔起来
ACK 槽ACK slot1在 ACK 槽位中,发送端发送的为隐性位,而接收端则在这一位中发送显性位以示应答;发送 ACK/返回 ACK这个过程使用到回读机制,即发送方先在 ACK 槽发送隐性位后,回读到的总线上的电平为显性0,发送方才知道它发送成功了,不用重发
ACK界定符1在 ACK 槽和帧结束之间由 ACK 界定符间隔开,为隐性位
帧结束EOF7由发送端发送 7 个隐性位表示结束

报文信息:0 000101 00010  0 0 0 0001 0101 1000 XXXXXXXXXXXXXXX 1 1 1111111
通过总线发送时,在ID信息发送阶段,只有节点2才能收到总线上的数据,因为节点3的验收滤波ID表中没有节点1的ID号。
在报文发送到ACK槽时,会等待并回读节点2的反馈,从节点2的角度看,此时总线为空闲状态,当验证CRC正确,则向总线发送显性电平,接着当节点1回读到显性电平,才会继续发送剩下的EOF。
 

实际难以达到最大距离

CAN1可用0-13,CAN2可用14-27

IIC总线

I2C总线是一种简单、双向二线制同步串行总线。

它只需要两根线即可在连接于总线上的器件之间传送信息。

SPI总线

SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线。

接线:反接

SC:片选

lwIP以太网

MAC:数据链路层

PHY:物理层

RMII、MII:网络接口、介质独立接口

ETH 内部自带专用的 DMA 控制器用于 MAC,ETH 支持两个工业标准接口介质独立接口(MII)和简化介质独立接口(RMII)用于与外部 PHY 芯片连接。MII 和 RMII 接口用于 MAC 数据包传输,ETH 还集成了站管理接口(SMI)接口专门用于与外部 PHY 通信,用于访问 PHY 芯片寄存器。
 

RMII: Reduced Medium Independent Interface,RMII 接口是 MII 接口的简化版本,MII 需要 16 根通信线,RMII 只需 7 根通信,在功能上是相同的。对于 RMII 接口,一般需要外部直接提供 50MHz 时钟源,同时接入 MAC 和 PHY。需与MAC层时钟一致,通常从 MAC 层获取该时钟源。现在一般都用RMII模式。
 

TCP/IP 协议栈的封包和拆包也是一个非常重要的知识,如以太网设备发送数据和接收数据的处理流程是怎么样的?这个问题涉及到 TCP/IP 协议栈对数据处理的流程,该流程称之为“封包”和“拆包”。“封包”是对发送数据处理的流程,而“拆包”是对接收数据处理的流程,
如下图所示

上图中,发送端发送的数据自顶向下依次传递。各层协议依次在数据前添加本层的首部且设置本层首部的信息,最终将处理后的 MAC 帧递交给物理层转成光电模拟信号发送至网络,
这个流程称之为封包流程。

上图中,当帧数据到达目的主机时,将沿着协议栈自底向上依次传递。各层协议依次根据帧中本层负责的头部信息以获取所需数据,最终将处理后的帧交给应用层,

这个流程称之为拆包的过程。


lwIP

是 Light Weight(轻型) IP 协议,有无操作系统的支持都可以运行。 lwIP 实现的重点是在保持 TCP/IP 协议主要功能的基础上减少对 RAM 的占用,它只需十几 KB 的 RAM 和 40K左右的 ROM 就可以运行,这使 lwIP 协议栈适合在低端的嵌入式系统中使用。

lwIP 的设计理念下,既可以无操作系统使用,也可以带操作系统使用既可以支持多线程,也可以无线程。它可以运行在 8 位以及 32 位的微处理器上,同时支持大端、小端系统。


 

以太网接入 MCU 方案


以太网接入方案一般分为两种,它们分别为全硬件 TCP/IP 协议栈和软件 TCP/IP 协议栈。
➢ 软件 TCP/IP 协议栈以太网接入方案
这种方案由 lwIP+ MAC 内核+PHY 层芯片实现以太网物理连接,如正点原子的探索者、阿波罗、北极星以及电机开发板都是采用这类型的以太网接入方案,该方案的连接示意图如下图所示

➢ 硬件 TCP/IP 协议栈以太网接入方案
所谓全硬件 TCP/IP 协议栈是将传统的软件协议 TCP/IP 协议栈用硬件化的逻辑门电路来实现。芯片内部完成 TCP、 UDP、 ICMP 等多种网络协议,并且实现了物理层以太网控制

( MAC+PHY)、内存管理等功能,完成了一整套硬件化的以太网解决方案。

该方案的连接示意图如下图所示:

        总的来说:全硬件 TCP / IP 协议栈简化传统的软件 TCP / IP 协议栈,卸载了 MCU 用于处理  TCP / IP 这部分的线程,节约 MCU 内部 ROM 等硬件资源,工程师只需进行简单的套接字编程和少量的寄存器操作即可方便地进行嵌入式以太网上层应用开发,减少产品开发周期,降低开发成本。

配置

RMII接口中不包含复位引脚,还需要单独配置一个ETH_RESET引脚对PHY芯片进行硬件复位。

数据流动路径

  • 在进行数据发送时,先将数据由存储器以 DMA 传输到发送 TX FIFO 进行缓冲,然后由 MAC 内核发送
  • 接收数据时,RXFIFO 先接收以太网数据帧,再由 DMA 传输至存储器

主要关心的就是两层——MAC层和PHY层。

首先看自己手上的STM32芯片,众所周知,STM32中有众多外设,而涉及到网络的一个关键的外设就是“ETH”,比如F103就没有,而F407就有,有没有这个外设决定了你需要选购怎样一个PHY层芯片。

如果你的STM32中集成了ETH外设,那么恭喜你,你的芯片可以通过 DMA 控制器进行介质访问控制(MAC) 实现 MAC 层的任务,通过 ETH 外设可以按照 IEEE 802.3-2002 标准发送和接收 MAC 数据包。简单来说,你的STM32中是有MAC层的,你只需要搭配一个PHY层的芯片就可以了,例如DP83848或者LAN8742(LAN8720)。而你可以通过RMII或者MII来连接STM32MAC层和PHY层芯片。(注意LAN8742系列芯片只支持RMII)

如果很不幸你的芯片没有集成以太网外设,那你可以购买W5500,这个芯片同时集成了MAC层和PHY层的功能,MAC层数据通过SPI传输进STM32芯片。
 

FATFS


FATFS 是一个完全免费开源的 FAT/exFAT 文件系统模块,专门为小型的嵌入式系统而设计。

只需做简单的修改就可以移植到 8051、 PIC、 AVR、 ARM、 Z80、 RX 等系列单片机上。它支持 FATl2、 FATl6 和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优化。

FATFS 的特点有:
⚫ Windows/dos 系统兼容的 FAT/exFAT 文件系统
⚫ 独立于硬件平台,方便跨硬件平台移植
⚫ 代码量少、效率高
⚫ 多种配置选项
 支持多卷(物理驱动器或分区,最多 10 个卷)
 多个 ANSI/OEM 代码页包括 DBCS
 支持长文件名、 ANSI/OEM 或 Unicode
 支持 RTOS
 支持多种扇区大小
 只读、最小化的 API 和 I/O 缓冲区等
 新版的 exFAT 文件系统, 突破了原来 FAT32 对容量管理 32Gb 的上限, 可支持更巨
大的存储
 

SD卡

SDIO

SDIO是安全数字输入输出接口(Secure Digital Input and Output)的缩写,是从SD内存卡接口的基础上演化出来的一种外设接口。SDIO接口兼容以前的SD内存卡,并且可以连接支持SDIO接口的设备。SDIO的应用比较广泛,目前,有许多手机都支持SDIO功能,并且很多SDIO外设也被开发出来,使得手机外接外设更加容易。常见的SDIO外设有WLAN、GPS、CAMERA、蓝牙等。SDIO总线有两端,其中一端是主机端(HOST),另一端是设备端(DEVICE)。所有的通信都是由HOST端发出命令开始的,在DEVICE端只要能解析HOST的命令,就可以同HOST进行通信了。SDIO的HOST可以连接多个DEVICE。sdio通常工作在25mhz或50mhz的时钟下。

信号

SDIO信号有三种模式,“单线模式”、“4线模式”、“SPI模式”。

CLK:HOST给DEVICE的时钟信号。

VDD:电源信号。

VSS:Ground信号。

DAT0-DAT3:4条数据线

CMD:用于HOST发送命令和DEVICE回复响应。

DMA

协议

Modbus 

调试工具

点击名称链接,跳转至使用详解。

Modbus Slave是一个模拟Modbus协议从机的上位机软件,主要用于模拟测试跟其他主机设备通信的过程。

Modbus Poll是一个模拟Modbus协议主机的上位机软件,主要用于模拟测试跟其他从机设备通信的过程。

Modbus RTU

在MODBUS RTU模式中,消息帧之间的最小间隔时间是3.5字符的时间(具体时间由串口比特率及单个字符包含的位数决定,如比特率为9600bits/s,单个字符包含1个起始位,8个数据位,0个校验位,1个停止位,则最小间隔时间具体值t3.5=1/9600*(1+8+0+1)*3.5≈3.65ms)。
 

Modbus RTU 协议的应用程序都将有一个 Modbus 主站和至少一个 Modbus 从站。

1、读取多个寄存器数据

主机发送:

ID功能码起始地址读取寄存器个数校验码
010300 0000 02

接收:(从机返回)

ID功能码返回字节数地址1地址2...校验码
0103 0400 0000 01...

2、写入一个寄存器数据

ID功能码寄存器地址写入数据校验码
0106

接收:(从机返回)

ID功能码寄存器地址写入数据校验码
0106

3、写入多个寄存器数据

ID功能码起始地址寄存器长度字节个数数据内容校验码
010x1000 0000 0510个10个字节

接收:(从机返回)

ID功能码起始地址寄存器个数校验码
010x1000 0000 05

Modbus TCP

ModbusTCP循环读写循环写入的间隔时间不宜过短,200ms为好。

CANopen

CANopen数据帧格式

CANopen的数据帧格式如下图所示。
在这里插入图片描述
每个CANopen帧都以COB-ID开头,COB-ID是数据帧的唯一标识符,DLC表示传输多少个字节数据,Data表示传输的数据,最多8个字节。

CANopen通讯模型主要定义3种通讯协议,分别为NMT协定,服务数据对象SDO协定,过程数据对象PDO协定。

Byte0是控制字符,简单理解就是要进行什么操作,读的数据长度是多少。当应答是时候,Byte0也是控制字符。

Byte1 Byte2对象地址,地址都是两个byte的,发送的时候需要分开,低位地址在前,高位地址在后。Byte3是子索引地址,如果当前对象没有分子索引的则填0x00。Byte4-7在读的时候是没有意义的,全部填0x00即可。

        应答的时候Byte1-3是和发送出去的指令一样的,Byte4-7就是读取回来的数据,同样也是低字节在前,高字节在后,低字在前,高字在后。

SDO通讯写入数据和读取数据差不多,如图3-4所示,也是询问之后再应答的模式。指令中Byte0的含义参见图3-3,写入数据长度不同则操作码不同。Byte4-7是要写入的数据,同样也是低字节在前,高字节在后,低字在前,高字在后。

        应答的时候Byte0是0x60,且Byte4-7如果全部都是0x00,则表示写入数据成功,没有错误。反之则Byte0是0x80,Byte4-7则是报错的代码,没有写入成功,错误码的具体含义请参附录B,Byte1-3的含义还是对应的对象和索引地址。

canfestival中记录数据和映射的关系的文档叫做字典.

字典是canopen中最重要的定义. 

##连接符.连接符的作用就是吧##前后的两个东西合到一起, 

在canfestival中,所有源代码可以分为四大部分,分别是目标接口、CAN接口、canfestival库文件以及主从节点的应用。其中,canfestival库文件是整个协议的核心,包括调度管理,节点管理(对象字典访问objacces.c、状态机state.c),CANopen协议(服务数据对象sdo.c、过程数据对象pdo.c、同步对象sync.c、自动波特率对象lss.c、网络管理对象nmtMaster.c和nmtSlave.c)。这些文件在移植时是不需要修改的。主/从节点的应用包括节点状态反馈和设备对象字典的定义,目标接口包括节点硬件的驱动以及对于操作系统的接口,这也是进行移植时主要修改的对象。
 

主要看几个地方

0x1000-0x1029主要是通信参数,配置同步、心跳、节点守护等。

0x1200-0x12FF配置的是主机/从机的SDO参数,我们使用的是主机,因此要配置从机(客户端)的SDO,如下图所示,我配置了7个客户端,每一个配置有TSDO的COB ID、RSDO的COB ID和节点号,例如SDO1号配置TSDO的COB ID为0X601,RSDO的COB ID为0X581,节点号为1,那么SDO2号配置TSDO的COB ID为0X602,RSDO的COB ID为0X582,节点号为2,因此在使用SDO进行通信的时候,CAN主机发送的ID为0x60x,从机返回的ID为0x58x,x代表了几号从设备。

 0x1400-0x15FF为RPDO的参数配置,下图为我配置好的参数,RPDO1号的COB ID为0x181,同步类型为非同步,inhibit time抑制时间为0,Compatibity Entry兼容性条目为0,Event Timer 事件时间为0,SYNC start value 同步开始值为0,以上为0均为非使能,具体参数意义大家自己查阅,因为我也一知半懂。。。。。

其余的RPDO按如此配置,COB ID为0x18x即可。

 0x1600-0X17FF是RPDO的参数映射,我当前控制的是电机设备,遵循CIA402的协议。

当前映射了状态字、实际速度、错误码三个值,状态字占用16位,实际速度占用32位,错误码占用16位,总共64位数据,根据CAN2.0的协议,数据位不超过64位即8个字节,因此我们最多配置8个字节在这个映射上,如果要配置多个参数,暂时还未找到解决方法。

配置的值例如status_word的地址是0x2004,这个0x2004是自己添加的一个参数,比如状态字的原始词典(CIA402)是0x6041,在代码中对0X6041通过SDO写入到从机的TXPDO上,后续有说明,这里只是定义了主机接收到0X181这个ID的数据代表的含义,这边配置的是8个字节,前两个字节代表状态字,中间四个字节代表了实际速度,最后两个字节代表的是错误码

首先回顾一下PDO的通信参数

不论是TPDO还是RPDO都有通信参数和映射参数两种参数,通信参数有如下六种:

subindexnametype
0x01COB IDUNSIGNED32
0x02Transmission TypeUNSIGNED8
0x03Inhibit TimeUNSIGNED16
0x04Compatibility EntryUNSIGNED8
0x05Event TimeUNSIGNED16
0x06SYNC start valueUNSIGNED8

这里先解释一下这六个参数是什么意思吧。
1.COB ID就不用过多解释了,简单来理解就是,通过COB ID可以让CAN节点知道,这一帧报文属于PDO、SDO、NMT、SYNC还是其他。
2.Transmission Type表示PDO的通信类型,有同步、异步、周期、非周期等,具体见《CANopen high-level protocol for CAN-bus》的Table3。取值范围是0~255,取值定义的源码如下:

/** definitions of the different types of PDOs' transmission* * SYNCHRO(n) means that the PDO will be transmited every n SYNC signal.*/
#define TRANS_EVERY_N_SYNC(n) (n) /*n = 1 to 240 */
#define TRANS_SYNC_ACYCLIC    0    /* Trans after reception of n SYNC. n = 1 to 240 */
#define TRANS_SYNC_MIN        1    /* Trans after reception of n SYNC. n = 1 to 240 */
#define TRANS_SYNC_MAX        240  /* Trans after reception of n SYNC. n = 1 to 240 */
#define TRANS_RTR_SYNC        252  /* Transmission on request */
#define TRANS_RTR             253  /* Transmission on request */
#define TRANS_EVENT_SPECIFIC  254  /* Transmission on event */
#define TRANS_EVENT_PROFILE   255  /* Transmission on event */
123456789101112

3.Inhibit Time表示PDO发送的最小时间间隔,避免发送频率太快,总线负载太大,单位是100us。
4.Compatibility Entry这个不知道是啥,文档里面都没提到,先不管。
5.Event Time如果是定时发送PDO,那么这个参数表示的定时时间,如果这个参数为0,那么表示事件触发发送PDO,单位是ms。
6.SYNC start value同步起始值。当PDO为同步发送时,比如Transmission Type=10,那么收到10个同步包后才发送PDO,如果SYNC start value=2,那么刚开始时收到2个同步包就开始发送PDO,之后就按10个同步包发送。

快速SDO





理论

TPDO可以理解从站把数据上传给主站,RPDO可以理解为主站把数据写入从站。TPDO和RPDO各4个,有各自对应的COB-ID,如表3-1所示

RPDO1中映射了3个对象,分别是控制字、目标位置、运行模式,我只需要一条指令就可以一次把这三个对象都写入数据,

PDO有三种触发方式,分别同步触发、远程帧触发和异步触发。

心跳

 网络状态管理有如下这几种功能,启动远程节点,停止远程节点,重置节点,重置通讯,进入Pre-OP也就是预运行模式。

功能

COB-ID

Byte0

Byte1

描述

进入Pre-OP

0

0x80

0

总线上所有节点进入Pre-op

0

0x80

n

n表示具体站号(下同),指定的站号进入Pre-op

重置通讯

0

0x82

0

总线上所有节点重置通讯

0

0x82

n

指定的站号重置通讯

重置节点

0

0x81

0

总线上所有节点重启

0

0x81

n

指定的站号重启

启动远程节点

0

0x01

0

总线上所有节点启动

0

0x01

n

指定的站号启动

停止远程节点

0

0x02

0

总线上所有节点停止

0

0x02

n

指定的站号停止

 这里列举了几个模式的常用控制指令,使能的开和关都是一样的,其他模式的可以参考对应厂家的使用手册,基本是一样的,有区别的可能是有特殊功能定义。

序号

控制模式

对象字典

功能

描述

1

规划位置模式

0X6040-00

0X06

使能设备

0X0F

0X1F

开始运动

绝对

0X3F

绝对立即

0X7F

相对

0X5F

相对立即

0X10F

停止运动

正常减速

0X0B

急停

2

回零模式

0X6040-00

0X1F

开始回零

0X11F

停止回零

3

规划速度模式

0X6040-00

0X00F

开始运动

0X10F

停止运动

4

清除错误

0X6040-00

0X80

清除错误

比较

TCP和UDP区别

TCP(传输控制协议)和UDP(用户数据报协议)是互联网协议族中的两个重要传输层协议。

1. TCP工作原理:

TCP是一种面向连接的协议,通过三次握手建立可靠的连接。发送端将数据分割成多个TCP段,并通过IP进行传输。接收端接收到TCP段后进行重组,并通过确认机制确保数据的可靠性。TCP还使用拥塞控制和流量控制机制来保证网络的稳定性。

2. UDP工作原理:

UDP是一种无连接的协议,数据以数据报的形式独立发送。发送端将数据打包成UDP数据报并通过IP进行传输,接收端接收到数据报后直接提取数据。UDP不提供可靠性保证和拥塞控制机制,因此传输速度较快。

 TCP特点与优缺点:

- 特点:

- 可靠性:TCP保证数据的可靠传输,通过重传机制和确认机制避免数据丢失或损坏。

- 顺序性:TCP保证数据按照发送的顺序进行传输,接收端可以按照相同顺序重组数据。

- 流量控制:TCP使用滑动窗口机制来控制发送端的数据量,避免接收端缓冲区溢出。

优点:

- 可靠性高:通过重传和确认机制保证数据的可靠性,适用于对数据完整性要求高的应用场景。

- 顺序性强:保证数据按照发送顺序传输,适用于需要按序处理的应用场景。

- 缺点:

- 开销大:TCP需要建立连接、维护状态和进行确认,占用较多的网络资源。

- 传输速度相对较慢:由于提供可靠性保证,TCP的传输速度相对较慢。

UDP特点与优缺点:

- 无连接:UDP不需要进行连接的建立和维护,数据报独立发送。

- 无可靠性保证:UDP不提供重传和确认机制,数据传输不可靠。

- 传输速度快:由于无需建立连接和提供可靠性保证,UDP传输速度较快。

- 传输速度快:无需建立连接和提供可靠性保证,适用于实时性要求较高的应用场景。

- 开销小:UDP不需要维护连接状态和进行确认,占用较少的网络资源。

- 不可靠性高:由于无重传和确认机制,数据传输可能丢失或损坏。

- 顺序性差:UDP数据报独立发送,接收端无法保证数据按照发送顺序接收。

结论:

TCP和UDP是两种不同的传输协议,适用于不同的应用场景。TCP提供可靠性和顺序性,适合数据完整性要求高、顺序处理的应用;而UDP提供快速传输和较低的开销,适用于实时性要求高、对数据可靠性要求较低的应用。根据具体需求和应用场景的不同,选择适合的协议可以提高网络性能和用户体验。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛋蛋的学习记录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值