ARM32位MCU开发板调试经验总结

Eclipse 搭建ARM架构MCU开发环境  本文重点介绍最近在搭建ARM架构MCU环境的步骤,以及举例Eclipse项目创建(STM32为例),J-LINK调试环境设置 ,Pack包如何更新,.elf文件如何导入等。 阅读详情

前言

本教程主要包含QT+ARM环境搭建、TFTP工具使用、ldd命令ARM适配三个部分。解决ARM开发板调试过程中的代码编译、文件传输以及依赖库的检查问题。

1.QT+ARM交叉编译

相关教程详见QT5.9.9+ARM开发环境搭建【详细步骤】,本文不再赘述。

2.ARM板时间检查

由于部分ARM板没有配备电池或长期处于断电状态,导致系统内时间不准确,会导致一些列的问题,因此需要在系统中输入date命令进行检查;
如果时间不准确的话,可以手动设置时间:

date -s "2024-12-18 12:54:40"

在这里插入图片描述

3.网络连接配置

(1)网络连接如下
在这里插入图片描述

(2)确保ARM开发板和调试电脑在一个局域网下:
使用ifconfig查看开发板的IP
在这里插入图片描述
查看调试电脑的IP
在这里插入图片描述
(3)查看是否能在ARM板上Ping通电脑,如果不能Ping通则需要关闭调试电脑的防火墙
在这里插入图片描述

在这里插入图片描述

4.TFTP工具使用

(1)下载TFTP工具,可以用来和ARM板传输数据: TFTP工具下载

(2)按照如下步骤配置
在这里插入图片描述
(3)可以查看电脑端共享文档的目录有哪些文件
在这里插入图片描述
(4)文件传输
例如:从电脑端获取AAAA.tar.gz这个文件,下载到ARM板中的/root目录
然后在ARM板系统中,输入如下命令

cd /root/
tftp -g -l AAAA.tar.gz 192.168.1.111

即可完成文件的传输

5.ldd命令的ARM适配

工程需要在用ldd命令查看arm开发板上可执行文件文件需要的动态库缺失情况 但是arm板子上执行ldd命令会提示command not
found,另外arm板子也无法使用apt-get命令,而ldd本质上是一个脚本命令,同时ubuntu系统中有ldd命令,所以只要移植过去即可
(1)在Ubuntu虚拟机中搜索ldd或按照如下步骤查找

cd /usr/bin
find -name ldd

(2)复制到任意位置,然后用文本编辑器打开开始修改:

  • 修改第一行#! /bin/bash为#! /bin/sh
  • 修改RTLDLIST=" XXXX "中的内容为你开发板对应的内容,步骤见下。

(3)查看开发板对应内容方法很简单,首先进入开发板

cd /lib
find -name ld-linux*

在这里插入图片描述
就可以找到这个内容了
因此我需要把RTLDLIST="xxxxxxxx" 修改为RTLDLIST="/lib/ld-linux-armhf.so.3",然后保存退出即可
编辑之后的ldd文件如下,也可以参考:

#! /bin/sh
# Copyright (C) 1996-2016 Free Software Foundation, Inc.
# This file is part of the GNU C Library.

# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.

# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.

# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, see
# <http://www.gnu.org/licenses/>.


# This is the `ldd' command, which lists what shared libraries are
# used by given dynamically-linked executables.  It works by invoking the
# run-time dynamic linker as a command and setting the environment
# variable LD_TRACE_LOADED_OBJECTS to a non-empty value.

# We should be able to find the translation right at the beginning.
TEXTDOMAIN=libc
TEXTDOMAINDIR=/usr/share/locale

RTLDLIST="/lib/ld-linux-armhf.so.3"
warn=
bind_now=
verbose=

while test $# -gt 0; do
  case "$1" in
  --vers | --versi | --versio | --version)
    echo 'ldd (Ubuntu GLIBC 2.23-0ubuntu11.3) 2.23'
    printf $"Copyright (C) %s Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
" "2016"
    printf $"Written by %s and %s.
" "Roland McGrath" "Ulrich Drepper"
    exit 0
    ;;
  --h | --he | --hel | --help)
    echo $"Usage: ldd [OPTION]... FILE...
      --help              print this help and exit
      --version           print version information and exit
  -d, --data-relocs       process data relocations
  -r, --function-relocs   process data and function relocations
  -u, --unused            print unused direct dependencies
  -v, --verbose           print all information
