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

Nucleo板载ST-LINK妙用:SWD接线调试外部STM32芯片

手里只剩一块Nucleo-U083RC开发板外置ST-LINK又被同事借走可此刻真正要调的是另一颗还没上板的STM32G030F6P6。大多数人会把Nucleo板当成一块能跑示例的板子但它最值钱的部分未必是板载那颗MCU而是左上角那套独立的ST-LINK调试器。这个方案说来不复杂把板载ST-LINK的SWD信号引出来就能给任意一颗支持SWD协议的MCU烧录和调试。接下来我把从硬件改造到软件配置的完整过程以及踩过的几个坑逐一拆开讲。1. 一块Nucleo开发板不只是开发板1.1 板载ST-LINK的隐藏身份Nucleo板上那颗ST-LINK硬件上是一个完全独立的子系统。它的输入是USB口输出是SWDIO、SWCLK、GND、VCC四根信号线再通过板子内部走线连到板载目标MCU的SWD引脚上。也就是说这块板上其实有两颗MCU一颗是左边负责调试的ST-LINK专用MCU另一颗是右边用户手上的目标MCUU083RC本身。二者之间只隔着几根信号线。这套架构的本质是ST-LINK是一台支持SWD协议的任意MCU通用烧录器它根本不关心对面接的是板载那颗U083RC还是用户自己画的一颗G030。只要SWD协议一致、电平匹配、共地正常它都能工作。所以我们要做的只是改变SWD信号的出口方向。1.2 CN2跳线帽整个方案的关键入口在Nucleo-64这类板子上ST-LINK和板载MCU之间有一组跳线帽通常标着CN2。这个跳线帽横跨在SWD信号路径上默认插着两个小帽子把ST-LINK的SWDIO和SWCLK分别连通到板载MCU的对应引脚。这个设计原本的意图是当你不想用板载调试器、改用外部调试器时拔掉CN2跳线帽就可以把板载MCU的SWD信号从ST-LINK侧完全隔离出来又或者你正在做低功耗电流测量不希望ST-LINK通过SWD走线漏电流给目标MCU。但反过来利用一下这个跳线帽恰好成了我们借用调试器的物理分界点拔掉它ST-LINK这侧的信号就空出来了可以把SWDIO和SWCLK引到外部任意MCU上。我一开始以为必须动烙铁才能把这个信号引出来后来发现不需要。拔掉跳线帽之后CN2还有四个焊盘裸露在那里ST-LINK侧的SWDIO和SWCLK信号就在其中两个焊盘上用杜邦线或者直接焊两根飞线就能把调试信号带到板子外面。1.3 这个方案适合谁能解决什么问题这招最适合两类场景。一类是我这种手头调试器紧张的情况一块Nucleo板不仅是一块评估板还是一个救急的独立SWD烧录器。另一类是你手里有多个不同型号的MCU项目在并行开发每个项目都买一个独立ST-LINK显然是浪费而Nucleo板几乎是开发桌上最不缺的东西拿它顶一下绰绰有余。当然这个方案也能覆盖更极客的玩法比如用它去调试一块完全没有板载调试电路的裸芯片系统或者临时给一颗刚焊好的芯片做板级验证。从成本和可实现性来看这比多买一个ST-LINK要划算得多。2. SWD接线里最容易出错的三个细节2.1 四根线的连接与VCC的争议SWD接口最基础的连接是四根线SWDIO、SWCLK、GND、VCC。网上的资料对VCC接不接争论不小有人说只接三根线也能烧录有人说必须接。根据我的实际测试三根线SWDIO、SWCLK、GND在很多情况下确实能连上但如果外部目标MCU是独立供电调试器无法测量目标电平STM32CubeProgrammer经常在连接阶段就报target voltage错误或者出现no target connected这类奇怪问题。我的建议很直接把VCC也接上而且接的是外部目标MCU的电源轨不是板载ST-LINK的3.3V输出。这么做是为了让ST-LINK通过VCC引脚感知目标芯片的电压水平从而正确匹配SWD信号电平。至于给目标板供电用外部目标自己的电源即可甚至可以不从Nucleo板取电。下表是我在调试外部MCU时实际采用的接线关系可以直接照着接。ST-LINK侧目标MCU侧说明SWDIOPA13或芯片SWDIO引脚双向数据线SWCLKPA14或芯片SWCLK引脚调试时钟GNDGND必须共地VCC目标板3.3V电源轨用于电平检测NRST可选目标复位脚连接低功耗目标建议接2.2 电压匹配和供电电流限制电压匹配是新手最容易炸板的地方。SWD信号不是隔离的ST-LINK侧输出的逻辑电平需要和目标MCU的电源电压兼容。目标板是3.3V供电那基本没有风险VCC接3.3V、信号电平3.3V一路畅通。如果目标板是5V系统就要谨慎了虽然很多ST-LINK变体支持5V目标但板载ST-LINK的调试接口不一定电平兼容而且VCC检测方向一旦接错轻则连不上重则烧毁调试器。针对5V目标比较稳妥的做法是目标板自己供电SWDIO/SWCLK之间加电平转换VCC脚只做检测不供电。关于供电电流还有一个经常被忽略的点Nucleo板载ST-LINK不是一个大功率电源它通过USB取电输出能力非常有限。如果你的外部目标板上有数码管、液晶屏、电机驱动这类功耗较高的外设千万不要指望用板载ST-LINK的3.3V去带。老老实实让目标板自己供电调试器只做信号连接互不干扰。2.3 目标MCU的启动模式与复位状态接线完成后还有个容易被忽略的坑目标芯片当前处于什么启动模式。STM32系列通常有BOOT0引脚有的芯片还有BOOT1。如果BOOT0被拉高芯片复位后会进入系统引导程序而不是从用户Flash启动。这时候烧录本身通常不会失败但烧完一复位程序不跑很多人第一反应是烧录出错了其实芯片停在系统BootLoader里。另外如果目标芯片已经进入了低功耗模式比如STOP或STANDBYSWD连接也可能失败。因为核心时钟可能在停止状态调试接口无法响应。这种情况下最好的办法是接上NRST线在连接时按住目标复位键让芯片在复位状态下建立调试会话。这个操作在STM32CubeProgrammer里叫Connect Under Reset后面我会专门讲。3. 硬件改造与接线实操从跳线帽到焊点3.1 拔跳线帽之前先做两件事第一件事是断电把USB线拔下来再操作避免在带电状态下碰触焊盘或插拔跳线防止短路把ST-LINK烧了。第二件事是拍照把CN2跳线帽的原始位置拍下来尤其是你手上有好几块不同型号Nucleo板的时候不同板子的跳线定义可能不完全一样留个底方便还原。接下来就是拔跳线帽。Nucleo-64板子上的CN2通常位于板子左侧中段靠近ST-LINK区域是一组2x2的排针上面插着两个黑色的小跳线帽。处理方式是用镊子轻轻夹住跳线帽两端垂直往上拔不要太用力左右晃否则容易把排针本体晃歪。3.2 把SWD信号引出来的三种方式拔掉跳线帽之后CN2下面空出来四个焊盘。其中两个信号来自ST-LINK侧另外两个是通往板载目标MCU侧的。要找到哪边是ST-LINK侧可以打开Nucleo-U083RC的原理图搜SWDIO这个网络名看它从ST-LINK MCU出来后去了哪个焊盘。一般来说四个焊盘中靠近ST-LINK芯片一侧的两个就是ST-LINK直出信号。具体的引线方式有三种按动手难度从低到高排列直接用2.54mm间距的排针插入CN2的焊盘孔再从排针上飞线出去。这一招最简单不需要焊接但是要注意CN2焊盘孔的间距刚好是标准排针间距插进去后要确保方向正确。用尖头烙铁在CN2背面焊盘上直接焊两根细飞线。这个最稳接触可靠缺点是焊完以后如果想要恢复原状得把飞线拆掉。把跳线帽换成一根短的杜邦线母对母一头插在ST-LINK侧焊盘上另一头直接连到目标板。这只能算是应急方案固定性比较差手一抖就松了。我实测下来最推荐第二种焊飞线。焊的时候烙铁温度设在320度左右先给焊盘上一点锡再把飞线头镀锡快速贴上焊盘一两秒就完成。焊接完成后用万用表蜂鸣档确认ST-LINK侧焊盘和飞线另一端是导通的这一步非常关键能排除虚焊问题。3.3 检查连通性不用急着上电飞线焊好后别急着插USB或者接目标板。先把万用表调到蜂鸣档确认以下三件事飞线到目标板SWDIO之间是通的飞线到目标板SWCLK之间是通的目标板GND和Nucleo板GND之间是通的。这三项检查的目的是把硬件接线问题和软件配置问题隔离开后面排错时能省一半时间。我在第一次做这个方案时跳过了连通性检查结果接上目标板后CubeProgrammer一直报连接失败排查了大半天才发现是飞线焊点虚焊焊盘上那一小坨锡看起来连上了实际内部是断的。3.4 不同Nucleo板型的差异Nucleo-64的CN2跳线帽很好认但Nucleo-32板子比如L432KC的跳线位置和命名不一样Nucleo-144板子又可能有其他辅助跳线。所以拿到一块不熟悉的Nucleo板第一件事永远是去ST官网下载对应的手册和原理图找到ST-LINK和目标MCU之间的跳线网络名再动手。这些差异化的板子核心原理是完全一致的ST-LINK的信号线上会有一个可断开的跳线点找到它断开它从ST-LINK侧取信号接到外部目标。剩下的都是工程细节。4. 软件配置与第一次外接烧录4.1 驱动和工具准备硬件接好之后第一次上电前建议先装好ST-LINK的USB驱动。新版Windows系统大多能自动识别但严谨起见还是建议下载ST官方驱动安装包STSW-LINK009手动安装一遍。装好后插上Nucleo板USB口打开设备管理器能看到一个ST-LINK相关的调试接口设备有时候还会附带一个COM口设备那是虚拟串口后面章节会用到。烧录工具我用的是STM32CubeProgrammer这个工具已经取代了老一代的STM32 ST-LINK Utility界面更清晰还支持命令行操作。如果你电脑上还留着老旧的ST-LINK Utility它其实也能完成类似的工作但新项目建议直接用CubeProgrammer命令行脚本扩展性更好。4.2 CubeProgrammer连接配置打开STM32CubeProgrammer进入右侧的ST-LINK配置区域主要有两个选项要设置接口选择选SWD不要选JTAG因为我们的外部目标板通常只引出了SWD四根线。连接模式选HOT PLUG模式。这个模式下调试器不会主动对目标进行复位和供电等待非常适合调试外部独立供电的目标板。配置好后点右上角的Connect按钮。正常情况下下面log区域会出现连接信息显示目标芯片的Device ID、Flash大小、Target voltage电压值。如果Target voltage能读到一个大概3.3V左右的电压说明VCC检测线路正常如果显示0V或者N/A就要怀疑VCC没接好或者目标板没上电。4.3 实际烧录一个程序到外部MCU我这里用一个真实的例子来演示。目标板是一颗STM32G030F6P6独立3.3V供电SWD四根线从Nucleo-U083RC的CN2焊盘引出按前面表格接好。连接成功后我打开编译生成的Blinky程序hex文件点击Download按钮。CubeProgrammer会自动擦除目标Flash写入新程序最后校验。这个过程非常快十几秒就完成了。烧完后给目标板重新上电LED正常闪烁说明程序已经跑起来了。烧录过程中有一个细节值得注意目标板上的Flash起始地址。STM32 G0系列的Flash起始地址是0x08000000一般hex文件自带地址信息bin文件则需要手动填写起始地址。如果你用的是bin文件在烧录界面的Download区域要确认起始地址填对否则程序写进去也跳不到正确位置。4.4 第一次连接时常见的三类提示第一次用外部目标连接CubeProgrammer经常会弹出三类提示这里提前说明遇到时心里有底。No ST-LINK detected说明电脑没识别到Nucleo板上的调试器检查USB线有没有插紧驱动是否安装或者换个USB口试试。部分USB口供电能力差也可能导致ST-LINK枚举失败。Target connection error说明ST-LINK已经和电脑通信正常但与目标MCU通信失败。最常见的原因是接线错误、目标未上电、VCC检测脚没接、或者目标芯片处于低功耗模式。按前面说的用万用表量量接线把NRST线也接上再点Connect Under Reset试试。Read protection 相关提示目标芯片开启了读保护调试器无法访问Flash。这种提示不是连接失败而是芯片被保护了。解除方法下面细说。4.5 STM32 ST-LINK Utility还能干什么虽然ST官方已经不再积极更新ST-LINK Utility但它仍然是一个很轻量的小工具尤其在老的Windows系统上打开速度快界面简单。如果你只是做最简单的烧录和读Flash它还够用。比如上面读保护的问题老工具里也有remove protection的选项功能上没有缺失。不过我的个人建议是新方案一律用STM32CubeProgrammer原因是它把GUI操作和命令行烧录统一了后面做批量烧录用同一套工具更方便不用学两套逻辑。5. 排查链路连接不上时按这个顺序找原因5.1 排查顺序表外部目标连接不上的时候最容易犯的错是乱试。一会儿调频率一会儿换模式折腾半小时也不知道问题在哪。我建议严格按下面的顺序排查从最底层往上走。现象可能原因检查动作电脑识别不到ST-LINKUSB线、驱动、USB口设备管理器看有没有异常设备换线换口CubeProgrammer连不上目标接线错误、未共地、目标未上电万用表量SWDIO/SWCLK/GND通断Target voltage为0VCC检测线没接或目标没供电确认VCC接到目标电源轨量目标VDD电压连接时卡死或超时目标处于低功耗/低时钟接NRST改Connect Under Reset提示读保护错误RDP等级为1确认固件已备份解除保护会全片擦除连接成功但校验失败SWD速率过高或干扰调低SWD速率检查飞线长度5.2 读保护最常见的“连不上”假象读保护RDP是STM32系列里最容易让新手误判为芯片坏了的机制。RDP分三个等级Level 0是不保护调试接口完全开放Level 1是禁止调试接口访问Flash也禁止通过调试口读内存这是大多数商用产品量产时设置的等级Level 2是永久保护一旦设置几乎无法回退芯片基本锁死。如果你拿到一颗已经烧录过且开了Level 1读保护的芯片连接时CubeProgrammer会弹出提示告诉你当前芯片受保护。这时可以选解除保护但代价是整片Flash会被擦除芯片回到出厂状态。如果你的目的是继续用这颗芯片那没问题如果只是想读出里面的固件做逆向这条路基本走不通而且这种行为也不值得提倡。我在调试外部MCU时遇到过一颗已经开了读保护的目标芯片当时程序要紧急升级手头又没有原厂工具最后用CubeProgrammer的remove protection选项全片擦除后重新烧录问题解决。5.3 Connect Under Reset 的适用场景当你发现目标芯片连接不上而且怀疑它处于低功耗状态、死循环状态、或者主时钟配置错误导致调试口失效时就可以启用Connect Under Reset功能。这个功能的工作逻辑是在芯片复位信号有效的瞬间发起SWD连接趁芯片刚从复位中被释放、内核还没跑起来时抢先建立调试会话。使用方法是接好NRST线在CubeProgrammer连接设置里勾选Connect Under Reset然后点Connect。软件会自动控制复位时序多数情况下能救回来。5.4 SWD速率的选择SWD速率不是越高越好尤其是飞线比较长、没有做阻抗控制的时候高频率下信号反射严重连接会不稳定。我倾向于在遇到连接不稳定时把SWD速率从默认的4MHz降到1MHz甚至更低。烧录速度虽然慢一点但成功率高对于调试功能来说完全够用。如果是批量烧录的场景再根据实际飞线长度逐步提高速率找到稳定边界。6. 额外收益虚拟串口与命令行烧录6.1 把ST-LINK的虚拟串口也借过来Nucleo板载ST-LINK通常带一个USB虚拟串口VCP。正常情况下这个串口连接的是板载目标MCU的某个USART引脚。但当我们把CN2跳线帽断开后ST-LINK的VCP通道并没有失效只要找到ST-LINK侧对应的UART TX/RX引脚同样能把它引出来接到外部目标MCU的串口上。具体引脚位置要查原理图不同Nucleo板定义不同。以我手头这块U083RC为例原理图里ST-LINK的VCP TX/RX会有一组明确的网络名顺着网络就能找到对应焊盘或者测试点。把外部目标的UART TX接到ST-LINK的RX目标的UART RX接到ST-LINK的TX注意电平都是3.3V共地已经有了。接线完成后电脑上会出现一个COM口开任意串口终端就能看到外部MCU的调试日志。这里有一个串口配置的小细节值得单独说很多MCU的UART RX引脚默认是浮空输入如果外部没有加上拉电阻空闲状态下RX电平不确定容易收到乱码。所以外部目标连ST-LINK虚拟串口时最好在固件里把UART RX引脚配置成内部上拉输入或者在硬件上加一个10k上拉电阻到3.3V。这也是我实际调试中遇到乱码后查出来的原因之一跟MCU串口接收端口是否有上拉是同一个问题。6.2 命令行烧录批量生产的福音ST-LINK被“借用”来烧录外部MCU这件事在批量生产中还有一种玩法就是命令行脚本。STM32CubeProgrammer自带了一个命令行工具在Windows上叫STM32_Programmer_CLI.exe在Linux上也有对应版本。举个例子要向外部目标MCU烧录firmware.hex并校验一条命令就能搞定STM32_Programmer_CLI -c portSWD modeHOTPLUG -w firmware.hex -v如果要在烧录后设置读保护Level 1加一条选项STM32_Programmer_CLI -c portSWD modeHOTPLUG -w firmware.hex -v -ob RDP0xBB这里将RDP设置为0xBB就是Level 1保护注意这个操作会锁死调试接口的Flash访问权限要确保固件已经没问题再执行。批量生产时把命令写进脚本工人只需要把目标板接到Nucleo板引出的SWD线上双击脚本等结果效率比手工在界面上点按钮高得多。6.3 直接连接与恢复原状用完后想恢复Nucleo板原始功能也不复杂。把之前焊的飞线拆掉或者断开把CN2两个跳线帽按原来方向插回去插上USB板载U083RC就会重新出现在调试器面前一切照旧。需要注意的一点是拔下跳线帽这个动作不要反复频繁操作排针的镀层磨损几次后接触电阻会增大导致调试不稳定。我自己的习惯是如果长时间不需要用板载MCU就让跳线帽保持断开状态把这块Nucleo板当做一个纯粹的ST-LINK调试器来用不来回折腾。最后这个玩法我用了很长一段时间最初只是因为手头调试器不够后来发现它其实是一种值得推荐的调试资源复用方式。尤其是手头同时有几块不同型号Nucleo板时哪块顺手就用哪块的ST-LINK去调试外部MCU省下的钱不多但省下的桌面空间和找工具的烦躁很值。最后分享一个踩坑后的习惯断电再操作、先拍照再拔跳线帽、上电前先量通断这三件事做全了整个方案基本不会出大问题。
分享:

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

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