拓冰建站拓冰建站
首页 / 资讯中心 / 正文

SWD连接失败排查指南:以BlueNRG-332AC为例的完整解决方案

搞嵌入式的朋友一定遇到过这种场景板子画好了、程序编译过了、信心满满准备烧录结果调试器啪一下弹出一行红字——“Cannot access Target”。我最近在调 BlueNRG-332AC 这颗 BLE SoC 时就被这个 SWD 连接问题卡了整整一天。说多了都是泪但这次排查过程本身挺有代表性的趁热把 “Unable to Connect to BlueNRG-332AC via SWD” 的完整思路和解决办法整理出来给后面踩坑的朋友省点时间。BlueNRG-332AC 是 ST 新一代低功耗蓝牙 SoC基于 ARM Cortex-M 内核内部集成 BLE 射频、协议栈和 Flash通常通过 SWD 接口烧录和调试。SWD 是 ARM 定义的两线调试协议只要 SWDIO、SWCLK 两根线加上地线调试器就能访问芯片内部。对于刚接触这颗芯片的朋友来说SWD 连不上几乎算得上第一个要翻的车。这篇文章以 ST-Link 加 STM32CubeProgrammer 为例顺带补充 Keil 和 IAR 里的对应设置帮你尽量短时间里定位问题。1. 故障现象与排查思路1.1 你遇到的报错到底在说什么我先列一下这次实际遇到的报错大家可以自己对号入座。STM32CubeProgrammer 连接时报错常见的有 “Error: Connection error (target is not responding)”“Error: No STM32 target found”“Error: Target not found”。Keil MDK 调试时通常报 “Cannot access Target. Please verify Lock/Unlock the device and the connection settings.”IAR EWARM 则报 “Fatal error: Failed to connect to CPU”。表面上这些报错长得不一样底层原因往往是同一件事调试器通过 SWD 协议在芯片上没拿到预期响应。SWD 连接本质上是一个“握手”过程——调试器先发一组固定的线复位序列和启动序列然后读取目标芯片 Debug Port 的 IDCODE。芯片如果正常回应说明链路是通的回应不了后面什么都免谈。所以排查目标很直接把 SWD 这条链路从调试器到芯片每一环都走一遍。1.2 排查方向从硬件到软件的顺序我的习惯是严格按硬件、固件、工具、协议这个顺序去查不跳步。先花两分钟检查接线和供电能排除掉大约六成问题。然后再去看调试器固件、驱动和工具的连接参数。最后才上逻辑分析仪抓 SWD 波形。如果你一上来就怀疑芯片坏了大概率会发现芯片活得好好的是别的地方出了岔子。具体排查顺序先放个提纲后面每一节详细展开第一步检查硬件确认供电、地线、SWD 引脚电平。第二步升级 ST-Link 固件确认驱动正常。第三步调整工具连接模式Normal / Hot Plug / Under Reset和 SWD 频率。第四步考虑芯片读保护、程序禁用 SWD 的特殊情况。第五步用逻辑分析仪看波形确认协议层面是否正常。2. 硬件层面SWD 接线、供电和复位90% 的问题都在这2.1 SWD 五根线少一根都容易出事先看最蠢但最常见的错误接线。SWD 标准接口通常有四根线SWDIO数据线、SWCLK时钟线、GND地线、VCC参考电平ST-Link 靠 VCC 检测目标板电压所以建议接上。另外强烈建议把 NRST 复位线也接上原因后面单独说。接线常见的坑有三个。第一SWDIO 和 SWCLK 接反这两根线在不同开发板上的排针顺序不完全一样接反了调试器完全没反应。第二GND 没接调试器的参考地必须和目标板一致否则信号电平根本对不上。第三用杜邦线飞线太长SWD 频率本身不算高但十几厘米的杜邦线悬空飞线信号反射和干扰足够让连接失败这时候把频率调低到 1MHz 以下通常能缓解。还有一点容易被忽略SWDIO 在板级设计上往往要求有上拉电阻SWCLK 要求有下拉电阻。BlueNRG 系列有些参考设计把这俩电阻做在芯片内部了但如果是抄板或者用模组最好还是确认一下引脚电平正常。我遇到过一块板子SWDIO 对地只有 0.6V查了半天发现是上拉电阻没焊芯片内部上拉太弱拉不回来补焊一个 10k 电阻就好了。注意ST-Link/V2 和 ST-Link/V3 的引脚定义不同V3 的 SWD 口还多了串口等复用功能接线前务必看一眼丝印和官方文档别凭印象对色。2.2 供电方案不合理导致的连接失败第二个高发原因是供电。调试器虽然能通过 ST-Link 的 3.3V 引脚给目标板供电但输出电流能力非常有限一般只有几十到几百毫安。BlueNRG-332AC 本身功耗不高但目标板上往往还有 Flash、传感器、LED、电平转换芯片一上电电流就超了电压被拉低芯片工作不稳定SWD 自然连不上。我的建议是目标板始终采用外部独立供电ST-Link 只接 SWDIO、SWCLK、GND以及用于电平检测的 VCC 引脚。注意这里的 VCC 不是用来给板子供电而是告诉调试器目标板电压是多少。然后上电后用万用表量一下 VCC 对地电压确认在芯片工作范围内。BlueNRG 系列一般是 1.7V 到 3.6V 宽压供电但不同型号具体范围需要以数据手册为准板子设计成 3.3V 的话量出来应该在 3.0V 到 3.6V 之间。另一个容易翻车的是共地问题。如果你的目标板用电池供电或者单独用 USB 供电而调试器插在电脑上两边的 GND 没有连起来信号电平永远对不齐。这种情况下 SWD 偶尔能连上但极不稳定程序跑着跑着调试器就掉线。解决办法很简单把目标板 GND 和调试器 GND 用一根线连起来。2.3 NRST 复位引脚最容易忽略的救命线先说结论遇到 SWD 连不上建议把 NRST 也接到调试器上。NRST 的作用不只是硬件复位它是 SWD 连接失败的“救命稻草”。当芯片处于死循环、休眠、或者 SWD 引脚被复用成普通 GPIO 时调试器可以通过拉低 NRST 让芯片停在一个已知状态然后再发起 SWD 连接这就是后面要说的 Under Reset 模式。NRST 这块有两个常见坑。一是 NRST 上有大电容有些板子在复位脚上放了 100nF 甚至 1uF 的电容抗干扰但这会让复位信号上升沿变缓调试器等在边上觉得芯片一直不复位连接超时。遇到这种情况可以临时撬掉电容或者把工具里的复位延时调大。二是 NRST 被外部电路拉低比如复位芯片或按键电路接法不对NRST 一直处于低电平芯片一直在复位状态永远进不了正常运行状态SWD 肯定连不上。排查方法很简单用万用表量 NRST 对地电压。正常工作时应该能拉到接近芯片供电电压比如 3.3V。如果量出来一直是 0V 或者明显偏低先查复位电路。经验之谈很多 BlueNRG 开发板出厂时 NRST 是悬空的设计者认为调试器可以不接。但如果芯片烧过程序而且程序里配置了低功耗模式NRST 不接会导致 SWD 很难连上因为调试器没法唤醒芯片。我的原则是五根线SWDIO、SWCLK、GND、VCC、NRST全接别省这一根线。3. 软件层面ST-Link 固件、连接模式和芯片配置硬件检查完还连不上接下来重点看软件和工具配置。3.1 ST-Link 固件版本太旧认不出新芯片ST-Link 是个很神奇的调试器硬件从 V1 到 V3 用了很多年但插上电脑能不能用很大程度上取决于内部固件。固件负责桥接 USB 和 SWD 协议芯片型号识别逻辑也在固件里。如果你手里的 ST-Link 固件比较老它可能压根不认识 BlueNRG-332AC 这颗新芯片连接自然失败。解决办法是升级固件。ST 官方的升级工具老一点的 ST-Link Utility 已经停止维护现在统一用 STM32CubeProgrammer 里的 Firmware Upgrade 功能。打开 STM32CubeProgrammer点右上角 Firmware UpgradeUSB 识别到 ST-Link 后点 Upgrade 等它刷完然后重新拔插 ST-Link 再试连接。顺带说一句驱动。Windows 下 ST-Link 使用 WinUSB 驱动正常插上后会显示 “STMicroelectronics STLink dongle” 设备。如果设备管理器里是黄叹号多半是驱动有问题可以右键更新驱动程序或者去 ST 官网装最新驱动包。macOS 和 Linux 下一般是内核自带的 CDC 驱动问题不大。3.2 连接模式与 SWD 频率设置的讲究工具连接目标芯片时有几个关键参数连接模式、复位模式、SWD 频率。这三个参数组合不对连接成功率会明显下降。以 STM32CubeProgrammer 为例连接页面里需要关注ModeNormal / Hot Plug / Under ResetFrequency4MHz / 1.8MHz / 1MHz / 更低Reset modeHardware reset / Software reset / Core reset 等我第一次连新板子时推荐的组合是Mode 选 Hot Plug热插拔不主动控制复位Frequency 选 1MHz低速更稳等连上后再调高。如果 Hot Plug 失败切换 Under Reset 模式这时候需要 NRST 接线。为什么频率要调低SWD 协议本身不要求很高频率频率越高对线路质量要求越苛刻。在杜邦线加面包板的场景下4MHz 经常连不上降到 1MHz 甚至 100kHz 就稳定了。这不是玄学本质是信号完整性问题频率高了反射、串扰都会被放大。Keil 里面路径是 Options for Target - Debug - Settings右侧 Connect 下拉框有 Normal / with Pre-reset / under ResetMax Clock 里可以选 SWD 频率。IAR 里是 Project - Options - Debugger - ST-LINKReset 选项选 Normal / Software / Hardware / Core。不同工具名词不一样但道理相同。3.3 芯片型号、Flash 算法与读保护前面都排除完还不行的回到工具本身看看配置问题。第一芯片型号选对没有。STM32CubeProgrammer 里如果选的是 STM32 型号去连 BlueNRG-332AC大概率连不上——虽然 SWD 底层是通用的但工具会按选的型号去匹配调试组件和 Flash 算法型号不匹配会握手失败或者烧录失败。BlueNRG 系列在工具里是单独列出来的需要更新到最新版本。第二Flash 烧录算法。BlueNRG-332AC 的 Flash 算法由工具链提供。如果用的 Keil需要安装对应的 Device Family Pack也就是 DFP如果用 STM32CubeProgrammer算法随工具本身发布但版本要够新。我见过一个典型案例Keil 能识别到 SWD IDCODE但一烧录就报 “Error: Flash Download failed - Target DLL has been cancelled”查了半天是 DFP 版本里没有这颗芯片的 Flash 算法更新 DFP 后解决。第三读保护 RDP。如果芯片之前被设置过读保护SWD 连接也会失败或者只能连上但无法读写。STM32CubeProgrammer 会提示类似 “Error: RDP level is 1” 的信息。这时可以全片擦除并解除保护但注意解除读保护会把 Flash 内容全部清空。这是芯片的防抄板机制在起作用不是异常。4. 深入 SWD 协议从连接失败到读取 PC 寄存器如果说前面几节是排查技巧那这一节把 SWD 背后那点事讲明白。懂一点协议层排查起来会非常有底气。4.1 SWD 协议的基础DP、AP 和 CoreSightSWDSerial Wire Debug是 ARM 定义的调试接口全称 Serial Wire Debug用两根线替代传统 JTAG 的四到五根线。它的工作方式有点像“一主一从的慢速 SPI”调试器是主机目标芯片是从机时钟由调试器产生数据在 SWDIO 上双向传输。但 SWD 和 SPI 有一个本质区别它不是一个简单的寄存器读写总线而是一套分层的调试访问架构。最底层是 Debug PortDP调试器通过 DP 访问芯片的调试系统DP 之上挂着 Access PortAPAP 又连接 CoreSight 调试组件总线比如 ARM 内核的 Debug Core Register 和存储器总线。CPU 的寄存器PC、LR、SP在调试器眼里不是直接的内存地址而是要经过 DP 到 AP 到 CoreSight ROM Table 再到 Debug Core Register 这条路径去访问。这套架构有什么用最直接的一点即使 CPU 跑飞了、进了 HardFault、或者死循环了调试器照样能通过 SWD 访问内核寄存器。我们在测试中经常通过读取 PC程序计数器寄存器来看程序到底死在哪一行。这也是“arm swd协议读取pc寄存器”这个需求的实际应用场景。4.2 实战通过 SWD 读取 PC 寄存器定位卡死位置如果 SWD 能连上但程序运行不正常比如跑着跑着进 HardFault第一件事就是读 PC 和 LR。在 Cortex-M 内核里读取 PC 需要用到几个调试寄存器我把关键信息整理成一张表寄存器地址用途DHCSR0xE000EDF0调试控制与状态写入解锁键和使能调试DCRSR0xE000EDF4内核寄存器选择选择要读写的寄存器编号DCRDR0xE000EDF8内核寄存器数据读出或写入的数据操作流程大致是往 DHCSR 写 0xA05F0001使能调试。0xA05F 是解锁密钥bit0 是 C_DEBUGEN。往 DCRSR 写 0x0000F000表示要读取 R15也就是 PC。低 7 位的 0x0F 对应 R15bit16 是 1 表示读请求。从 DCRDR 读出 32 位数据这个值就是当前 PC。拿到 PC 后去反汇编窗口或者 map 文件里搜这个地址就能定位到卡住的代码。实际操作中调试器界面里点一下“暂停”按钮本质上就是在执行类似流程。但如果你想自己在脚本里做自动化测试比如用 PyOCD、OpenOCD这套寄存器操作就非常实用了。而且这种读取不依赖目标芯片是否运行用户程序即使程序把中断全关了只要调试连接还活着就能读到 PC。提示如果你发现“暂停”后 PC 停在 0xFFFFFFFE 或 0xFFFFFFFF 这种地址说明 PC 数据无效多半是 CPU 已经不在正常执行状态比如已经复位过、或者进入深度睡眠。这时候配合读取 LR 和 SP以及做栈回溯能查到更多线索。4.3 用逻辑分析仪抓波形SWD 到底通没通如果你已经调到接线没问题、供电正常、工具配置也正确还是连不上直接上逻辑分析仪看波形。我个人觉得这是最硬核也最有效的排查手段。SWD 连接建立时调试器发出的波形有明确的协议特征。先用低速抓 SWDIO 和 SWCLK比如 100kHz 到 1MHz观察几个点有没有一串高低电平翻转序列SWD 连接的起始是“线复位”SWDIO 被拉低至少 50 个时钟周期再拉高至少 2 个周期然后是 JTAG-to-SWD 切换序列。如果这个序列都没有说明调试器根本没发起连接或者逻辑分析仪触发条件不对。有没有响应正常的 SWDIO 是半双工调试器发送请求后有短暂的总线周转时间然后芯片会把 ACK 和数据放到 SWDIO 上。如果抓到请求但没有任何响应说明链路是通的但目标芯片没有应答问题多半在芯片状态或工具配置上。波形干净吗SWCLK 和 SWDIO 上如果有一堆毛刺、上升沿缓慢、幅度不够说明电气连接有问题比如线太长、接触不良、上拉电阻缺失。实测中价格便宜的 8 通道逻辑分析仪采样率 24MHz 左右就够用了。SWD 频率设成 1MHz 时至少用 4MHz 采样推荐 8 到 12MHz。触发用上升沿或者 SWDIO 下降沿比较容易逮住连接序列。5. 芯片锁死与特殊恢复技巧5.1 RDP 读保护导致连接失败前面提到过 RDP 读保护这里展开细说。BlueNRG 和 STM32 一样支持 Flash 读保护分为 Level 0无保护、Level 1禁止读 Flash、Level 2完全保护不可降级。如果你的板子是上一手留下的或者出厂时被烧录工具设置了保护那 SWD 连接时会有以下表现能识别到芯片 ID但无法
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门