"
    printf $"For bug reporting instructions, please see:\\n%s.\\n" \
      "<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>"
    exit 0
    ;;
  -d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \
  --data-rel | --data-relo | --data-reloc | --data-relocs)
    warn=yes
    shift
    ;;
  -r | --f | --fu | --fun | --func | --funct | --functi | --functio | \
  --function | --function- | --function-r | --function-re | --function-rel | \
  --function-relo | --function-reloc | --function-relocs)
    warn=yes
    bind_now=yes
    shift
    ;;
  -v | --verb | --verbo | --verbos | --verbose)
    verbose=yes
    shift
    ;;
  -u | --u | --un | --unu | --unus | --unuse | --unused)
    unused=yes
    shift
    ;;
  --v | --ve | --ver)
    echo >&2 $"ldd: option \`$1' is ambiguous"
    exit 1
    ;;
  --)		# Stop option processing.
    shift; break
    ;;
  -*)
    echo >&2 'ldd:' $"unrecognized option" "\`$1'"
    echo >&2 $"Try \`ldd --help' for more information."
    exit 1
    ;;
  *)
    break
    ;;
  esac
done

nonelf ()
{
  # Maybe extra code for non-ELF binaries.
  return 1;
}

add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
add_env="$add_env LD_LIBRARY_VERSION=\$verify_out"
add_env="$add_env LD_VERBOSE=$verbose"
if test "$unused" = yes; then
  add_env="$add_env LD_DEBUG=\"$LD_DEBUG${LD_DEBUG:+,}unused\""
fi

# The following command substitution is needed to make ldd work in SELinux
# environments where the RTLD might not have permission to write to the
# terminal.  The extra "x" character prevents the shell from trimming trailing
# newlines from command substitution results.  This function is defined as a
# subshell compound list (using "(...)") to prevent parameter assignments from
# affecting the calling shell execution environment.
try_trace() (
  output=$(eval $add_env '"$@"' 2>&1; rc=$?; printf 'x'; exit $rc)
  rc=$?
  printf '%s' "${output%x}"
  return $rc
)

case $# in
0)
  echo >&2 'ldd:' $"missing file arguments"
  echo >&2 $"Try \`ldd --help' for more information."
  exit 1
  ;;
1)
  single_file=t
  ;;
*)
  single_file=f
  ;;
esac

