资讯动态

AB32VG1开发板实战:从环境搭建到外设应用全攻略

发布时间:2026/10/24 3:34:18 来源:尧图企业网站定制
简介中科蓝讯AB32VG1 RISC-V开发板实践指南面向蓝牙耳机与嵌入式开发场景由RT-Thread与中科蓝讯联合推出旨在帮助开发者基于RT-Thread Studio快速完成TWS蓝牙耳机类应用的原型搭建。文档以docx格式打包共1个文件压缩包大小约32.21MB内容编排清晰适合从入门到进阶的开发者系统学习。指南覆盖UART、GPIO、I2C、SPI、Timer、ADC、PWM、WDT、RTC、SDIO、Flash、SD、IRDA、Audio、mic及WIFI模块配置等十六类外设实践每部分均结合RT-Thread Studio IDE讲解配置与编程方法同时提供智慧门禁系统、遥控台灯、智能灯控、WAV音频播放等完整项目案例便于将外设知识串联到实际场景中。目前已有5121人学习下载是一份兼顾原理讲解与动手实操的蓝牙开发参考资料。1. 从 TWS 蓝牙耳机到 AB32VG1这份实践指南能解决哪些真问题做 TWS 蓝牙耳机周边方案的工程师多半遇到过这种尴尬芯片手册几百页开发板拿到手上电后却不知道第一条指令往哪写。中科蓝讯这块 AB32VG1 评估板就是为解决这个问题来的——RISC-V 内核、120MHz 主频、192K RAM、8Mbit Flash原生搭载 RT-Thread 物联网操作系统SDK 直接内置在 RT-Thread Studio 里配套一份数百页实践指南从 UART、GPIO 一路写到 Audio、mic 和 WAV 播放。它解决的是「从裸板到第一个能跑的外设程序」的路径问题。适合三类人刚转 RISC-V 的嵌入式工程师、做 TWS 耳机和音频产品原型验证的硬件开发者以及想用 RT-Thread 快速攒项目的学生团队。这篇笔记按「环境 → 外设 → 排错 → 项目」的顺序把资源拆开讲照着走能少烧几块板子。2. 开发环境与烧录链路Studio 装完只是开始驱动才是第一道坎2.1 装出能编译的环境Studio、BSP 资源包与 RISC-V 工具链AB32VG1 的软件 SDK 不是单独下载的而是随 RT-Thread Studio 的 SDK 管理器分发。换句话说环境搭建的入口只有一个装 Studio然后在里面把 BSP 和工具链勾上。很多人卡在第一步是因为只装了 IDE没装 Board Support Package新建工程列表里自然看不到 AB32VG1。装 BSP 的路径在 Studio 工具栏的「SDK 管理器」里展开 Board_Support_Packages找到 Bluetrum_AB32VG1-ab-prougen勾选安装。注意这个名字是「公司名板型代号」的拼接ab-prougen 就是 AB32VG1 评估板在 BSP 仓库里的代号。同时还要在 SDK 管理器里安装 RISC-V 工具链这一步经常被跳过——Studio 默认只带 ARM 编译器不装 RISC-V 工具链编译时会直接报找不到编译器而不是报代码语法错误。这个报错很容易误导人后面避坑章节详细说。硬件参数心里要有数LQFP48 封装、主频 120M、片上 RAM 192K、Flash 8Mbit开发板资料里写 8Mbit芯片手册里有时标 4Mbit以实际批次为准。板载资源包括蓝牙模块、FM 模块、TF Card 接口、USB 接口、IIC 接口、音频接口美标 CTIA、六路 ADC 输入引脚、六路 PWM 输出引脚、全彩 LED、IRDA 红外接收口、Reset 键和三个功能按键板子尺寸 6cm x 9cmI/O 口按 2.54mm 间距引出同时兼容 Arduino Uno 扩展接口。这意味着你之前为 Arduino 写的传感器模块可以插上去直接验证。新建工程的完整流程是文件 → 新建 → RT-Thread 项目 → 选择「基于开发板」 → 填写工程名 → 开发板选 AB32VG1-AB-PROUGEN → BSP 版本选 1.0.8 → 其他默认点完成。这份实践指南对应的 BSP 版本就是 1.0.8如果你装的是更新的 BSPUART 驱动行为可能略有差异后面串口波特率那节会涉及。工程建好后编译产物不是常见的 .hex 或 .bin而是 .dcf 后缀的固件位于工程的 Debug 目录。这个 .dcf 就是 Downloader 下载工具要烧写的文件不要试图用其它烧录器去认它工具链和烧录器的组合是绑定的。2.2 固件下载链路.dcf、Downloader 与串口芯片驱动编译只是第一步把 .dcf 弄进开发板才是新手最容易翻车的地方。AB32VG1 用的是配套的 Downloader 软件进行固件下载不是 OpenOCD也不是 DAP-Link。Downloader 通过开发板上的 USB 转串口芯片与板载 bootloader 通信所以串口驱动的正确与否直接决定下载成败。这里有一个版本差异容易踩坑。V2 版本的开发板用的串口芯片是 CH340Windows 系统能自动装驱动即插即用。V1 版本的开发板用的串口芯片是 CP2102需要手动切换到配套驱动否则 Downloader 会报连接失败或找不到设备。判断板子版本先看丝印或者直接看设备管理器里枚举出的串口芯片型号。我一般建议拿到板子后第一时间做两件事第一插上 USB打开设备管理器看串口是否枚举成功记下串口号第二直接尝试一次空工程下载确认 Downloader 和驱动链路是通的再开始写业务代码。这一步能省掉后面无数「代码对了但板子没反应」的排查时间。Downloader 里还有一个容易被忽略的选项下载下拉框里可以选「自动」。选上之后每次在 Studio 里点编译编译完成会自动触发下载省去手工打开 Downloader、选固件、点下载的三步操作。这个习惯我后面会单独讲属于能明显提升开发节奏的设置。注意V1 板子的 CP2102 驱动如果装错设备管理器里能看到设备但 Downloader 会提示打开串口失败。先换驱动不要反复拔插 USB拔插解决不了驱动冲突。3. UART 与 GPIO 实战先打通调试口再点灯3.1 串口通信实现信号量、中断回调与错位回显AB32VG1 上串口 0 被系统用作调试串口用户程序能用的是串口 1UART1对应的引脚是 PA3 和 PA4。RT-Thread 里已经做好了 UART0 和 UART1 的设备驱动不需要自己操作寄存器只要用设备框架的接口打开设备就行。下面这个例程是实践指南里 UART 章节的核心导出uart_sample命令到终端发送字符串到 uart1然后把收到的每个字符加一后回显。#include rtthread.h #define SAMPLE_UART_NAME uart1 /* 接收信号量串口收到数据时在中断回调里释放 */ static struct rt_semaphore rx_sem; static rt_device_t serial; /* 串口接收中断回调只释放信号量不做数据处理 */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { rt_sem_release(rx_sem); return RT_EOK; } /* 串口处理线程读一个字节加一后回写 */ static void serial_thread_entry(void *parameter) { char ch; while (1) { while (rt_device_read(serial, -1, ch, 1) ! 1) { /* 没有数据时阻塞等待信号量避免空转 */ rt_sem_take(rx_sem, RT_WAITING_FOREVER); } ch ch 1; /* 错位输出收到 a 回 b */ rt_device_write(serial, 0, ch, 1); } } static int uart_sample(int argc, char *argv[]) { char uart_name[RT_NAME_MAX]; char str[] hello RT-Thread!\r\n; if (argc 2) { rt_strncpy(uart_name, argv[1], RT_NAME_MAX); /* 支持 uart_sample uart1 指定设备 */ } else { rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX); } serial rt_device_find(uart_name); if (!serial) { rt_kprintf(find %s failed!\n, uart_name); return RT_ERROR; } rt_sem_init(rx_sem, rx_sem, 0, RT_IPC_FLAG_FIFO); rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); /* 中断接收模式 */ rt_device_set_rx_indicate(serial, uart_input); /* 注册接收回调 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); /* 发送欢迎字符串 */ rt_thread_t thread rt_thread_create(serial, serial_thread_entry, RT_NULL, 1024, 25, 10); if (thread ! RT_NULL) { rt_thread_startup(thread); } return RT_EOK; } /* 导出命令到 msh 终端输入 uart_sample 即可运行 */ MSH_CMD_EXPORT(uart_sample, uart device sample);这段代码有三个设计值得注意。第一接收用了信号量 回调而不是在回调里直接读数据。中断回调里只做rt_sem_release实际读取放在线程里这是 RT-Thread 推荐的做法能避免在中断上下文里做耗时操作。第二线程栈给了 1024 字节优先级 25这两个参数在资源紧张的 MCU 上要克制栈不要盲目加大。第三MSH_CMD_EXPORT把函数导出到 msh 命令列表编译烧录后在终端输入uart_sample就能跑不需要改 main 函数。编译下载后在 RT-Thread 的 FinSH 终端输入uart_sample然后用串口调试助手打开 uart1 对应的串口号发送任意字符开发板会返回每个字符加一的结果。比如发abc收到bcd。如果调试助手没有输出先检查波特率——这是 UART 实践里最常见的坑下一段说。3.2 控制 RGB 彩灯引脚模式的输出配置与电平逻辑GPIO 实践章节用板载三色 RGB 彩灯做演示。RGB 灯三个引脚对应红、绿、蓝三色控制逻辑很简单把引脚配成输出模式写高低电平点亮或熄灭对应颜色。下面这段代码是典型的 RT-Thread GPIO 写法#include rtthread.h #include rtdevice.h /* 引脚编号按实际 BSP 的引脚枚举填写示意值需对照 drv_gpio.c */ #define PIN_LED_R 23 #define PIN_LED_G 24 #define PIN_LED_B 25 static void rgb_demo(int argc, char *argv[]) { /* 三个引脚都配置为推挽输出 */ rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT); rt_pin_mode(PIN_LED_G, PIN_MODE_OUTPUT); rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT); while (1) { /* 共阳 LED拉低点亮红色 */ rt_pin_write(PIN_LED_R, PIN_LOW); rt_pin_write(PIN_LED_G, PIN_HIGH); rt_pin_write(PIN_LED_B, PIN_HIGH); rt_thread_mdelay(500); /* 点亮绿色 */ rt_pin_write(PIN_LED_R, PIN_HIGH); rt_pin_write(PIN_LED_G, PIN_LOW); rt_thread_mdelay(500); /* 点亮蓝色 */ rt_pin_write(PIN_LED_R, PIN_HIGH); rt_pin_write(PIN_LED_G, PIN_HIGH); rt_pin_write(PIN_LED_B, PIN_LOW); rt_thread_mdelay(500); } } /* 在 msh 终端输入 rgb_demo 启动颜色轮换 */ MSH_CMD_EXPORT(rgb_demo, rgb led demo);写 GPIO 代码本身不难难点在于电平逻辑。开发板上的 RGB 灯通常是共阳接法公共端接电源正极三个阴极通过限流电阻接到 MCU 引脚所以要低电平点亮。如果你按习惯写高电平点亮灯死活不亮先别怀疑代码去看原理图确认共阳还是共阴。另一个点是在线调试AB32VG1 的引脚通过 2.54mm 排针引出你可以用逻辑分析仪勾在引脚上确认波形比在代码里加打印更直观。我也遇到过引脚编号填错导致点了别的外设的情况。RT-Thread 的引脚编号不是芯片丝印上的 PA1、PA2而是 BSP 里重新映射过的抽象编号。填之前先打开工程里的 drv_gpio.c 或者 board.h找到引脚映射表确认编号这个「找表」的动作比试错快得多。3.3 引脚资源边界LQFP48 封装下哪些引脚能复用AB32VG1 是 LQFP48 封装引脚有限复用冲突是实际项目里绕不开的问题。开发板引出的串口 1 用了 PA3 和 PA4这两个引脚被 UART 外设占用后就不能再拿来当普通 GPIO 点灯。同样的I2C 接口、ADC 输入、PWM 输出、IRDA 都有固定的引脚分配做复合功能前先画一张引脚分配表把每个代号的复用功能列出来确认没有冲突再开工。我见过一个翻车案例某开发者同时开了 uart1 和 GPIO 中断结果 GPIO 中断一直不触发查了半天发现中断引脚和串口 1 的 RX 复用了串口驱动初始化时已经把引脚切到 UART 功能。这种问题靠经验排查特别费时间最好在设计阶段就避开。实践指南里每个外设章节都给了对应引脚的电路图做项目前把相关章节的引脚信息抄到一起比事后对原理图快得多。4. 外设图谱I2C、SPI、ADC、PWM 到 Audio按场景选型4.1 通信类外设I2C、模拟 SPI 与 SDIO 的选型差异实践指南里通信类外设占了四章I2C、模拟 SPI、SDIO、SD。它们解决的是不同层次的问题。I2C 适合挂低速传感器和显示屏两根线搞定地址由器件决定总线上可以挂多个设备。模拟 SPI 是用 GPIO 手动翻转时钟和数据线来模拟 SPI 时序适用场景是 AB32VG1 上没有硬件 SPI 外设、或者硬件 SPI 引脚被占用的情形。SDIO 和 SD 则是给 TF 卡用的——SDIO 走硬件控制器SD 走 SPI 模式两者选哪个取决于你手上板子的引脚排布和速率需求。外设典型器件引脚/资源注意事项I2COLED 屏、温湿度传感器一路 IIC 接口引出上拉电阻需确认地址冲突检查模拟 SPIFlash 芯片、LCDGPIO 任意引脚CPOL/CPHA 时序由延时控制SDIO / SDTF 卡一路 TF Card 接口电压匹配注意卡座方向I2C 的实践流程通常是先在 Studio 配置里打开 I2C 设备驱动然后rt_device_find(i2c1)找到总线设备再用rt_i2c_transfer发送寄存器地址和数据。第一次跑 I2C 时我建议用逻辑分析仪抓一下 SCL 和 SDA 的波形确认时序参数和器件 datasheet 对得上。很多「I2C 通信失败」其实是 GPIO 模拟时序太快器件跟不上。模拟 SPI 的核心参数是时钟极性和相位也就是常说的 SPI Mode 0/1/2/3。AB32VG1 上用 GPIO 模拟时你用一个延时函数控制时钟高低电平的持续时间延时长一点没关系稳定第一。我一般会把时钟周期调到器件允许最大频率的一半以下确保余量。SDIO 相比 SD 模式速率更高但驱动的复杂度也更高如果项目只是定期记录日志数据SD 模式SPI 方式操作 TF 卡实现起来更轻也够用。4.2 信号采集与控制类Timer、ADC、PWM、WDT、RTC这一类外设是整个项目的「感知和动作」层。Timer 负责定时和计时ADC 负责把模拟电压变成数字量PWM 负责输出电压波形控制亮度或电机转速WDT 负责系统卡死时自动复位RTC 负责维护时间。五者在实践指南里各有独立章节但在实际工程里经常组合出现。先看 Timer。RT-Thread 里使用定时器的常见做法是rt_device_find(timer0)找到设备rt_device_open打开然后设置超时回调在回调里做周期任务。定时器溢出的周期由预分频系数和计数值决定公式是溢出时间 (预分频 1) × (计数值 1) / 定时器时钟。改周期时只改计数值不要动预分频否则会导致 PWM 或其它依赖同一时钟源的外设频率一起变化这种玄学问题很隐蔽。ADC 的现场调试经验AB32VG1 开发板引出六路 ADC 输入引脚端子读取前确认参考电压和量程。我遇到过 ADC 采样值漂移的问题原因是传感器输出阻抗太高MCU 内部采样电容没有充足时间充电。解法是在采样通道加一个 0.1uF 的电容或者降低采样速率给采样保持电容留充电时间。PWM 和 WDT 是相反方向的一对。PWM 输出占空比可调调光调速都靠它WDT 则是「后悔药」——程序跑飞了看门狗帮你复位。PWM 实践章节里注意频率选择调 LED 亮度 1kHz 足够调电机或蜂鸣器要考虑听觉噪声。WDT 的坑在于喂狗位置不要在中断里喂狗否则主循环卡死时中断还能喂狗看门狗形同虚设。RTC 实践更简单关键是把时间基准校准。开发板断电后 RTC 是否继续走取决于是否接了备用电池。如果只是跑系统演示上电后手动同步一次时间即可产品化时要从网络或用户端同步。4.3 音频链路Audio、mic 与 IRDA 在耳机方案里的位置这一部分是这份指南和 TWS 蓝牙耳机开发最直接相关的内容。AB32VG1 板载了完整的音频通路Audio 章节讲的是音频输出mic 章节讲的是麦克风采集WAV 音频播放项目则把两者串起来。开发板的音频接口是美标 CTIA也就是 4 段 3.5mm 耳机座段序是 L/R/Mic/GND。如果你拿欧标 OMTP 的耳机插上去会出现声音正常但麦克风没反应或者声音发闷先排查是不是接口标准不匹配。mic 采集在耳机方案里对应通话或语音控制场景。实践指南的 mic 章节演示了如何通过 RT-Thread 的音频框架读取麦克风数据。这里有一个 ADC 采样率和位深的匹配问题mic 的模拟信号进 ADC 后采样率决定你能还原的最高频率按奈奎斯特采样定理要采集 4kHz 的语音频段采样率至少要 8kHz实际建议留足余量。Audio 输出的常见问题是底噪。开发板音频接口直接引出接耳机听会有轻微底噪排查顺序是先确认电源是否干净再确认地线连接最后看 DAC 输出有没有加滤波电容。WAV 音频播放项目用的是 WAV 格式本质是 PCM 裸数据加文件头解码负担很轻MCU 直接从 TF 卡读取并送到 Audio 输出即可。相比 MP3 需要解码器WAV 对 MCU 的资源消耗小得多这也是它适合在 MCU 上演示音频播放的原因。IRDA 放在这一节是因为 TWS 耳机充电仓或音箱的遥控场景经常用到红外接收。AB32VG1 板载一个 IRDA 红外接收端口配合遥控台灯项目解码红外信号后控制 PWM 调光。红外解码没有特别多的玄学注意载波频率即可一般是 38kHz解码时先读脉冲宽度再对照协议表。5. AB32VG1 常见问题排查从驱动到波特率的五个真实坑5.1 现象一Downloader 连接失败设备管理器里看不到串口现象开发板插上 USBDownloader 提示打开串口失败设备管理器里找不到任何 COM 口。原因V1 版本的开发板使用 CP2102 串口芯片需要手动安装配套驱动Windows 系统自带的驱动不兼容。如果装的是别的 USB 转串口芯片驱动也会出现设备枚举异常。解决先确认板子是 V1 还是 V2。V2 的 CH340 免驱V1 必须把 CP2102 的驱动换成配套版本然后重新插拔 USB。换完驱动后设备管理器里会稳定出现一个 COM 口Downloader 里选择对应端口号即可。如果换了驱动还是不行把下载软件和驱动都卸载重装顺序不要反。5.2 现象二编译报错提示找不到 RISC-V 编译器现象Studio 编译工程报错内容是program riscv-none-embed-gcc not found或类似的找不到编译器错误。原因RT-Thread Studio 默认只预装了 ARM 工具链RISC-V 工具链需要手动在 SDK 管理器里勾选安装。很多人以为装了 BSP 资源包就够了实际上 BSP 只是芯片支持包工具链是独立的。解决回到 SDK 管理器在工具链或软件包分类下找到 RISC-V 相关的编译器勾选安装。安装完成后重启 Studio重新编译。确认工具链装好的方法很简单编译输出窗口能看到编译器路径就说明正常。记住BSP 和工具链是两个独立安装项缺一不可。5.3 现象三串口输出乱码或完全无打印现象程序编译下载成功但串口调试助手收到的全是一堆乱码或者干脆没有输出。原因AB32VG1 的 UART 驱动默认波特率被设置成 1500000这是芯片调试口的默认配置。如果你用 115200 打开串口收到的自然是乱码用 1500000 打开又看不到内容是串口助手的缓冲区或波特率支持问题。解决有两种修法。第一种把串口助手的波特率调到 1500000能立刻看到输出但 1500000 是非标准波特率部分 USB 转串口工具不支持。第二种修改驱动里的默认波特率打开工程里 libraries → hal_drivers → drv_usart.c在rt_hw_usart_init函数里找到uart_obj[i].serial.config.baud_rate 1500000这一行把串口 1 的波特率改成 115200// 串口 1 使用 115200串口 0 保持默认调试波特率 if (i 1) { uart_obj[i].serial.config.baud_rate 115200; }改完重新编译下载再用 115200 打开串口。注意改的是驱动默认值不是应用层代码所以改完要重新烧录固件才生效。5.4 现象四新建工程列表里找不到 AB32VG1 开发板现象Studio 新建工程时开发板列表里没有 Bluetrum_AB32VG1 选项没法创建基于这块板子的工程。原因BSP 资源包没有安装或者安装后 Studio 的缓存没有刷新。还有一种情况是安装时网络中断BSP 包下载不完整。解决打开 SDK 管理器确认 Board_Support_Packages 分类下 Bluetrum_AB32VG1-ab-prougen 已勾选并安装完成。如果已经显示已安装但列表还是找不到重启 Studio 或者手动刷新 SDK 管理器缓存。确认 BSP 版本尽量和文档对应不同版本的 BSP 外设驱动可能有差异。5.5 现象五uart1 接收数据丢失或回显错位现象uart_sample例程跑起来发送字符串后只收到一部分回显或者收到的字符不是预期的「加一」结果。原因大概率是接收处理线程的优先级或栈大小不合适。默认例程线程优先级 25、栈 1024如果系统里还有其他高优先级任务持续占用 CPU串口接收线程来不及处理中断里堆积的数据就会出现丢失。如果你修改过波特率发送端和接收端波特率不一致也会导致数据错乱。解决先确认波特率匹配再用串口助手单发一个字符测试如果单字符正常、连续字符丢失把 serial 线程优先级调高数值调小或者把栈加大到 2048。另外注意错位回显的逻辑是ch ch 1收到a返回b如果你发的是中文或多字节编码逐字节加一的结果看起来就是乱码这是预期行为。注意以上五个坑是实践指南发布后社区反馈最集中的问题。前两个涉及工具链后三个涉及外设行为排查顺序建议是先工具链后代码避免在环境问题上浪费时间。6. 把外设串成应用四个 Demo 项目与「编译后自动下载」的习惯6.1 四个 Demo 项目的外设组合逻辑实践文档最后一组内容不是单个外设而是四个完整的应用项目这是全篇最值得动手复现的部分。每个项目都不是堆外设而是有明确的功能目标。项目核心功能用到的外设值得学的点智慧门禁系统人员进出控制与记录GPIO、RTC、I2C显示、PWM报警多外设协同、状态机设计遥控台灯红外遥控、亮度调节、断电记忆IRDA、PWM、Flash红外解码、掉电存储智能灯控声音或光照触发开关mic、ADC、PWM模拟信号采集与阈值判断WAV 音频播放从 TF 卡读取并播放音频SDIO/SD、Audio文件系统、数据流推送以遥控台灯为例IRDA 收到红外码后解析出按键值按键控制 PWM 的占空比从而实现亮度调节同时把当前亮度写入 Flash下次上电从 Flash 读回恢复。三个外设串成一条完整链路感知 → 处理 → 执行 → 记忆。单独学每个外设时你会用但把它们组合起来才发现问题IRDA 解码要避免阻塞 PWM 输出写 Flash 不能太频繁否则磨损闪存。这类「组合后的工程问题」只有在完整项目里才能暴露。6.2 把「编译后自动下载」变成肌肉记忆开发效率的提升往往来自小习惯。Downloader 的下载下拉框里有一个「自动」选项选中后 Studio 端编译完成会自动触发 Downloader 烧录。我一开始嫌配置麻烦每次手动下载一天下来光等烧录就浪费不少时间。后来强制自己配置了一次从那以后每次改完代码点编译然后直接看板子运行结果整个验证循环从「编译 → 打开工具 → 选文件 → 点下载」四步缩到一步。对于这四个 demo 项目我建议按「通信外设 → 信号外设 → 音频外设 → 完整项目」的顺序逐个复现每验证一个就在文档对应章节做标记。这份实践指南的价值不在于读而在于跟着做一遍做完 UART 和 GPIO你对 RT-Thread 的设备框架就有了手感做完 WAV 播放你对音频数据流的理解就不是纸上谈兵。从那以后我每次拿到新开发板都强制走一遍「建工程 → 点灯 → 串口 → 外设分组验证 → 组合应用」的流程这套指南相当于把这条路提前铺好了。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