STLink驱动与OpenOCD联合调试技巧

AI助手已提取文章相关产品:

STLink与OpenOCD联合调试:从零搭建高效嵌入式开发体系

在当今的嵌入式世界里,我们早已不再满足于“烧进去就能跑”的粗放式开发。随着产品复杂度飙升——多核架构、RTOS系统、低功耗模式、安全启动……传统的IDE图形化调试器显得越来越笨重,甚至成了效率瓶颈。你有没有试过,在CI流水线里因为无法自动化触发调试流程而不得不手动验证?或者在远程维护客户设备时,只能干瞪眼看着日志却无从下手?

这时候,一个真正灵活、可编程、跨平台的调试方案就显得尤为重要了。

STLink + OpenOCD + GDB 这个黄金三角组合,正是为解决这些问题而生的。它不仅让你摆脱厂商IDE的束缚,还能构建出一套完全可控、脚本驱动、支持远程操作的现代化调试体系。而这套体系的核心价值,远不止“不用Keil或STM32CubeIDE”那么简单。

想象一下这样的场景:
- 你的CI服务器自动编译完固件后,直接通过SSH连接到测试板,用OpenOCD完成烧录+运行+断言检查;
- 你在千里之外,通过内网穿透工具连接到客户的工控机,实时查看MCU内部变量状态;
- 你在一个双核STM32H7上,同时监控M7和M4两个核心的执行流,分析它们之间的数据同步问题;

这些听起来像是“高级玩家”才玩得转的操作,其实只要掌握了OpenOCD的基本原理与GDB的协同机制,每个人都能轻松驾驭。


构建稳定可靠的跨平台调试环境

要让这套系统真正落地,第一步就是确保无论是在Windows、Linux还是macOS上,都能一致地识别STLink并建立通信链路。这看似简单,实则暗藏玄机。很多开发者卡住的第一步,往往不是代码写错了,而是 驱动没装对 ,或者 权限没配好

Windows:别再被“未签名驱动”坑了!

很多人第一次插上STLink时,会发现设备管理器里出现黄色感叹号,提示“该设备无法启动”。原因很简单:Windows默认开启了驱动强制签名,而部分旧版STLink驱动(尤其是非官方克隆版)并没有微软认证的数字签名。

这时候怎么办?难道真要去重启进BIOS关掉签名验证?当然不是!有个更优雅的办法——使用 Zadig 工具将STLink绑定到通用的 WinUSB 驱动上。

👉 Zadig下载地址

打开Zadig,选择你的STLink设备(通常显示为 ST-LINK/V2 ),确认VID=0483,PID=3748(不同版本略有差异),然后点击“Replace Driver”,目标驱动选 WinUSB

🛠️ 小贴士:如果你不确定自己的STLink型号,可以先用 lsusb (WSL下)或设备管理器里的硬件ID来查。

这样做之后,OpenOCD就可以通过libusb直接访问设备,完全绕开ST官方闭源驱动的限制。而且你会发现,后续即使换到Linux/macOS,也不需要重新学习新的驱动模型——底层都是libusb那一套。

验证是否成功?来一发:

openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg -d2

如果看到类似下面的日志输出,恭喜你,已经打通第一层任督二脉:

Info : STLINK V2J37S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.27V
Info : SWD DPIDR 0x2ba01477
Info : stm32f4x.cpu: hardware has 6 breakpoints

但如果遇到 libusb_open() failed ,那大概率是权限问题,或者Zadig没生效。试试以管理员身份运行命令行,或者拔插一次设备看看。

📌 常见陷阱提醒:
- 使用劣质USB线缆导致枚举失败(一定要带屏蔽层!)
- 多个STLink接入时设备混淆(建议配合udev规则命名)
- BIOS中启用了“USB selective suspend”,造成间歇性断连


Linux:udev规则才是关键!

Linux不需要传统意义上的“安装驱动”,因为它原生支持USB设备。但有一个致命细节: 普通用户默认没有权限读写USB设备节点

不信你可以试试不加sudo运行OpenOCD,大概率会报错:

Error: Unable to open ftdi device: Operation not permitted