result=0
for file do
  # We don't list the file name when there is only one.
  test $single_file = t || echo "${file}:"
  case $file in
  */*) :
       ;;
  *) file=./$file
     ;;
  esac
  if test ! -e "$file"; then
    echo "ldd: ${file}:" $"No such file or directory" >&2
    result=1
  elif test ! -f "$file"; then
    echo "ldd: ${file}:" $"not regular file" >&2
    result=1
  elif test -r "$file"; then
    RTLD=
    ret=1
    for rtld in ${RTLDLIST}; do
      if test -x $rtld; then
	dummy=`$rtld 2>&1` 
	if test $? = 127; then
	  verify_out=`${rtld} --verify "$file"`
	  ret=$?
	  case $ret in
	  [02]) RTLD=${rtld}; break;;
	  esac
	fi
      fi
    done
    case $ret in
    0|2)
      try_trace "$RTLD" "$file" || result=1
      ;;
    1)
      # This can be a non-ELF binary or no binary at all.
      nonelf "$file" || {
	echo $"	not a dynamic executable"
	result=1
      }
      ;;
    *)
      echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($ret)" >&2
      exit 1
      ;;
    esac
  else
    echo 'ldd:' $"error: you do not have read permission for" "\`$file'" >&2
    result=1
  fi
done

exit $result
# Local Variables:
#  mode:ksh
# End:

(4)将ldd命令拷贝到开发板的 sbin目录下,可使用cp命令
(5)查看一下有没有移植成功 ldd --version
在这里插入图片描述
(6)然后就可以在开发板上使用ldd命令了
在这里插入图片描述

参考文献

TFTP相关教程也可参考
TFTP软件使用:
https://blog.youkuaiyun.com/wkd_007/article/details/129018831
TFTP命令使用:
https://blog.youkuaiyun.com/bytxl/article/details/50378496

ldd的ARM适配:
https://blog.youkuaiyun.com/qq_41873311/article/details/124759376

32位入门级MCU(ARM Cortex-M3内核)STM32F103系列 与此同时,DAC模块及其余功能模块所具有的出色的集成性,减少了系统设计的复杂性和成本,‌同时也减小了自身体积,缩小了对电路板的空间占用。‌如果只有一组VDD,‌当负载增大时,‌VDD电流产生突变,‌路径距离越长,‌产生的压降越大,‌电源波动越明显。在这款‌芯片的设计中,pad的数量要大于外部引脚的数量,‌是为了满足电源供应、‌信号传输和接地连接的多方面需求,‌以确保芯片的正常工作和性能发挥。‌包括串行线调试(‌SWD)‌和JTAG接口,‌以及Cortex-M3嵌入式跟踪宏单元,‌便于开发和调试。 阅读详情

相关推荐

从8/16位MCU到32位ARM的迁移实战:以PIC32CM为例

在嵌入式系统开发中,微控制器(MCU)的架构升级是提升产品性能与功能的关键路径。其核心原理在于从传统的8/16位架构转向基于ARM Cortex-M内核的32位架构,这带来了计算能力、内存寻址空间和外设集成度的数量级提升。这种迁移的技术价值在于突破资源瓶颈,支持运行更复杂的算法、通信协议栈和实时操作系统,从而为产品注入物联网、图形界面等现代功能。典型的应用场景包括工业控制、消费电子和智能设备,这些领域对处理速度和功能扩展性有持续增长的需求。本文聚焦于将经典PIC16F/PIC18F系列项目迁移至PIC32C

weixin_33816946的博客 445

通过gdb移植搭建arm单板交叉调试环境

对于嵌入式开发来说,嵌入式开发板经常需要使用 gdb 进行源码级调试,或者对于安全测试人员来说,也需要使用 gdb 进行二进制程序的调试。gdb 交叉调试提供了这样的环境,可以在目标单板上启动 gdbserver 进程,本地主机使用 gdb 作为客户端连接。 为了更好的调试程序,远程单板和本地主机的 gdb 最好统一版本。这里使用源码编译的方式,编译出客户端程序 arm-linux-gdb 和服务端程序 gdbserver。常见的配置选项有以下几种 --host:指定了编译后的程序需要在哪里运行 --ta

个人笔记 2061

从8位MCU到32位Arm的平滑迁移:以PIC32CM为例的实战指南

在嵌入式系统开发中,微控制器(MCU)的选型与迁移是工程师面临的核心挑战。随着物联网和智能设备对功能、性能及安全性的要求不断提升,传统的8位MCU在资源与生态上逐渐显现瓶颈。其原理在于,8位架构受限于有限的寻址空间、处理能力和外设资源,难以高效支撑复杂应用。迁移至基于Arm Cortex-M内核的32位MCU,如Microchip的PIC32CM系列,能带来显著的技术价值:它不仅提供了更大的内存空间、更高的主频和更丰富的外设,更重要的是引入了成熟的Arm生态系统,包括标准化的软件接口(如CMSIS)、强大的

weixin_30653023的博客 347

MCU进异常调试小技巧--以ARM内核为例

调试板子总遇到莫名其妙进异常的情况,我们可以有哪些手段来定位现场?今天就接着前几天介绍内核单元的文章继续聊聊ARM内核的异常以及错误处理。

认真搞搞汽车MCU 2950

从8位MCU迁移到32位Arm:PIC32CM实战指南与思维转换

在嵌入式系统开发中,微控制器(MCU)的选型直接影响产品的性能与功能上限。随着物联网、智能硬件等应用对处理能力、外设资源及功耗管理的要求日益提升,传统的8位MCU在内存、主频及生态支持上逐渐显现局限。其原理在于8位架构的地址空间、中断机制及开发工具链较为简单,虽成本低廉,但难以高效支撑复杂任务。技术价值上,迁移至基于Arm Cortex-M内核的32位MCU(如Microchip PIC32CM系列)能显著提升性能,同时保持较低的学习与硬件成本。这类芯片提供更大的内存、更高的运行效率、丰富的外设(如高速AD

cnmik42448的专栏 326

分享第一次接触Atmel AVR微控制器开发板

本人从事电子行业已有好几个年头,之前做过手机的开发、做过物联网芯片的技术支持,不能说对电子行业精通,也算马马虎虎有些见识了解,电子产业,目前硬件性能过胜是众所周知的事,好比在大家都比较熟知的单片机领域,技术、工艺提升是飞快迅猛,尤其以32位ARM单片机为首,似乎处于势不可挡的趋势。 但是,要知道很多东西都只是是表现,尽管新闻网络讲32位ARM单片机吹得天花乱坠,但是不得不说,在目前国内珠三角地区

ladouyu的专栏 2524

嵌入式开发板调试方式完全指南:串口/SSH/Telnet及其他方式对比

想象我们要调试智能手环的计步功能,或是给树莓派烧录新的操作系统镜像。就像医生需要听诊器诊断病人,工程师也需要专用工具与开发板"对话"。本文将详解最常用的三种调试方式,并拓展其他实用方法。

汽车电子软件领域知识分享 2087

ARM交叉编译gdbserver并远程在线调试

arm-linux平台。5、生成完整的makefile,新建full_install,执行 ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- CC=arm-linux-gnueabihf-gcc --prefix=/home/geyuxi/Documents/full_install。如果--host和--build不同,是交叉编译;

wangjie36的博客 3168

嵌入式养成计划-52----ARM--开发板介绍--相关硬件基础内容介绍--GPIO讲解

ARM开发板介绍,相关硬件基础介绍,GPIO讲解

This code no bug! 1397

ARM开发板调试连接

KEIL与下位机开发板进行连接。对连接步骤详细介绍。

基于AR M芯片的嵌入式交叉调试系统

本文介绍了疆AG交叉调试技术和ARM芯片的片上调试构架,在此基础上给出了一种嵌入式交叉调试系统的设计及 实现方法。该设计以GDB调试器作为人机调试界面,主机运行Linux操作系(Windows操作系统需要安装Cwgiwin插件)目标机采用SamSung$3C4510B开发板。

ARM Cortex-M 系列 MCU 芯片选型

最近有需求,研究了一下 ARM Cortex-M 系列 MCU,从各个公司的网站查来查去,比较麻烦。为了后续节省一些时间,将一些信息整理在此,省得再翻来覆去的找,也方便需要的小伙伴。

weixin_43978579的博客 4306

【验证技能树】UVM 源码解读01 -- UVM本质上就是软件工程方法论在芯片验证领域的应用

文章摘要: UVM(通用验证方法学)是基于SystemVerilog的芯片验证框架,采用组件化、面向对象和事务级抽象设计。其核心在于职责分离与数据流,通过Driver、Monitor、Sequencer等模块协作实现高效验证。UVM强调复用性、可扩展性和可维护性,类似软件工程的模块化与低耦合原则。理解其体系结构比记忆API更重要,有助于灵活组合组件并提升验证效率。UVM不仅是工具,更融合了软件工程思维,推动验证工作向自动化、系统化发展。掌握UVM底层逻辑能优化验证环境设计,适用于从IP到SoC的多层级验证场

qq_45869788的博客 1039

32位入门级MCU(ARM Cortex-M3内核)中的六边形战士—STM32F103系列

许多芯片界的龙头企业,如意法半导体(ST),恩智浦(NXP),瑞萨(Renesas)、英飞凌(Infineon)、德州仪器(TI)等,都有设计生产出不同系列的MCU的产品,内核也是五花八门,有ARM的,有RSIC-V,还有自家内核的。‌如果只有一组VDD,‌当负载增大时,‌VDD电流产生突变,‌路径距离越长,‌产生的压降越大,‌电源波动越明显。在这款‌芯片的设计中,pad的数量要大于外部引脚的数量,‌是为了满足电源供应、‌信号传输和接地连接的多方面需求,‌以确保芯片的正常工作和性能发挥。

2401_86840954的博客 2101

OnePlus救砖指南:线刷包与OTA全量包实战解析

本文详细解析了OnePlus手机救砖的两种核心方法:线刷包与OTA全量包。针对手机变砖的不同状况(如黑屏、能进Recovery等),文章提供了清晰的判断标准和对应的实战操作指南。重点阐述了线刷包作为终极救砖手段的底层原理与详细步骤,并对比了OTA全量包作为温和修复方案的使用场景与卡刷流程,旨在帮助用户安全、有效地恢复手机系统。

weixin_28312391的博客 1315

【没有网络,安装python包】如何从 PyPI 下载并安装 Plotly 的离线包

在某些情况下,您可能需要在没有互联网连接的环境中安装 Python 包,例如在飞机上、在某些受限制的网络环境中或在需要离线安装的场景下。以下是如何在 PyPI(Python Package Index)下载 Plotly 包并进行离线安装的详细步骤。

赖德发的博客 1102

学32位MCU需要有51单片机基础吗?

本文将从技术差异、开发环境、学习难度和市场就业这四方面对比32位MCU与51单片机。先学哪一个,看似是一个选择题,但二者并不冲突,最好全面掌握。正所谓技多不压身,学的技术越多,选择就越多,越灵活。但如果时间有限,精力有限,那就需要评估效率,找到最优解。学32位MCU需要有51单片机基础吗?这个大问题可以分解为三个小问题。在回答这三个问题之前,我们必须先全面了解32位MCU和51单片机的现状,并从各项指标的对比中来寻找答案。

qq_43608728的博客 1625

开源分享:苹果群控手机源代码解析与实战

本文介绍了苹果设备群控的基本原理和实现方法,重点解析了基于Python+Appium的群控系统构建。主要内容包括:1)设备连接管理技术(USB/Wi-Fi);2)自动化控制方式(WDA/AppleScript/Appium);3)实战演示了通过Python脚本实现多设备同时控制,涵盖环境配置、代码解析和功能说明;4)提出了多线程、图像识别等优化方向。文章为开发者提供了快速上手的群控方案,适用于自动化测试、批量管理等场景,并推荐了相关开源项目参考。

2403_88540309的博客 1343

深入浅出ARM7与STM32调试技巧:MCU日志输出全解析

本文深入探讨基于ARM7架构的STM32F1系列MCU的调试技术,重点讲解串口日志输出、printf重定向、日志级别设计及J-Link与ST-Link工具对比。针对无ITM/SWO支持的限制,提出UART+调试器协同方案,并介绍DMA异步日志等高级技巧,帮助开发者构建高效、可复用的嵌入式调试体系。

brandy的博客 857

旋转矩阵推导

推导前提: 坐标使用右手坐标系,角度逆时针旋转为正。 绕X轴旋转角度为 俯仰角 即Pitch 绕Y轴旋转角度为 偏航角 即Yaw(Head) 绕Z轴旋转角度为 翻滚角 即Roll 一、平面二维坐标点的旋转 如右图所示,根据三角函数关系,可以列出向量OP与OP’的坐标表示形式: x = |OP|•cosα x′ = |OP|•cos(α+β) y = |OP|•sinα y′ = |OP|•sin(α+β) 将P′(x′,y′)表达式展开: x′ =

suixinger_lmh的随笔 1384

32位MCU开发方案的设计实例有哪些?

NXP i.MXRT系列MCU开发方案包括选择合适的MCU型号、配置MCU的参数、编写程序代码、进行调试和测试等步骤。ARM Cortex-M系列MCU开发方案包括选择合适的MCU型号、配置MCU的参数、编写程序代码、进行调试和测试等步骤。PIC32系列MCU开发方案包括选择合适的MCU型号、配置MCU的参数、编写程序代码、进行调试和测试等步骤。了解MCU的特性和应用领域:在选择MCU型号时,需要了解不同型号的MCU的特性和应用领域,以选择最合适的MCU来满足应用需求。

kaikaile1995的博客 467

Python爬取小红书种草商品评论数据:从入门到实战全攻略(附反爬+情感分析方案)

Python爬取小红书种草商品评论数据,核心是“抓包找到正确的接口+处理登录验证+合理的反爬策略”。新手不用一开始就追求多笔记批量爬取和情感分析,先把单笔记的评论抓取和存储跑通,再逐步扩展功能。我做的这个系统现在每天帮朋友爬取3-5款美妆产品的评论,自动做情感分析和关键词提取,她再也不用手动翻评论了,效率提升了80%。如果你们在开发中遇到具体问题,比如接口找不到、Cookie过期、IP被封,都可以在评论区留言,我会一一解答。后续也可以出一期小红书笔记种草数据爬取的教程,帮助大家更全面地分析竞品数据。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1347

32位MCU选型关键因素,国内外MCU品牌简介官网

32位MCU选型关键因素

1618

[Dify] HTTP 请求节点总是调不通?先把请求头、参数、变量和返回 JSON 拆开查

这篇文章围绕 Dify HTTP 请求节点调不通、接口能通但流程不稳定、返回 JSON 后续节点读不到等问题展开,从 Method、URL、Header、Body、变量映射和返回字段提取几个角度梳理排查顺序。适合正在把 Dify Workflow 接入企业微信、CRM、工单系统或内部接口的读者阅读,帮助你把接口调用从一次性跑通推进到可复用、可验证的业务流程。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 3944

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

基于Cortex-M3内核的MM32W373 MCU蓝牙开发板

简介 Insight系列MM32 eMiniBoard (以下简称eMiniBoard)开发板,配合ARM Keil/IAR 集成开发环境、MM32 Program编程软件、MM32 FDS固件开发平台与内嵌的MM32-LINK-OB仿真器,构成灵动MM32 Cortex-M0/M3 MCU完整的开发生态。 图1. eMiniBoard系列开发板图片 ●eMiniBoard MB-021基于Co...

EVERSPIN的博客 1179

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: QT5.9.9+ARM交叉编译开发环境搭建【详细步骤】
下一篇: 解决Qt软件执行时 “/lib64/libc.so.6: version `GLIBC_2.18‘ not found (required by /lib64/libstdc++.so.6)“的问题
驯龙高手_追风
博客等级 码龄7年 8018粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

驯龙高手_追风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值