Linux入门第二部分(ARM裸机篇) 第七章 NXP官方SDK的使用

嵌入式Linux SDK深度解析:NXP Layerscape平台开发实战与性能调优 嵌入式Linux系统开发是构建智能设备与边缘计算节点的核心技术,其核心在于通过板级支持包(BSP)实现硬件与操作系统的无缝对接。其工作原理涉及从引导加载程序、Linux内核到用户空间软件栈的完整分层架构,确保了硬件资源的高效管理与调度。该技术的核心价值在于为开发者提供了一个经过深度集成与验证的软件平台,大幅降低了从零构建稳定系统的复杂性与风险,尤其在网络处理、数据平面加速和安全启动等场景中至关重要。本文以NXP Layerscape SDK(LSDK)为例,深入探讨其如何通过集成U-Boot、DPDK等关键 阅读详情

参考教程:
正点原子【第二期】手把手教你学Linux之ARM(MX6U)裸机篇_哔哩哔哩_bilibili

一、SDK移植

1、SDK包说明

(1)在上一章进行驱动开发时,外设寄存器组结构体需要自己根据数据手册定义,当寄存器的数量越来越多时,这种开发方式就显得非常低效了。

(2)NXP官方其实提供了一个SDK包,包内有所有寄存器的定义,程序员在开发的时候,可以直接将包内的定义移植到工程中,这样就不需要重复定义了。

(3)SDK包可直接在NXP官网下载。

2、SDK包移植方式

(1)在NXP官网上下载的是一个.exe可执行程序,运行它之后,可以在指定目录生成所需要的配置文件,如下图所示。

(2)SDK包中有非常多的文件,如果只是针对裸机开发,那么真正有用的文件只有如下3个:

①fsl_common.h:位置为SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_common.h

②fsl_iomuxc.h: 位置为SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_iomuxc.h

③MCIMX6Y2.h: 位置为SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\MCIMX6YH2.h

(3)以上三个文件中的内容仍然非常冗余,对于裸机开发,只需要保留IOMUXC引脚复用、PAD配置结构体及宏定义、GPIO等外设寄存器结构体和地址宏,其余内容(如CMSIS、SDK驱动、多芯片兼容代码、无关及缺失的头文件等)全部删除,由于改动的代码量较大,此处不详细展开。

二、程序编写与验证

1、启动配置文件编写

在Board_Drivers文件夹中新建文件夹“4_ledc_sdk”,然后将上一章的start.s文件拷贝至该文件夹中

2、外设配置文件编写

(1)在文件夹4_ledc_sdk中新建cc.h文件,里面存放一些SDK库文件需要使用到的数据类型别名,内容如下:

#ifndef __CC_H
#define __CC_H

#define     __I     volatile 
#define     __O     volatile 
#define     __IO    volatile
 
typedef   signed          char int8_t;
typedef   signed short     int int16_t;
typedef   signed           int int32_t;
typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;
typedef unsigned long     long uint64_t;
typedef   signed char          s8;      
typedef   signed short    int  s16;
typedef   signed int           s32;
typedef   signed long long int s64;
typedef unsigned char          u8;
typedef unsigned short int     u16;
typedef unsigned int           u32;
typedef unsigned long long int u64;
 
#endif

(2)将上一小节提到的3个SDK包中的文件拷贝到文件夹4_ledc_sdk中,并做裁剪(裁剪的具体内容这里不详细展开)。

(3)原本cc.h文件中的定义在标准库stdint.h文件中已有实现,但裸机工程在编译时带参数“-nostdlib”,不链接C标准库,所以需要另行定义,并在SDK文件中原本包含stdint.h的地方包含cc.h文件。

3、C语言点灯程序编写

(1)将上一章的main.c文件拷贝至该文件夹中,因为点灯的业务代码和LED外设初始化的代码与上一章在功能上基本等价,只是初始化寄存器所调用的接口有变化。

(2)修改main.c文件中的内容:

①包含的头文件需要替换为:

#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "MCIMX6Y2.h"

②LED的初始化函数需要更改,使用SDK提供的函数和宏完成GPIO初始化:

/*
 * @description : 初始化 LED 对应的 GPIO
 * @param : 无
 * @return : 无
 */