这不是OpenOCD的问题,也不是libusb的问题,而是Linux的安全策略在起作用。

解决方案也很明确: 配置udev规则 ,给特定VID/PID的设备赋予合适的权限。

创建文件 /etc/udev/rules.d/99-stlink.rules

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", MODE="0666", GROUP="plugdev", SYMLINK+="stlinkv2-1_%n"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0666", GROUP="plugdev", SYMLINK+="stlinkv2_%n"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3742", MODE="0666", GROUP="plugdev", SYMLINK+="stlinkv1_%n"

解释一下这几个字段:
- SUBSYSTEMS=="usb" :匹配USB子系统事件
- ATTRS{idVendor} idProduct :就是STLink的厂商和产品ID
- MODE="0666" :允许所有用户读写(生产环境建议更细粒度控制)
- GROUP="plugdev" :把设备归到plugdev组,记得把你当前用户也加入这个组: sudo usermod -aG plugdev $USER
- SYMLINK :创建固定别名,避免设备编号变化影响脚本调用

保存后刷新规则:

sudo udevadm control --reload-rules
sudo udevadm trigger

再插一次STLink,执行:

lsusb | grep -i st

应该能看到:

Bus 001 Device 012: ID 0483:3748 STMicroelectronics ST-LINK/V2

完美!现在OpenOCD可以直接跑了,无需sudo。

💡 进阶技巧:你可以写个Python脚本来做预检:

import usb.core
dev = usb.core.find(idVendor=0x0483, idProduct=0x3748)
if dev is None:
    print("❌ STLink not found")
else:
    print("✅ Found STLink device:", dev)

这种脚本特别适合集成进CI流程,作为前置条件检查。


macOS:Homebrew救我狗命!

相比前两者,macOS的体验反而最顺滑。得益于Homebrew强大的生态,OpenOCD的安装几乎一键完成。

前提是你已经装好了Xcode命令行工具和Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

然后:

brew install open-ocd

Done!👏

macOS不依赖udev,它的IOKit框架会自动处理USB设备的加载和权限分配。只要设备能被正确枚举,OpenOCD基本就能正常工作。

不过为了保险起见,还是建议查一下设备信息:

system_profiler SPUSBDataType | grep -A 5 -B 5 "ST-LINK"

输出示例:

          ST-LINK:
              Product ID: 0x3748
              Vendor ID: 0x0483
              Version: 27.00
              Speed: Up to 12 Mb/sec

确认VID/PID匹配后,就可以启动OpenOCD了:

openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg

⚠️ 注意:某些新版STLink(如V3)可能需要使用 stlink-dap.cfg 而非 stlink-v2.cfg 。如果提示 unable to find a matching interface ,请尝试更换配置文件。

另外,macOS下的OpenOCD配置文件路径可能藏得比较深:
- Apple Silicon Mac: /opt/homebrew/share/openocd/scripts/
- Intel Mac: /usr/local/share/openocd/scripts/

建议使用绝对路径引用,避免找不到文件:

openocd -f /opt/homebrew/share/openocd/scripts/interface/stlink-v2.cfg \
        -f /opt/homebrew/share/openocd/scripts/target/stm32f4x.cfg

深入理解OpenOCD的运行机制

当你输入 openocd -f xxx.cfg 并按下回车的那一刻,背后究竟发生了什么?

我们可以把它看作是一个“翻译官”:一头连着GDB(人类语言),一头连着STLink(机器语言),中间走的是SWD/JTAG协议。

它到底是怎么工作的?

OpenOCD本质上是一个 调试代理服务 (Debug Proxy Server)。它监听两个重要的TCP端口:
- 4444 :telnet接口,用于发送monitor命令(比如reset、flash等)
- 3333 :GDB远程协议端口,供gdb连接进行源码级调试

启动后你会看到:

Info : Listening on port 4444 for telnet connections
Info : Listening on port 3333 for gdb connections
Info : Listening on port 6666 for tcl connections

没错,它甚至还能跑TCL脚本 😅

这意味着什么?意味着你可以从另一台电脑telnet进来执行命令,也可以让GDB跨网络连接调试——真正的远程调试能力,原生支持!


配置文件的秘密:interface与target为何要分离?

