尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

J-Link调试器全攻略:从SWD接线到Keil烧录与量产

J-Link调试器全攻略:从SWD接线到Keil烧录与量产 刚入行那会儿我拿到一块STM32F103核心板配套的正是一只Jlink烧录仿真工具。当时我只知道它能烧程序至于为什么插上USB之后电脑老提示找不到驱动为什么明明连上了却报Cannot access target全是一头雾水。后来在项目里用久了才明白Jlink远不止一个下载器那么简单它同时承担了烧录、调试、甚至产线量产固化三条完全不同的职责。这篇分享没有理论堆砌就是把我从驱动安装、接口接线、Keil5配置烧录、J-Flash量产这一条路上的实际经验写出来适合刚接触嵌入式、或者正被烧录报错折磨的工程师参考。1. Jlink不只是一个下载器它到底在做什么1.1 烧录与调试的本质SWD/JTAG协议怎么工作Jlink和芯片之间通过一组信号线连接最常见的是SWD模式。SWD最少只需要两根信号线SWCLK时钟和SWDIO数据再加上一根地线和参考电压线就能完成几乎全部的读写操作。JTAG则是四根信号线TCK、TMS、TDI、TDO好处是支持菊花链连接多颗芯片坏处是占用的引脚更多所以在现代Cortex-M板子上SWD基本成了默认选项。可以把SWD理解成一条双车道小路时钟线负责打拍子数据线在每个时钟沿上逐个bit地搬运命令和数据JTAG则是四条车道能同时读和写。调试器通过这些信号线访问芯片内部的调试端口DP和访问端口AP进而读写内存、寄存器、Flash控制器以及控制CPU的暂停和运行。很多人一遇到连不上就猛猜硬件其实只要理解了这条链路排查思路就会清晰很多要么是信号没送进去要么是目标芯片没回应。1.2 一个工具通吃整条开发链在项目里Jlink的角色从开发阶段一直延伸到量产阶段开发阶段下载固件、设置断点、单步调试、查看变量和内存、观察外设寄存器。调试阶段通过SWD/JTAG做实时访问配合RTT输出日志甚至在没有串口的情况下也能看到程序运行状态。量产阶段使用J-Flash/J-Flash Lite对Hex、Bin、S19等固件文件做离线烧录和校验还能写序列号。Flash下载的原理多说一句Jlink并不会直接拿bin文件往Flash里怼。它先把一段编程算法加载到目标芯片的RAM里然后通过调试接口控制这段算法去擦除Flash、写入数据、校验结果。这就是为什么Keil的Flash Download里面要选择对应的Programming Algorithm比如STM32F103需要用STM32F1xx系列Flash算法。算法选错了烧录就会在擦除或编程阶段各种失败。1.3 支持的芯片范围Jlink能覆盖的范围比很多人想象中大ARM Cortex-M0/M0/M3/M4/M7这些主流内核老的ARM7/ARM9Cortex-A系列的部分型号甚至近年来的RISC-V芯片新固件里也有支持。ST、NXP、TI、GD、新唐、瑞萨这些厂家的芯片基本都能识别。这里有个常见的误区要澄清ESP32这类芯片用的是Xtensa内核默认并不开放标准SWD接口所以大部分情况下不能用Jlink烧录调试而是通过UART串口工具esptool烧录。有的型号比如ESP32-S3内置了USB调试接口但和传统意义上的Jlink SWD接线不是一回事。这也是为什么网上讨论esp32烧录方式时很少见到Jlink身影的真正原因。2. 版本选择和硬件避坑先分清你手里的是哪只Jlink2.1 硬件版本线V9到V12Jlink的硬件版本从V9一路更新到V12每个版本的差异主要在主控芯片、USB速度和固件可升级性上。列个简表方便你对照手里的实物版本大致年代接口特点V92013年前后USB 2.0全速经典老将很多山寨货基于此方案固件刷死即变砖V102016前后USB 2.0高速开始支持固件在线升级速度和稳定性都有提升V112020前后USB 2.0高速当前主流支持更高SWD时钟兼容性最好V122023之后USB 2.0高速/Type-C新一代产品硬件优化更彻底V9的老版本固件放在芯片内部一旦升级失败或者被刷入不匹配的固件整个工具就废掉了。V10以后的版本才真正把固件做成了可升级的模式所以如果你手里是V9升级固件之前一定得想清楚。2.2 功能版本与授权区别除了硬件版本Segger还把同样硬件分成不同授权档位EDU教育版、BASE、PLUS、PRO等。EDU版价格最亲民但明确只能用于教育和非商业项目SWD速度也被限制BASE是最常见的商用入门档PLUS往上开始支持Cortex-A、更高速度、以及更高级的trace功能。另外很多开发板上自带的J-Link OB是板载精简版功能上足够日常调试烧录但没有独立20pin接口速度也偏低。2.3 正版与山寨一句大实话网上几十块的山寨Jlink能用吗诚实说能用。我在上学时候也靠它写了不少代码。但你得接受它的问题序列号重复导致多个设备插电脑时驱动冲突、固件被锁无法升级、高SWD速度下偶尔抽风、在较新版本的MDK/驱动组合下报各种诡异错误。我的建议是学生党预算有限买二手正版V9/V10或者直接收一块带J-Link OB的开发板项目和产线环境别省这个钱至少上官方BASE或EDU稳定性差很远。如果你确实用了山寨记住两点不要升级固件不要在高速档位下较劲。3. 驱动安装与固件升级设备管理器不识别的问题都出在这3.1 官方驱动安装全过程去Segger官网下载J-Link Software and Documentation Pack。注意它不是只装一个驱动而是全家桶安装包里面包含JLink驱动、JLink Commander命令行工具、JFlash/JFlash Lite、J-Link Configurator等。安装完成后把Jlink插到电脑USB口打开设备管理器正常情况下能看到一个J-Link设备不同版本可能显示为SEGGER J-Link。这里有一个新手必踩的坑Jlink在电脑上不是以COM口形式出现的。很多人插上去之后去端口(COM和LPT)里找找半天找不到以为驱动没装好。实际上它属于调试器类设备要在USB设备列表里看才对。3.2 Win11/驱动签名与未识别设备在Win10/Win11上安装Segger官方驱动基本不会遇到签名问题但如果你用了比较冷门的精简版安装包或者系统开启了驱动强制签名设备管理器里可能出现黄色感叹号。最简单的处理是重新下载官网最新版安装包让安装程序自动处理。如果还是不行可以手动指向安装目录里的驱动inf文件安装一次。还有一类情况特别经典用的是一根只能供电不能传数据的Micro USB线。换一根好的数据线能解决一半的识别问题。这个看起来像玩笑但实际排查中出现的频率非常高。3.3 设备管理器不识别/未知设备的排查顺序当Jlink插上后电脑毫无反应或者显示未知设备时按以下顺序排查换USB口。机箱前置面板的口供电不稳插到主板后置口直接试。换USB线。优先带屏蔽的短线排除充电线嫌疑。拔掉电脑上其他Jlink仿真器。山寨设备序列号经常重复两个一起插会驱动冲突。重新安装驱动。先卸载干净设备管理器里右键卸载并勾选删除驱动程序重启后再装官网最新版。如果换了电脑也一样那基本可以判断是硬件问题——山寨货插拔多了USB座松动很常见。3.4 固件升级要注意什么打开JLink.exe或J-Link Configurator时如果提示有新固件正版设备可以放心升级升级过程中别拔USB也别断开目标板连接。但山寨设备一定要避开这个操作——尤其V9山寨点升级基本等于变砖。升级完成后可以在JLink.exe里输入v查看固件版本。要查看当前电脑上连了哪几个Jlink及其序列号J-Link Configurator里会列出设备列表做多设备管理时很好用。4. 接口定义与SWD接线烧不进去的坑有一半埋在这4.1 SWD模式下真正需要的信号Jlink背面的20pin排针看起来复杂但SWD模式下真正要关心的只有四个信号信号名方向作用SWDIOTMS双向数据线命令和数据都在这根线上走SWCLKTCK调试器输出时钟线为整个通信打节拍GND公共地和板子共地没有它一切白搭VTrefVCC输入目标板参考电压Jlink靠它识别目标板电平某些板子还会引出nRESET复位线不是必须但在芯片跑飞、看门狗咬死的情况下接上复位线并使用Connect under Reset会大大提高成功率。另外还有TDI、TDO在JTAG模式下才用到。4.2 常见6Pin SWD插座怎么接STM32核心板、Nucleo扩展板这类板子上最常见的是2x3的6pin SWD插座引脚顺序一般是VCC、SWDIO、SWCLK、GND、RST、NC有的板子会重新排列。接线的时候对照Jlink排针的丝印做一一映射就行。这里有两个高频翻车点一是SWDIO和SWCLK接反这种错误会导致连接时完全找不到芯片二是只接了三根信号线却把VTref漏接结果Jlink读不到目标板电压报错说电压为0。VTref在很多核心板上可以直接接到板子的3.3V电源上甚至很多转接板会把VCC和VTref复用。接线前看一眼原理图最稳妥别光靠颜色猜。4.3 关于供电和带电插拔的经验Jlink上的VTref只是参考电压不是给目标板提供电源的。虽然部分型号的Jlink上有3.3V输出脚但输出能力非常有限给整个最小系统供电很勉强。最推荐的做法是目标板自己供电Jlink只负责通信。另一个血泪教训是带电插拔。SWD线在板子带电状态下反复插拔轻则连接不稳重则把调试接口的IO口打坏。我现在的习惯是先断电插好SWD线再给目标板上电然后再打开调试器连接。这个顺序看起来罗嗦但能少很多莫名其妙的硬件问题。4.4 长线和速度为什么就是连不上杜邦线超过20cmSWD速度又设得很高时问题就来了连接时断时续、烧录到一半报错、或者读回校验失败。这不是Jlink坏了是信号完整性问题。处理方式很简单把SWD速度从自动/4MHz降到1MHz甚至400kHz很多时候问题直接消失。如果降速后还是很差把线换成双绞线或屏蔽线尽量缩短距离。另外Keil里Settings页面右侧的SW Device列表如果始终为空就是经常搜索到的Jlink sw不识别问题。这时候第一步怀疑线序和VTref第二怀疑目标板供电最后才轮到怀疑Jlink本身坏了。按这个顺序走绝大多数情况都能解决。5. Keil MDK里的Jlink配置与烧录失败排查链路5.1 MDK里Jlink的基本配置步骤在Keil MDK中打开Options for Target切到Debug页面选中Use右侧下拉框里的J-LINK / J-Trace Cortex然后点旁边的Settings。在Settings里把Port选成SW速度可以先保持默认。点OK后如果连接成功Target Device会显示芯片内核型号比如Cortex-M3或Cortex-M4下面还能看到IDCODE。接着切到Utilities页面勾选Use Debug Driver点击Settings进入Flash Download。这里要确认Programming Algorithm里选的是当前芯片的Flash算法。以STM32F103C8为例需要选的是STM32F1xx系列的Flash算法容量对应128K或512K。需要一烧完就复位的把Reset and Run勾上需要全片擦除的在Erase Sectors和Full Chip之间按需求选。如果你用的是ST-Link配置里选ST-Link Debugger其他流程类似但Jlink的优势在于跨品牌芯片都通用。5.2 常见烧录报错的逐个拆解实际遇到过的几类报错整理成一张表报错提示常见原因解决方向No J-Link found / Cannot find J-LinkUSB线、驱动、设备未识别按章节3的排查流程走一遍Cannot access target接线错误、目标板没上电、芯片锁死、速度过高查SWD线序、给板子上电、降速、Connect under ResetRDDI-DAP ErrorJlink驱动与MDK版本不匹配或兼容版Jlink与较新MDK冲突换官方最新驱动、降低SWD速度、换USB口Flash Download failed - Cortex-MxFlash算法选错、芯片型号选错、Flash写保护换算法、核对芯片型号、解除保护No Algorithm found for ...Utilities页Algorithm为空或选错点Add添加对应Flash算法RDDI-DAP Error这个报错在搜索引擎里经常和keil5 烧录失败一起出现。我的经验是先别急着重装软件把驱动升到官网最新版把SWD速度从4MHz降到1MHz很多时候就好了。如果还是不行检查是否同时插了两个山寨Jlink拔掉一个再试。5.3 标准的硬件链路排查顺序如果你被烧录失败折磨到怀疑人生按这个顺序做基本不吃亏设备管理器里确认Jlink被识别。只保留SWDIO、SWCLK、GND、VTref或VCC四根线其他线全拔掉。给目标板单独上电用万用表确认GND和VCC之间有正常电压。打开JLink.exeJ-Link Commander输入connect按提示选择芯片型号、接口类型SWD、速度选4000kHz。如果命令行能进入提示符说明硬件链路OK问题大概率出在MDK配置如果在这里连不上那就是接线或板子问题在MDK里怎么调都白费。如果JLink.exe能连上但MDK连不上打开MDK把Settings里的Reset选项改成Connect under Reset再试。还是不行把SWD速度调到200kHz/100kHz再试一次。低速下很多时序问题都会被掩盖。这套流程我前后帮同事排查过十几次九成以上都是第二步、第三步的接线问题。5.4 芯片锁死/读保护的处理STM32等Cortex-M芯片开启读保护RDP之后SWD接口会拒绝正常的读写访问烧录时会报AP正在锁定之类提示。处理办法是用JFlash打开目标芯片连接后在Target菜单里执行Unsecure解锁操作或者用JLink Commander执行unlock命令执行完芯片全片擦除、恢复调试访问。注意这是破坏性操作会清空Flash、RAM、OTP区里的用户数据。量产阶段千万别对着有正式固件的板子乱点解锁动手前确认好这台板上没有需要保留的数据。6. J-Flash独立烧录脱离Keil的量产烧录与文件格式处理6.1 什么时候该用J-Flash如果只需要把现成的Hex/bin文件烧到板子里不想打开庞大的Keil工程或者生产线上需要快速、可重复地烧录校验J-Flash就出场了。它属于Segger全家桶的一部分驱动装好之后自带。操作流程很直白打开JFlash.exe新建工程选择目标芯片型号比如STM32F103CB接口选SWD速度默认。点Target - Connect连接成功后用Open data file加载固件文件。加载Hex或者S19这类带地址的文件时不需要额外填地址加载Bin文件时必须手工指定起始地址STM32通常写0x08000000。然后点Program等进度条走完程序就固化进Flash了。6.2 Hex、Bin、S19到底有什么区别这里统一说清楚因为至少三分之一的烧录问题出在对文件类型的误判上。Intel Hex文本格式每一行自带地址信息和校验J-Flash解析后知道往哪写。后缀通常是.hex。Bin纯二进制数据没有地址信息烧录时必须告诉工具起始地址。后缀通常是.bin。Motorola S-recordS19/S28/S37文本格式和Hex类似自带地址常见于NXP飞思卡尔老工具链和一些车规固件。J-Flash同样支持。如果你手里只有一个bin文件却不知道起始地址先去看链接脚本散列文件或者map文件确定代码段的加载地址别凭印象乱填。6.3 量产场景下的命令行烧录J-Flash本身是图形界面但产线上更常见的是用命令行或者脚本做一键烧录。大致的调用方式jflash.exe -openprj:project.jflash -open:app.hex -connect -auto -exit具体参数在不同版本可能略有差异先运行jflash.exe /?查看帮助。JLink CommanderJLink.exe也支持类似脚本方式比如在命令行里输入r h loadbin app.bin 0x08000000 r g exit这五行分别表示复位、暂停、加载bin文件到Flash、复位、运行、退出。如果要把序列号写到指定地址可以在脚本里加write命令对需要校验的场景J-Flash烧录完会自动读回比对日志里能看到校验结果。6.4 产线烧录的速度取舍默认4MHz左右速度下烧一个128KB的固件大约十几秒到二十几秒。如果把SWD速度降到400kHz同样固件可能要一分多钟量产工位多的时候差异就很明显。想提升产线效率先提高接线质量再用较高速度跑。同时看情况关闭烧录后校验选项但我不建议这么做因为万一某颗芯片Flash不良没校验意味着不良品直接流到下个工序。更稳的做法是烧录完成自动读取校验再配合序列号登记每条板子的烧录结果都可追溯。7. 仿真调试三板斧断点、变量与RTT7.1 断点不是越多越好Jlink做仿真调试核心能力是让CPU在指定地址停下来然后观察现场。Keil里F5运行、F10单步跳过、F11单步进入、ShiftF5退出调试是最基本的一套。但Cortex-M内核的硬件断点数量有限一般只有4到6个。想一口气下十来个断点编辑器会提示资源不足这不是Jlink不行是内核机制决定的。软件断点虽然不限数量但依赖把Flash指令替换成断点指令对实时性和Flash有要求在外部Flash上尤其麻烦。所以实用做法是关键时刻才下断点用条件断点表达式满足才停提高效率。7.2 看变量和寄存器的几个实用技巧调试界面里的Watch窗口可以输入变量名也可以输入复杂表达式。有个很常见的坑高优化等级下你观察的变量可能被编译器优化掉显示的值总是错误或者干脆提示not in scope。正确的姿势是把工程优化等级调低O0/O1再调试或者强行用volatile指针观察比如在Watch里输入*((volatile unsigned int *)0x40000000)Memory窗口可以查看任意地址的内存内容输入0x20000000看SRAM输入0x08000000看Flash。寄存器窗口除了看R0-R15和PC/LR/SP还能看到CPSR、xPSR等状态寄存器排查hardfault时特别有用。7.3 没有串口也能打日志SEGGER RTT最后分享一个用了很多年的技巧SEGGER RTT。它基于Jlink的调试连接在目标芯片里运行一小段RTT代码日志数据通过SWD接口上传到PC端不需要占用UART不需要额外的串口线。你只要把SEGGER_RTT.c和SEGGER_RTT.h加进工程在代码里调用SEGGER_RTT_printf()然后在电脑上打开J-Link RTT Viewer就能实时看到printf输出。RTT最大的优势是调试时不占串口资源尤其在做RTOS或者外设串口被占用时非常实用。缺点是它依赖调试器在线连接产品release固件里如果还留着RTT代码一旦断开调试器或者访问缓冲区缺省会有卡顿风险所以release版本建议关掉或移除。我在实际使用中的体会是Jlink这东西看起来只是个黑色小盒子实际上整个嵌入式调试链路的通用语都压在它身上。把这套东西从驱动、接线、Keil配置到JFlash量产串起来理解一遍比手里攥着十个仿真器却不知道报错原因要强太多。如果时间允许建议找一个最小板子完整走一遍安装驱动-接SWD-JLink.exe连接-Keil烧录-JFlash量产的流程。两个小时下来你就能自己判断八成以上的烧录问题了。
返回列表