void led_init(void)
{
    /* 1、初始化 IO 复用, 复用为 GPIO1_IO03 */
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);

    /* 2、配置 GPIO1_IO03 的 IO 属性 
     *bit 16:0 HYS 关闭
     *bit [15:14]: 00 默认下拉
     *bit [13]: 0 kepper 功能
     *bit [12]: 1 pull/keeper 使能
     *bit [11]: 0 关闭开路输出
     *bit [7:6]: 10 速度 100Mhz
     *bit [5:3]: 110 R0/6 驱动能力
     *bit [0]: 0 低转换率
    */
    IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0X10B0);

    /* 3、初始化 GPIO, GPIO1_IO03 设置为输出 */
    GPIO1->GDIR = 0X0000008;
    
    /* 4、设置 GPIO1_IO03 输出低电平,打开 LED0 */
    GPIO1->DR &= ~(1 << 3); 
}

(3)两个SDK初始化配置函数说明:

①IOMUXC_SetPinMux函数用于设置引脚的复用功能,其函数参数定义如下所示(按定义顺序说明)。

参数名

用途

muxRegister

IO引脚MUX寄存器地址

muxMode

IO复用值,也就是ALT值,决定该引脚复用何种功能

inputRegister

外设输入IO选择寄存器地址(IO复用为某个功能时可能需要设置外设多路输入IO选择寄存器,如串口RX功能,需要选择数据输入源)

inputDaisy

外设输入IO选择寄存器配置值(不配置或者是配置为输出引脚,则写0)

configRegister

未使用参数

inputOnfield

IO软件输入使能标志

②IOMUXC_SetPinConfig函数用于设置引脚的电气属性。

参数名

用途

muxRegister

未使用参数

muxMode

未使用参数

inputRegister

未使用参数

inputDaisy

未使用参数

configRegister

IO引脚PAD寄存器地址

configValue

IO引脚PAD寄存器配置值

③这两个函数都有6个函数参数,但SDK提供的宏定义已经将IO引脚复用寄存器地址、复用值、外设输入IO寄存器地址、外设输入IO寄存器配置值、IO配置寄存器地址这5个参数集成在一起了。

[1]对上层来说,使用IOMUXC_SetPinMux函数,只需要指定想要配置的引脚功能和引脚的IO软件输入使能与否,SDK就能精确匹配要操作的MUX寄存器的地址,并将配置值写入。

[2]对上层来说,使用IOMUXC_SetPinConfig函数,只需要指定想要配置的引脚功能和要写入寄存器的值,SDK就能精确匹配要操作的PAD寄存器的地址,并将配置值写入。

4、Makefile文件与链接脚本编写

(1)由于本章例程的架构与上一章类似,故可直接复用上一章的Makefile,将其复制到本工程的根目录下即可,不过之前编写的Makefile通用性较差,如果有些变量产生变化,就需要改很多处地方,非常麻烦,对此可以进行优化,如下所示。

# 如果外部没有定义,才赋值(方便命令行覆盖:make CROSS_COMPILE=xxx)
CROSS_COMPILE ?= arm-linux-gnueabihf-
NAME          ?= ledc

CC      := $(CROSS_COMPILE)gcc
LD      := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump

# 需要编译的目标文件列表
OBJS := start.o main.o

$(NAME).bin: $(OBJS)
    # 使用链接脚本 imx6ul.lds,链接输出 elf
    $(LD) -T imx6ul.lds -o $(NAME).elf $^
    # 从 elf 提取纯二进制 bin;-S:去掉重定位、符号信息
    $(OBJCOPY) -O binary -S $(NAME).elf $@
    # 反汇编,生成 dis 汇编查看文件
    $(OBJDUMP) -D -m arm $(NAME).elf > $(NAME).dis

%.o: %.s
    $(CC) -Wall -nostdlib -c -O2 -o $@ $<

%.o: %.S
    $(CC) -Wall -nostdlib -c -O2 -o $@ $<

%.o: %.c
    $(CC) -Wall -nostdlib -c -O2 -o $@ $<

.PHONY: clean
clean:
    rm -rf *.o $(NAME).bin $(NAME).elf $(NAME).dis

(2)除了Makefile以外,链接脚本也可直接复用,将上一章的imx6u.lds复制到本工程的根目录下即可。

5、程序烧写验证

(1)将imxdownload拷贝到工程的根目录下,也就是和ledc.bin处于同一个文件夹下,并赋予其可执行权限。

(2)将SD卡接入虚拟机,然后在当前目录运行命令“./imxdownload ledc.bin /dev/sdb”即可将固件刷入SD卡(设备名需要核对,与/dev下的设备名一致),然后在开发板上验证即可。