OpenOCD采用了一种非常聪明的设计: 接口与目标分离

举个例子:

openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg
  • interface/*.cfg :描述你怎么连上去(用STLink?J-Link?速度多少?)
  • target/*.cfg :描述你要调试谁(是STM32F4?还是GD32VF103?内存多大?)

这种解耦设计带来了极高的复用性。比如你有5块板子都用STLink下载,只需要换target配置即可;反过来,同一块STM32F4板子,你可以用STLink、J-Link甚至FTDI适配器来调试,只需改interface部分。

来看看 stlink-v2.cfg 的内容:

interface stlink
transport select hla_swd
hla_layout stlink
hla_device_desc "ST-LINK/V2"
hla_vid_pid 0x0483 0x3748

关键点解析:
- interface stlink :声明使用STLink类型
- transport select hla_swd :选择High-Level Adapter的SWD模式(比原始JTAG抽象层级更高)
- hla_vid_pid :指定期望的VID/PID,防止误连其他设备

再看 stm32f4x.cfg

source [find target/swj-dp.tcl]
set _CHIPNAME stm32f4x
set _TARGETNAME $_CHIPNAME.cpu
cortex_m coreid 0x2ba01477
$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size 16384

这里有几个重要概念:
- coreid 0x2ba01477 :这是Cortex-M3/M4/M7系列的典型DPIDR值,用来验证是否连上了正确的芯片
- work-area-* :指定一片SRAM区域作为临时工作区,用于加速Flash擦写等操作(否则每次都要走慢速总线)

这种模块化结构使得你可以轻松定制自己的配置文件,比如针对某款定制板专门写一个 myboard.cfg

source [find interface/stlink.cfg]
transport select hla_swd

set WORKAREASIZE 0x8000
source [find target/stm32f4x.cfg]

reset_config srst_only srst_nogate
adapter speed 2000

保存后直接调用:

openocd -f myboard.cfg

是不是清爽多了?


启动失败?别慌,日志告诉你一切

当OpenOCD启动失败时,不要急着重试。加上 -d2 参数开启详细日志,往往能快速定位问题。

例如:

openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg -d2

常见错误信号:
- libusb_open() failed → 权限不足或驱动未绑定
- DAP_INIT: transport not identified → 接线错误或目标未供电
- Polling failed → 时钟速率太高或接触不良

而成功的标志包括:
- SWD DPIDR 0x2ba01477 → 物理连接建立
- Target voltage: 3.27V → 目标板供电正常
- hardware has X breakpoints → 内核识别成功

此外,你还可以通过telnet进入monitor界面手动操作:

telnet localhost 4444
> reset halt
> flash write_image erase firmware.bin 0x08000000
> resume

这些命令非常适合写成自动化脚本,实现一键烧录。


硬件连接的艺术:不只是接几根线那么简单

软件搞定了,接下来是硬件层面的“最后一公里”。

虽然SWD协议只需要4根线(VDD、SWCLK、GND、SWDIO),但每一个细节都可能决定成败。

标准SWD引脚定义

引脚 名称 功能说明
1 VDD 电源参考(可选)
2 SWCLK/TCK 时钟线
3 GND 地线(必须共地!)
4 SWDIO/TMS 数据线
5 RESET 复位线(强烈建议接上)
6 SWO 串行观察输出(用于ITM跟踪)

📌 关键注意事项:
- GND必须可靠连接 :哪怕电压差只有0.3V,也可能导致通信失败
- VDD仅用于检测目标电压 ,不要从中取电!
- RESET引脚建议连接 :尤其在芯片处于低功耗模式时,能显著提升连接成功率
- SWO可用于ITM打印 ,带宽远超UART,且不影响主程序性能

推荐使用标准2.54mm排针+杜邦线,避免飞线接触不良。PCB设计阶段就应该预留10-pin接口,并标注丝印方向。


如何系统性排查连接失败?

别再靠“拔插大法”碰运气了!下面是经过实战检验的诊断流程:

                        ┌──────────────┐
                        │ STLink亮灯吗?│
                        └──────┬───────┘
                               No
                                ↓
                         检查USB线缆/端口
                                ↓
                              Yes
                                ↓
                   ┌─────────────────────┐
                   │ lsusb能看到设备吗? │
                   └──────────┬──────────┘
                              No
                               ↓
             Windows: Zadig绑定WinUSB
             Linux: 检查udev规则
             macOS: system_profiler查看
                               ↓
                             Yes
                               ↓
                  ┌──────────────────────┐
                  │ 目标板供电正常吗?   │
                  └──────────┬───────────┘
                             No
                              ↓
                       检查电源电路
                              ↓
                            Yes
                              ↓
                 ┌─────────────────────────┐
                 │ SWD接线是否一一对应?  │
                 └──────────┬──────────────┘
                            No
                             ↓
                    核对PA13(SWDIO)/PA14(SWCLK)/GND
                             ↓
                           Yes
                             ↓
            ┌────────────────────────────────────┐
            │ OpenOCD是否有Target voltage输出? │
            └──────────────────┬─────────────────┘
                               No
                                ↓
                      可能未共地或NRST悬空
                                ↓
                              Yes
                                ↓
               ┌─────────────────────────────────┐
               │ 是否出现DPIDR和CPU识别信息?  │
               └──────────────┬─────────────────┘
                              No
                               ↓
                    降低adapter speed至1MHz试试
                               ↓
                             Yes
                               ↓
                     ✅ 调试连接成功!🎉

按照这个流程一步步往下走,99%的问题都能定位清楚。


GDB登场:源码级调试才是王道

终于到了最激动人心的部分——用GDB进行真正的源码级调试!

记住一句话: GDB负责“想做什么”,OpenOCD负责“怎么做”

它们是怎么协作的?

GDB本身不会直接跟STLink说话。它通过标准的 Remote Serial Protocol (RSP) 协议,把调试指令发给OpenOCD,由后者转换成SWD时序作用于目标芯片。

整个过程就像这样:

+-------------+     TCP:3333     +--------------+     SWD     +------------+
| arm-none-   |<----------------->|   OpenOCD    |<---------->|   STM32    |
| eabi-gdb    |                   | (on host)    |            | (target)   |
+-------------+                   +--------------+            +------------+
       ↑
       |
   开发者输入
   break main
   continue
   print x

这就是为什么你能一边单步执行C代码,一边看到LED按预期闪烁。


实际调试会话全流程演示

假设你已经编译好了 main.elf 文件,现在要开始调试。

第1步:启动OpenOCD服务

openocd -f myboard.cfg -d2 &

后台运行,等待GDB连接。

第2步:启动GDB并连接

arm-none-eabi-gdb build/main.elf

进入GDB交互界面后:

(gdb) target remote :3333
(gdb) monitor reset halt
(gdb) load
(gdb) continue

逐行解释:
- target remote :3333 → 连接到OpenOCD的GDB服务
- monitor reset halt → 复位并暂停CPU,进入可控状态
- load → 把 .text 段烧录进Flash,自动处理擦除
- continue → 释放CPU,开始运行程序

此时你应该能在目标板上看到预期行为(比如LED闪烁)。


断点的艺术:硬件 vs 软件

GDB支持两种断点:

类型 原理 数量限制 是否修改Flash
硬件断点 ( hb ) 利用FPB单元匹配PC 有限(一般4~8个)
软件断点 ( b ) 插入 BKPT 指令 理论无限

优先使用 hb ,特别是在Flash中的函数打断点时。例如:

(gdb) hb main
Hardware assisted breakpoint 1 at 0x08001234

b 在首次设置时会修改Flash内容,如果Flash有写保护就会失败。

还可以设置 条件断点

(gdb) hb critical_task if counter > 100

只有当全局变量 counter 超过100时才触发,避免频繁中断影响实时性。


寄存器与内存操作:裸机开发的灵魂

在没有操作系统的环境下,直接查看和修改寄存器是家常便饭。

查看所有寄存器:

(gdb) info registers

单独看某个寄存器:

(gdb) print/x $sp
$1 = 0x20004ff0

强制修改(慎用):

(gdb) set $pc = 0x08001000
(gdb) set $r0 = 0xdeadbeef

可用于跳转到特定函数或模拟异常输入。

内存操作更是强大:

(gdb) x/4wx 0x20000000        # 查看4个word
(gdb) set {int}0x20000000 = 1234
(gdb) x/d 0x20000000
0x20000000: 1234

实际应用场景举例:修复HardFault

(gdb) monitor reset halt
(gdb) info registers
(gdb) x/8wx $sp

若发现 $sp 指向非法地址(如0x1ffff000),基本可以判定是栈溢出导致。


monitor命令:通往OpenOCD的大门

monitor 是GDB与OpenOCD之间的桥梁,允许你在调试过程中动态调用OpenOCD原生命令。

常用操作:

(gdb) monitor reset halt
(gdb) monitor flash write_image erase new_firmware.elf
(gdb) monitor mdw 0x20000000 4    # 快速读内存
(gdb) monitor stm32f4x unlock 0 # 解锁Flash

甚至可以结合TCL脚本实现自动化:

proc flash_and_run {} {
    monitor reset halt
    load
    monitor reset run
}

在GDB中加载并调用:

(gdb) source flash.tcl
(gdb) flash_and_run

效率瞬间拉满!


高级玩法:多核调试、自动化、性能优化

当你掌握了基础技能,就可以挑战更复杂的场景了。

多核MCU怎么调试?STM32H7实战

以STM32H747为例,它有两个核心:M7(高性能)和M4(低功耗)。如何同时调试?

答案是:在配置文件中定义两个target!

# stm32h7_dual_core.cfg
source [find interface/stlink.cfg]
transport select hla_swd

set _CHIPNAME m7core
target create $_CHIPNAME.cpu cortex_m -chain-position $_CHIPNAME.cpu \
    -coreid 0 -dbgbase 0xE000E000

set _CHIPNAME m4core
target create $_CHIPNAME.cpu cortex_m -chain-position $_CHIPNAME.cpu \
    -coreid 1 -dbgbase 0xE004E000

启动OpenOCD后,可以用两个GDB客户端分别连接:

# 终端1 - M7
arm-none-eabi-gdb app_m7.elf
(gdb) target extended-remote :3333
(gdb) thread 1

# 终端2 - M4
arm-none-eabi-gdb app_m4.elf
(gdb) target extended-remote :3333
(gdb) thread 2

通过 info threads 可以查看双核状态,实现真正的协同观测。


自动化调试:Makefile + Tcl脚本 = 一键起飞

别再手动敲命令了!封装成脚本才是正道。

编写 debug_boot.tcl

proc program_and_run {firmware_elf} {
    catch {reset init} msg
    flash probe 0
    catch {flash erase_sector 0 0 last}
    program $firmware_elf verify
    bp 0x8000100 ifeq 2 arm
    resume 0x8000000
}

bindto "" global
proc "load-and-run" {} {
    program_and_run $argv
}

整合进Makefile:

debug:
    openocd -f config/stm32h7.cfg -c "script scripts/debug_boot.tcl" -c "load-and-run build/app.elf" -c "shutdown"

一行命令搞定烧录+运行!


性能优化三板斧

  1. 提升adapter speed
adapter speed 4000 kHz

从默认100kHz提到4MHz,烧录速度提升数十倍!

  1. 使用RTT替代semihosting

传统 printf 会停机,严重影响实时性。换成Segger RTT:

SEGGER_RTT_printf(0, "Tick: %lu\n", HAL_GetTick());

配合OpenOCD配置:

rtt start 0x20000000 0x2000

可达500KB/s以上日志带宽,且不停机!

  1. 减少GDB轮询开销

在VS Code等IDE中关闭自动变量刷新,或使用批处理模式:

arm-none-eabi-gdb --batch -ex "target extended-remote :3333" -ex "step" -ex "print x" -ex "quit" app.elf

整体响应速度提升3~5倍。


故障排查清单 & 生产级建议

最后送上一份实战总结:

常见问题速查表

现象 解决方案
Polling failed 检查接线、降速、共地
Target not halted 添加 reset_config srst_only
Cannot write to flash 执行 monitor stm32f4x unlock 0
Permission denied 配置udev规则或Zadig绑定驱动
No device found 检查USB线、重装驱动

生产环境最佳实践

  • 批量烧录 :用Python脚本+多路USB集线器并发编程
  • 固件签名 :Bootloader中集成验签逻辑
  • 远程调试网关 :基于WebSocket暴露安全调试接口
  • 压力测试 :温循、冷启动、长时间运行验证

这套STLink+OpenOCD+GDB的调试体系,不仅是技术选择,更是一种工程思维的体现: 透明、可控、可扩展

当你有一天能在凌晨三点通过SSH修复客户现场的bug时,你会感谢今天花时间掌握这一切的自己。💻🔧🚀

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

您可能感兴趣的与本文相关内容

<think>好的,用户想查找STLink下载调试器的使用说明,需要教程或官方文档。首先,我得确认STLink是什么。根据用户提供的引用,ST-LINK是ST公司推出的仿真器,用于调试和编程STM32微控制器。用户提到的ST官方提供了STM32CubeIDE和GDB server,还有开源的stlink库工具。 接下来,我应该考虑用户可能需要具体的步骤指南。首先,官方文档是最权威的来源,所以需要引导用户访问ST的官方网站,查找ST-LINK用户手册。另外,STM32CubeIDE是ST的集成开发环境,内置了对ST-LINK的支持,用户可能需要安装和配置这个软件。此外,开源的stlink工具库可能也是一个选项,特别是对于喜欢命令行工具或使用其他操作系统的用户。 用户的问题可能涉及硬件连接、驱动安装、软件配置等方面。需要分步骤说明,比如如何连接STLink到目标板,安装驱动程序,使用STM32CubeIDE进行调试和下载,以及如何使用命令行工具。同时,用户可能遇到常见问题,比如驱动无法识别,连接不稳定等,可能需要提供故障排除的提示。 还需要注意用户的操作系统,因为STLink的支持在Windows、Linux和macOS上可能有所不同。比如在Linux下可能需要使用openocd或者stlink的工具,而在Windows下可能有STM32CubeIDE和ST-LINK Utility。此外,用户是否需要远程调试功能?引用中提到ST提供了GDB server,这部分可能需要额外说明。 最后,生成相关问题需要考虑用户可能的后续需求,比如驱动安装问题、其他仿真器的比较、调试技巧等。需要确保回答结构清晰,步骤详细,并引用官方资源确保准确性。</think>以下是关于ST-LINK下载调试器使用说明的详细指南: ### 一、ST-LINK官方文档获取 1. 访问ST官网支持页面,搜索**UM2576**(ST-LINK/V3系列用户手册编号)[^1] 2. 下载最新版《STM32 ST-LINK Utility用户手册》,包含: - 硬件连接示意图 - 支持设备列表 - 软件配置参数说明 ### 二、硬件连接步骤 $$ V_{ref} = 3.3V \pm 0.1V $$ 1. 接线规范: ``` ST-LINK引脚 | 目标板引脚 SWCLK | SWCLK SWDIO | SWDIO GND | GND ``` 2. 供电模式选择: - 当目标板独立供电时,需断开ST-LINK的$V_{CC}$输出 - 若需通过ST-LINK供电,最大电流不超过500mA ### 三、软件环境配置 推荐使用**STM32CubeIDE**集成开发环境: ```bash # Linux环境驱动安装示例 sudo apt-get install libusb-1.0 sudo cp 49-stlinkv2.rules /etc/udev/rules.d/ ``` 主要功能包含: 1. 固件烧录 2. 实时内存监视 3. 断点调试 4. 性能分析 ### 四、基础操作流程 1. **工程设置**: - 在`Run > Debug Configurations`中创建新配置 - 选择`ST-LINK (OpenOCD)`作为调试协议 2. **调试技巧**: - 使用`Ctrl+Alt+C`打开内存视图 - 设置条件断点:$x > 0x20000000 \&\& y < 5$ ### 五、故障排查 常见问题解决方案: | 现象 | 解决方法 | |------|----------| | 未识别设备 | 更新ST-LINK驱动至最新版 | | 下载失败 | 检查$V_{ref}$电压是否稳定 | | 断点失效 | 验证Flash地址是否可写 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值