i.MX6ULL裸机SDK移植:Makefile构建与引脚复用配置 嵌入式裸机开发中,外设寄存器直接操作易出错且难以维护,而SDK封装提供了标准化硬件抽象。其核心原理在于通过链接脚本精准映射内存段、利用Makefile实现跨平台自动化构建,并借助IOMUXC引脚复用函数完成功能选择与电气参数配置。这种结构化方法显著提升代码可移植性与工程稳定性,广泛应用于ARM Cortex-A系列SoC(如i.MX6ULL)的启动代码、驱动开发及底层BSP定制等场景,是嵌入式Linux系统启动前关键阶段的技术基石。 阅读详情

相关推荐

S32G3异构多核开发实战:从RTD裸机到Yocto Linux环境搭建

在嵌入式系统开发中,异构多核处理器因其能同时满足实时控制与高性能计算需求,已成为汽车电子、工业控制等领域的核心平台。其工作原理在于将实时任务(如信号处理、电机控制)分配给Cortex-M系列等实时核心,而将复杂的应用逻辑(如用户界面、网络协议栈)运行在Cortex-A系列应用核心的Linux等富操作系统上。这种架构的技术价值在于实现了性能、功耗与功能安全性的最佳平衡。在汽车网关、域控制器等典型应用场景中,开发者需要构建完整的软硬件协同开发环境。本文聚焦于NXP S32G3车规级处理器,详细阐述了如何利用S3

cuifan5176的博客 445

Linux之ARM(IMX6U)裸机官方SDK移植

Linux之ARM(MX6U)裸机官方SDK移植1、I.MX6ULL 官方 SDK 包简介2、实验程序的编写2.1、SDK文件的移植2.2、创建cc.h文件2.3、编写实验代码2.3.1、main.c2.3.2、start.s2.3.3、编写链接脚本2.3.4、编写Makefile3.编译下载 1、I.MX6ULL 官方 SDK 包简介 NXP 针对 I.MX6ULL 编写了一个 SDK 包,这个 SDK 包就类似于 STM32 的 STD 库或者HAL 库,这个 SDK 包提供了 Windows 和 Li

一只青木呀 2516

IMX6ULL的SDK详解

IMX6ULL的SDK详解

a_zxswer的博客 431

Linux之ARM(MX6U)裸机之使用官方SDK移植实验

Linux之ARM(MX6U)裸机之使用官方 SDK 移植实验1. I.MX6ULL 官方 SDK 包简介2.硬件原理图分析3.试验程序编写3.1SDK 文件移植3.2创建 cc.h 文件3.3 编写实验代码4.编译下载验证4.1 编写 Makefile 和链接脚本4.2 编译下载 1. I.MX6ULL 官方 SDK 包简介 NXP 针对 I.MX6ULL 编写了一个 SDK 包,这个 SDK 包就类似于 STM32 的 STD 库或者 HAL 库,这个 SDK 包提供了 Windows 和 Linux

weixin_47932709的博客 1167

论文阅读笔记--Grid Anchor based Image Cropping: A New Benchmark and An Efficient Model

基于网格锚的图片裁剪:一种新的标准和高效的模型摘要1.介绍2.相关工作2.1 图像裁剪数据集和评估指标 摘要 图像裁剪的目的是通过去除图像中无关的内容来改善图像的组成和美学质量。现有的图像裁剪数据库大多只提供一个或多个人工标注的边界框作为基准,难以反映实际中图像裁剪的非唯一性和灵活性。 采用IoU等评价指标也不能可靠地反映裁剪模型的真实性能。本文回顾了图像裁剪的问题,并通过考虑图像裁剪的特殊特性和要求(如局部冗余、内容保存、高宽比),提出了基于网格锚的公式。 我们的公式将候选裁剪窗口的搜索空间从数百万减少到

qq_22565865的博客 2948

5种主流触觉传感器对比:GelSight、DIGIT、Taxim、GelSlim和TACTO如何选?

本文深度解析了GelSight、DIGIT、Taxim、GelSlim和TACTO五款主流触觉传感器的技术原理与核心特性。通过对比视觉传感与电学传感两大技术路径,为机器人灵巧抓取、精密检测等应用场景提供清晰的选型决策指南,帮助开发者根据项目需求在分辨率、响应速度、集成度与成本之间找到最佳平衡。

Black的专栏 929

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-10.1-NXP SDK 移植

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 421

芒果YOLOv8改进72:动态标签分配策略篇之ATSS:自适应训练样本选择Adaptive Training Sample Selection策略

YOLOv8代码实践|ATSS标签分配策略改进🥭

包括YOLOv5、YOLOv7、YOLOv8等模型改进 2905

Linux开发(驱动&应用)学习

Linux开发(驱动&应用)学习路线规划

嵌入式学习记录站点 9365

Python爬虫教程:抓取电商网站评论(以淘宝和京东为例)

通过本文的介绍,我们学会了如何使用Python编写爬虫,抓取淘宝和京东等电商平台的商品评论数据。我们介绍了如何使用电商平台提供的开放API以及如何通过模拟浏览器来抓取动态加载的数据。此外,我们还讨论了如何应对反爬虫技术,如何存储抓取的数据等。爬取电商平台的数据是一个强大的工具,能够为市场分析、消费者行为研究、产品优化等领域提供有力的支持。然而,在使用爬虫技术时,我们必须遵循法律法规,尊重平台的隐私政策,避免滥用数据。

2201_76125261的博客 1737

黑猫带你学eMMC协议第4篇:eMMC概述

1 前言 声明: 本文依据eMMC JEDEC5.1协议及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 本文大约3000字,从emmc的内部结构框架、供电、总线、寄存器等各方面进行框架性的介绍,本章节内容不需要深入研究,读完本篇文章,只要能对emmc有个框架下的了解,就可以了。 2 内部结构框架 由图可以看出,emmc内部由两块组成:控制器 + 存储介质。emmc内部存储介质绝大部分为nand flash。 众所周知,我们需要存储数据到nand flash中,并

黑猫奥利奥的博客 3340

100ASK-IMX6ULL开发板移值NXP官方Linux

100ASK-IMX6ULL开发板移值NXP官方Linux1.开发环境2.编译下载NXP官方Linux2.1 编译官方Linux2.2 通过tftp下载测试官方的Linux3.移值NXP官方Linux3.1 添加开发板配置文件和设备树文件3.1 LCD驱动修改3.2 网络驱动修改3.3 测试修改后的Linux 1.开发环境 gcc: 100ask_imx6ull-sdk\ToolChain\gc...

不休的博客 3597

系统安全性评估 (SSA) 详细解析

系统安全性评估(SSA)是一种自下而上的验证过程,目的是确保系统设计中的每个功能、子系统、硬件和软件的实现,符合早期通过 FHA 和 PSSA 设定的安全性需求。它通过对已实现的系统进行系统性综合评价,检验各项设计和安装是否符合预期的安全性目标,最终支持飞机的适航认证。飞行控制系统是飞机安全性设计的核心子系统之一,负责控制飞机的姿态和方向。为了确保飞行控制系统能够在各种飞行条件下保持安全运行,SSA 被用于验证该系统的设计是否满足 FHA 中设定的安全性目标。

qq_41854911的博客 1651

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-12-蜂鸣器

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 768

基于高斯两步移动搜寻法(2SFCA)的城市绿地可达性分析

第二步,对于每一个街道i,给定空间距离阈值d0,便形成另一个空间作用域,同样对于落在空间作用域内的每块绿地l的供给比率(Rl)利用高斯方程赋以权重,然后对这些加权后的供给比率(Rl)进行加和,便得到每个街道i的绿地可达性Ai。图3与图4是高斯两步移动搜索法的示例。在图3中,以d0为阈值,有1、2、3 三个街道中心点落在了绿地a的空间作用域内。同样在图4中,以d0为阈值,有a、c两个绿地中心点落在了街道2的空间作用域内,根据公式(3),对a、c高斯方程加权后的供需比率进行累加,便得到了街道2 的绿地可达性。

2301_77310370的博客 2404

R语言LASSO回归作图为什么X轴使用-log(λ)而不是log(λ),如何转化为log(λ)?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1014

[I.MX6UL]官方 SDK 移植实验

本文介绍了如何高效移植NXP官方SDK中的I.MX6UL/6ULL寄存器定义文件至自建Linux裸机工程。通过复用fsl_common.h、fsl_iomuxc.h、MCIMX6Y2.h及自定义cc.h,避免重复编写寄存器定义,提升开发效率。重点说明了文件路径复制、GCC编译器适配(修改cc.h与fsl_common.h)、系统时钟初始化处理及Makefile配置,并提供常见编译错误排查方案,确保工程顺利编译运行。

嵌入式单片机实验室 1905

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

正点原子-Linux学习-第二节-Linux之ARM(MX6U)裸机-学习笔记

正点原子-Linux学习-第二节-Linux之ARM(MX6U)裸机-学习笔记

qq_56338777的博客 1272

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

NXP imx6芯片开发环境搭建与点灯实战

本文详细指导如何在Windows系统上为NXP imx6芯片搭建Linux驱动开发环境,涵盖GCC工具链、MinGW和CMake的安装配置,并利用NXP官方SDK资源进行GPIO驱动开发,最终通过点灯实战完成从编码、编译到烧录调试的全流程。

uuu88的博客 172

Alientek I.MX6UL Linux- 第十二章 官方SDK移植实验

  本章主要内容是使用NXP官方SDK库进行裸机开发,其中用到的文件是如下: fsl_common.h:位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_common.h。 fsl_iomuxc.h: 位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_iomuxc.h。 MCIMX6Y2.h: 位...

善若水,朝心流的博客 361

i.MX6ULL 裸机开发进阶|C 驱动、SDK、BSP 工程、链接脚本

承接上一篇 ARM 汇编点灯,本篇从 C 语言寄存器操作,进阶到结构体寄存器映射、NXP SDK、蜂鸣器驱动、BSP 工程管理、Makefile 高级用法与链接脚本,适合期末复习与面试。学习主线:C 直接操作寄存器 → 结构体封装寄存器 → SDK 库简化开发 → 外设驱动实战 (LED + 蜂鸣器) → BSP 工程规范 + Makefile 优化 + 链接脚本与 BSS 段处理。

weixin_48445537的博客 502

NXP Layerscape SDK 20.04:嵌入式Linux开发从选型到部署的完整指南

在嵌入式Linux开发领域,软件开发工具包(SDK)是连接硬件平台与应用软件的关键桥梁,其质量直接影响项目的开发效率与最终性能。一个优秀的SDK不仅提供经过验证的驱动和内核,更通过清晰的特性支持矩阵,帮助开发者在项目初期规避硬件与软件不匹配的风险。其核心价值在于为特定处理器平台提供深度优化的完整软件栈,包括引导程序、内核、中间件及工具链,从而显著降低系统移植和性能调优的复杂度。在工业网关、边缘计算和网络设备等场景中,此类SDK能加速产品上市时间,并确保关键特性如时间敏感网络(TSN)和数据平面开发套件(DP

1万+

Linux-ARM裸机(四)-开发前工程准备

本篇记录了本人学习Linux(ARM)裸机开发中,模仿STM32驱动开发,移植NXP官方SDK库,BSP工程管理相关内容。

嵌入式入坑,专注点灯。 406

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.5讲 GPIO中断实验-通用中断驱动编写

第15.5讲视频教程中,正点原子会讲解如何实现自己的通用中断驱动编

小狗爱吃黄桃罐头的博客 502

嵌入式Linux裸机开发

FTP,即 File Transfer Protocol,文件传输协议。在开发过程中,Ubuntu作为FTP服务器,Windows作为FTP客户端,使用FileZilla直接可以实现Ubuntu和Windows文件互传。NFS,即 Network File System,网络文件系统。在进行Linux驱动开发的时候需要NFS启动,通过网络将Ubuntu中的文件直接作为启动文件。SSH,即Secure Shell,安全Shell。用于在Windows下使用终端软件安全远程登录Ubuntu。

Mr_Unicorn的博客 445

Linux之ARM(MX6U)裸机之BSP工程管理实验

Linux之ARM(MX6U)裸机之BSP工程管理实验1.工程管理简介2.实验程序编写2.1创建 imx6ul.h 文件2.2创建个.vscode文件修改includePath2.3 编写 led 驱动代码2.4 编写时钟驱动代码2.5 编写延时驱动代码2.6 修改 main.c 文件3.编译下载验证3.1编写 Makefile3.2 编写脚本链接3.3 编译下载 1.工程管理简介 打开我们上一章的工程根目录,如图所示: 在图中我们将所有的源码文件都放到工程根目录下,即使这个工程只是完成了一个 简单的流水

weixin_47932709的博客 719
上一篇: Linux入门第二部分(ARM裸机篇) 第六章 驱动开发
下一篇: Linux入门第二部分(ARM裸机篇) 第八章 BSP工程管理
Zevalin爱灰灰
Zevalin爱灰灰 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄3年 7137粉丝 552原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Zevalin爱灰灰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值