新闻详情

新闻详情

首页 / 资讯中心 / 详情

JLink读取MCU固件全流程:从SWD接线到J-Flash备份与校验

发布时间:2026/9/27 1:11:06来源:尧图网络
JLink读取MCU固件全流程:从SWD接线到J-Flash备份与校验
做嵌入式开发这些年Jlink几乎是我每天都要摸的调试器。很多人只拿它当烧录器用烧完程序就收工但Jlink还有一个非常实用的场景——读取MCU内部的固件。不管是想备份旧设备的固件、分析别人产品的逻辑还是设备变砖后想通过读Flash排查问题用J-Flash把芯片里的固件完整导出来都是最直接的做法。这篇文章我按自己实际的操作路径来写从驱动安装、硬件接线、芯片选型到J-Flash建工程、连接、读取、保存、校验每一步都写清楚同时把我踩过的坑一并整理出来。适合刚接触Jlink的嵌入式新手也适合想把固件备份流程规范化的工程师做参考。废话不多说直接进入正题。1. 动手前的准备硬件、软件与接口定义1.1 Jlink能读哪些MCU读完固件有什么用先回答一个很多人会问的问题Jlink到底能读哪些芯片答案是只要J-Flash软件里有对应型号的Flash算法基本都能读。常见的就是ST的STM32全系列、NXP的LPC系列、GD32、华大、新唐、Microchip的PIC32、TI的MSP430部分型号需要额外配置等等。ARM Cortex-M内核的芯片支持最完善51和AVR这类的支持相对弱一些但多数也能通过对应配置搞定。读完固件能干什么我总结下来有三个最典型的用途。第一是备份产品量产后怕原厂固件丢失或者怕后续版本改出问题先导出一版当前稳定版本存起来心里踏实。第二是分析手头有不带源码的旧设备想搞清楚它的启动流程、外设初始化顺序、通信协议用J-Flash把固件读出来丢进IDA或者Ghidra逆向分析是常规操作。第三是恢复设备升级失败或者Flash被意外擦除如果之前有备份用Jlink直接烧回去就能救砖。所以读取固件不是搞破解专用的它是嵌入式开发里非常正常的工程手段。这里要强调一点读取固件本身是合法的技术操作但如果你读的是别人的商业产品固件请务必确认用途是否符合法律法规和产品授权协议。下面讲的全是技术流程用在哪儿、合不合规得自己把握好。1.2 硬件接线SWD四根线怎么接Jlink连接MCU最常用的接口是SWD相比JTAG它只需要四根线SWDIO、SWCLK、GND、VCC或者叫TARGET VCC用来检测目标板电平。我现在绝大多数项目都用SWD因为占用引脚少有些芯片甚至可以通过SWD复用引脚省出两个GPIO这在pin脚紧张的板子上非常关键。四根线的接线顺序SWDIO数据线接芯片的SWDIO引脚。SWCLK时钟线接芯片的SWCLK引脚通常建议串联一个小电阻减少干扰。GND地线必须共地不共地Jlink和MCU之间电平参考不一致通讯很容易失败。VCCJlink的VTref引脚接目标板的3.3V电源它的作用是让Jlink感知目标板电压从而调整IO电平匹配不接的话很多Jlink直接报错或者不工作。很多新手会忽略RESET线其实在连接不上、程序跑飞或者芯片进入低功耗模式的时候SWD的RESET线能帮大忙。Jlink的RESET引脚接芯片的NRST连不上时先拉复位再连接成功率会高很多。我在实际项目里凡是需要频繁调试的板子焊盘上都会把SWDIO、SWCLK、GND、VCC、RESET五个信号全部引出来用2.54mm排针方便夹杜邦线。另外一个经验是SWD线能短就短尤其是在高频下调试或者目标板靠近电机、电源这类强干扰源时。我见过有人用20厘米长的杜邦线跑4MHz SWD结果连接死活不稳定降到1MHz就正常了。如果你也遇到类似情况优先降SWD时钟频率其次是检查线序和地线。1.3 驱动安装与J-Flash软件准备Jlink要正常工作第一步是安装官方驱动包也就是J-Link Software and Documentation Pack。装上这个包之后Jlink的USB驱动、J-Flash、J-Link Commander、J-Link GDB Server这些工具就都齐了。安装过程没什么难度注意两点。一点是安装路径不要带中文后面用命令行调J-Flash时路径里有中文会引发莫名其妙的编码问题。另一点是如果之前装过旧版本驱动建议先卸载干净再装新的不然Jlink的DLL版本冲突会导致J-Flash打开工程时崩溃。我经历过一次JLinkARM.dll版本不匹配J-Flash能打开但一连接就蓝屏死机最后全卸了重装才解决。安装完成后把Jlink插到电脑USB口打开设备管理器能看到一个“J-Link”设备说明驱动正常。如果显示黄色感叹号多半是USB驱动没装上重新安装驱动包或者换一个USB口试试。这里不建议用USB Hub尤其是那种不带供电的简易HubJlink的供电不稳连接目标板时经常会导致目标板复位或者Jlink自身掉线。J-Flash的版本界面虽然不同版本有细微差别但核心菜单位置基本一致我后面讲的都是以当前最新版界面为准老版本略有差异也不要慌按菜单名称找就行。2. J-Flash读取固件实操流程2.1 新建工程与芯片型号选择打开J-Flash第一件事是创建新工程。菜单栏点File - New Project会弹出芯片选择对话框。左侧按厂商分类右侧是具体型号列表。这里有一个经验型号必须选准确选错了连接多半失败即使连上Flash地址映射和烧录算法也是错的读出来的数据没有任何意义。举个例子STM32F103C8T6和STM32F103RCT6虽然都是F103系列但Flash容量不同C8是64KBRC是256KB。用RC的配置去读C8的芯片J-Flash会按256KB的地址范围去读读出来的后半段全是垃圾数据。所以选型号时最好对着芯片丝印确认实在不确定就用J-Link Commander的自动检测功能后面我会详细讲。型号选好后会进入主界面。这时候可以先设置一下连接模式Options - Project Settings - Debug确认Target Interface选的是SWD速度先设在1000kHz左右别一上来就拉满。很多板子布线质量一般高速连接不稳定降低速率是排查问题的最有效手段之一。速率这里我多说一句4MHz在干净的小板子上没问题但遇到长线、手摸到线就断连的情况果断降到1MHz。还有一处容易忽略Project Settings里的Flash Download选项里面有个“RAM Address”和“RAM Size”这是J-Flash用来加载Flash算法的地址空间。绝大多数情况下不需要改但如果你用的是Flash很小的芯片J-Flash默认分配的RAM不够会报错说无法加载Flash算法这时候适当调大RAM Size或者选一个更精简的Flash算法就能解决。2.2 连接目标板工程配置好后把Jlink和目标板接好目标板上电然后在J-Flash里点击Target - Connect。正常情况下日志窗口会显示连接的芯片ID、内核类型、Flash大小等信息。比如“Connected successfully”加上一行“Found Cortex-M3 r1p1, Little endian.”看到这个基本就稳了。连接这一步是我见过问题最多的地方。报错通常分几类第一类是“Cannot connect to target”意思是没有找到目标芯片第二类是“Could not find core”说明找到了器件但内核没起来第三类是“Error: Flash ID mismatch”一般是芯片Flash算法选错或者芯片加密了。这些问题我在后面专门用一章来讲这里先记住一个基本原则连接是读取固件的前提连接失败时不要反复点Connect要按下面的排查顺序一步步来。连接成功后在J-Flash的Data Buffer窗口可以看到芯片内部Flash的内容默认是空白或者乱码。这个Data Buffer就是J-Flash在内存中的读取缓冲区后续读出来的固件就显示在这里。如果你只是想快速看一眼芯片里有没有程序连接成功后直接看这个窗口如果全是0xFF说明Flash是空的如果有非FF数据说明芯片里已经有内容了。一个非常实用的操作连接成功后在Data Buffer里按CtrlA全选看右下角的状态栏它会显示当前选择的字节长度和起始地址。这样可以快速确认芯片Flash的实际有效数据范围。比如读到一个产品固件发现有大量数据集中出现在0x08000000到0x08004000那说明这个固件实际只有16KB后面都是空的。2.3 读取Flash并保存为bin文件连接成功后就可以读取固件了。菜单栏点Target - Read Back - Entire ChipJ-Flash会调用芯片对应的Flash算法把整片Flash的内容读进Data Buffer窗口。这一步的时间取决于Flash容量和SWD速率比如读256KB的Flash在1MHz SWD下大概需要二十秒左右4MHz下几秒就完成耐心等一下。读取完成后Data Buffer窗口里会有数据。这时候要做的第一件事不是马上保存而是先检查数据合理性。最有效的检查方法还是看右下角的地址和长度信息如果芯片标称64KB读出来的数据确实到0x0800FFFF都有内容那基本正常。如果读出来的数据后半段一大片都是0xFF说明这部分确实是空白区域不是读取错误。接着保存文件。菜单栏点File - Save Data As保存类型选择“Binary”格式也就是bin文件。文件名自己起但强烈建议在文件名里包含芯片型号和日期比如“STM32F103C8T6_backup_20250115.bin”以后翻出来一目了然。保存地址默认是0x08000000在hex文件里这个地址信息是带上的但bin文件不带地址信息所以保存bin时会让选择起始地址默认就行。这里有个只保存有效区域的技巧如果只想把有数据的那部分固件存下来可以先在Data Buffer里选中有效区域的开头然后拖到结尾右键选“Save selection as...”这样可以避免保存一个几十KB的bin文件里全是冗余FF。对于后续做固件差异对比、打包发布都更方便。2.4 校验读取结果固件读出来、保存好了不代表万事大吉。我最开始读固件的时候就吃过亏读出来的bin文件烧到新芯片里跑不起来后来对比源码编译出来的二进制才发现读取过程中有些字节被读错了尤其是SWD线比较长、干扰大的时候读出来的数据会有个别bit错误。怎么校验最简单的办法是把读出来的bin文件用J-Flash重新烧录回去如果芯片跑起来没问题说明数据基本可靠。但这个办法在芯片原有程序被破坏的情况下不适用比如你想备份一个正在运行的产品固件读出来再烧回去验证是可以的但会再次擦写芯片有风险。更专业的做法是读取两遍然后用文件对比工具做逐字节比对。我常用的方式是第一遍读取保存为backup1.bin第二遍读取保存为backup2.bin然后在命令行用fc /b backup1.bin backup2.binWindows或者cmpLinux/Mac对比如果没有任何输出说明两个文件完全一致。实测下来SWD连接稳定的时候连续读两遍出来的结果是一致的如果出现差异基本可以确认是硬件连接干扰导致的读取错误这种情况下要先解决接线问题再重新读取。另外还要核对一个细节读出来的固件大小和芯片型号是否匹配。比如STM32F103C8T6标称64KB Flash读出来120KB那一定是配置有问题J-Flash可能把芯片型号识别成了其他容量更大的型号。碰到这种情况回到Project Settings里重新选择正确的芯片型号再读一遍。3. 实际踩坑记录与排查思路3.1 识别不到芯片怎么查Jlink识别不到芯片是新手遇到最多的报错我在这上面栽过不少跟头归纳下来无非就几个原因。第一是接线问题SWDIO和SWCLK接反了或者GND没接这是最常见的。我的检查方法是拿万用表量一下Jlink端口的引脚定义和目标板端的引脚定义确保一一对应。网上很多文章会贴Jlink引脚图但不同厂家、不同版本的Jlink引脚排列不一定一样最靠谱的办法是看自己手里Jlink外壳上的丝印。第二是目标板没有供电。有些小板子没有自己的电源那种情况下如果Jlink的VCC没有输出或者目标板功耗太大带不动芯片根本没法工作自然连不上。解决办法是给目标板单独供电同时保证Jlink和目标板共地。第三是芯片进入了低功耗模式或者被程序禁用了SWD引脚这时候需要按住目标板的复位键然后在J-Flash里点Connect的同时松开复位键利用复位瞬间芯片还没跑程序的时间窗口完成连接。这个“复位时序”技巧在连不上时非常管用。还有一种情况是Jlink本身的问题。我见过便宜的Jlink烧录器目标板一接上就掉线或者连接时概率性失败这种情况多换几个Jlink对比测试就能定位。如果是驱动问题设备管理器里会有黄色感叹号重新安装官方驱动基本能解决。旧版本Jlink的DLL文件被别的软件覆盖也是排查点重装驱动就能恢复。3.2 读出来的数据全是FF是什么情况如果J-Flash连接正常但读回来的数据全是0xFF接下来就要分情况处理。最乐观的情况是芯片Flash本来就是空的比如全新芯片或者之前被擦除过那没关系。但如果芯片里明显有程序运行比如设备指示灯在闪读出来却全是FF那就不是什么好事了。常见原因是芯片的读保护开启了。ARM Cortex-M内核的芯片比如STM32的RDPRead Protection级别为1时通过调试接口读Flash就会得到0xFF或者全0数据这是芯片的防抄板机制在起作用。碰到这种情况J-Flash通常会弹窗提示或者在日志窗口显示“Could not read data”之类的信息。这种情况下你无法通过正常手段读取固件内容除非执行解除保护操作但解除保护会触发芯片全片擦除固件数据会直接清空。所以如果你遇到的是加密芯片基本可以放弃读取内容的念头了。另一个原因是读取配置错误。比如选择的起始地址不对有些芯片的用户Flash并不是从0x00000000开始的而是从0x08000000之类的地址映射。如果Data Buffer窗口显示的区域不是用户Flash所在的地址范围读出来的数据也会是FF或者乱码。解决办法是确认芯片型号对应的Flash起始地址在Target - Manual Programming - Read里手动指定正确的地址范围和大小再读一次。3.3 供电、电平匹配与复位线SWD连接不稳定绝大多数情况下都是供电或者电平匹配问题。我说一个最简单也最容易被忽略的点Jlink的VTref引脚必须接目标板的电源这样Jlink才能知道目标板的I/O电平是3.3V还是5V从而调整自己的逻辑电平。如果VTref不接Jlink默认可能按5V或者3.3V输出和目标板实际电平不一致连接时数据线的高电平可能达不到芯片的VIH阈值通讯自然不稳定。另一个常见坑是目标板上的SWDIO/SWCLK引脚接了很大的下拉电阻或者直接接地不管你是为了防干扰还是为了兼顾别的功能对Jlink来说都是致命伤。数据线被拉死在一个电平上SWD协议根本没法建立连接。遇到这种情况我通常会在原理图上检查这两个引脚周围有没有额外器件有的话先断开再调试。复位线的重要性前面提过了这里再具体说下。当目标芯片程序里关掉了SWD引脚或者把系统时钟配置得很奇怪正常的SWD连接会失败。这时用Jlink的RESET引脚去控制芯片复位让它在复位起始阶段就进入调试模式成功率会大增。在J-Flash里Project Settings - Debug里可以设置连接时的复位方式通常选“Hardware Reset”即可。如果手动控制用J-Link Commander里的reset命令也可以达到同样效果。3.4 遇到读保护怎么办遇到读保护芯片第一反应不要是找破解工具而是想清楚你面对的是什么场景。如果这是你自己公司的产品固件加密了但你手上有工程源码和编译工具链那压根不需要读Flash直接重新编译一版出来就行。如果这是供应商提供的库函数封装的芯片你需要的可能是重新申请固件或者找供应商要烧录文件。如果这是客户发来的返修品你无法确定固件内容但需要维修你可以选择将整个Flash擦除后重新烧录已有备份的固件。我不主张也不建议去研究绕过读保护的方法一方面这是很多国家的法律红线另一方面现在的MCU读保护设计得越来越严密比如STM32的RDP Level 2是永久不可逆的想绕过的难度极大投入产出完全不成比例。做技术的人更应该清楚边界在哪。读到加密芯片只需要确认它确实加密了把情况记录到项目文档里就已经完成了排查工作。还有一个实战经验有些芯片的读保护不是全片保护的比如Flash可以读但Option Bytes区域的配置被锁了。这种情况J-Flash也能正常读出Flash内容只是部分配置项读不出来。如果你发现读出来的固件里靠近地址末尾的部分有异常数据可以注意检查一下是不是Option Bytes区域的内容被特殊处理了。4. 进阶玩法命令行读固件与批量操作4.1 J-Link Commander 基础用法J-Flash图形界面适合手动操作但当你要在生产线上批量读取固件或者想写一个自动备份脚本图形界面就力不从心了。这时候就要用J-Link Commander也就是命令行版的Jlink工具。打开方式很简单安装驱动后在命令行输入JLink.exe或者JLink就会进入交互式命令行界面。输入?可以看到所有支持的命令常用的有device 芯片型号设置目标芯片型号。si 接口设置调试接口比如si SWD或者si JTAG。speed 速率设置SWD时钟频率比如speed 4000是4MHz。connect建立连接。savebin 文件名 起始地址 长度读取Flash并保存为bin文件。save和loadbin分别是保存当前内存到文件以及把文件加载到内存。exit退出。下面是一段读取STM32F103C8T6固件的完整命令行流程。先启动JLink.exe然后在交互命令行里输入device STM32F103C8 si SWD speed 4000 connect savebin backup.bin 0x08000000 0x10000 exit执行完上述命令当前目录下就会生成一个backup.bin大小是0x10000也就是64KB和C8T6的Flash容量一致。整个过程不需要点击任何图形界面效率非常高。命令行方式的另一个好处是即使J-Flash图形界面因为某些原因打不开JLink.exe通常还是能正常工作的排查问题的时候多一个选择。4.2 用J-Flash命令行批量备份除了交互式命令行J-Flash本身也支持命令行模式适合更复杂的自动化操作。它的用法是JFlash.exe -openprj 工程文件.jflash -open 待数据文件 -connect -saveas 输出文件.bin -exit这条命令的意思是打开指定的J-Flash工程配置文件连接目标然后按工程里设置的算法读取芯片保存为bin文件后退出。工程文件.jflash可以先用图形界面配置好保存下来比如选好芯片型号、SWD速率、连接方式然后命令行直接复用这样每次读取的配置都是一致的避免人为操作错误。我实际用过的一个场景是产线上有几十台设备需要批量备份固件操作员只需要把设备插上Jlink双击一个批处理文件备份就自动完成文件名自动加上设备编号和时间戳。具体做法是写一个batch脚本循环调用JFlash.exe命令每台设备备份完成后输出“OK”并记录日志。这里有个细节批处理里要用timeout /t 3之类的命令留出Jlink重新枚举和连接目标的时间不然连续换设备时会出现Jlink资源没释放导致连接失败的情况。echo off set DEVICE_ID%1 JFlash.exe -openprj project.jflash -connect -saveas backup_%DEVICE_ID%.bin -exit echo Device %DEVICE_ID% backup done.4.3 关于固件安全的一点提醒既然聊到了读取固件就顺便提一下固件安全。现在很多产品都用MCU做核心控制固件里往往藏着通信协议、加密密钥、业务算法一旦被完整读出来基本等于把产品的核心机密交给了别人。所以如果你的产品要上市建议从硬件和软件两个层面做好防护。硬件层面尽量选择带读保护功能的芯片PCB设计时不要在SWD接口上留太多调试信息量产时关闭调试接口或者启用最高级别的读保护。软件层面不要把密钥硬编码在固件里尽可能把关键算法放到安全芯片或者带安全启动功能的MCU中固件升级时加签名校验。作为正向开发者读固件更多是用在自我检查和恢复场景比如验证生产烧录的固件版本是否正确或者排查Flash数据异常。我自己的习惯是每发布一版固件除了保存编译出来的hex/bin还会额外用Jlink读一次目标板上的实际固件做一个“发布前闭环校验”确保烧录到芯片里的和发布包完全一致这一步在汽车电子、医疗设备这类对可追溯性要求高的行业特别重要。聊到这儿Jlink读固件这套流程基本就完整了。说实话读取固件这个操作本身不难难的是遇到问题时不慌能按逻辑一层层排查。我自己的体会是熟练使用Jlink不只是会点几个菜单更要理解它背后的连接时序、电平匹配、Flash算法这些基础原理。把原理搞清楚了哪怕换一个调试器换一种芯片思路也都是通用的。你也可以先找个开发板照着上面的步骤实操两遍遇到一次连接失败再找到原因比看十遍文章都有用。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

不改论文数据也能降AI率吗?免费辅助修改工具推荐! 2026/9/27 2:17:31

不改论文数据也能降AI率吗?免费辅助修改工具推荐!

不改论文数据也能降AI率吗?免费辅助修改工具推荐! 结果段AI率高,交给工具后数字看似还在,单位变了,增加被改成减少,或者未达到统计显著被写成显著改善。论文的数据保护不能只数数字有没有丢,应…

阅读更多 →
WordPress更改字体实战:从零搭建避坑指南 2026/9/27 2:17:31

WordPress更改字体实战:从零搭建避坑指南

WordPress更改字体实战:从零搭建避坑指南 找建站公司报价两万,改个字体还要加钱?这钱花得真冤。很多独立站长为了省事,把网站全权外包,结果后期连个视觉细节都改不动,被服务商拿捏得死死的。其实,从零搭建一个可自主维护的WordPress…

阅读更多 →
1-2-3-4 2026/9/27 2:17:25

1-2-3-4

大家好,我是中科大工科在读研二学生。目前课题方向偏向医疗康复工程,日常会接触信号采集、传感器、硬件与嵌入式相关内容。读研期间有基础的 C 语言、单片机使用经验,但嵌入式体系知识零散,缺少完整项目与工程化实战经验。距离毕业…

阅读更多 →
我国网络营销方式避坑指南:3招教你省钱选对建站 2026/9/27 2:17:11

我国网络营销方式避坑指南:3招教你省钱选对建站

我国网络营销方式避坑指南:3招教你省钱选对建站 找建站公司怕被坑高价?别急,先看看这3个最佳实践:1. 明确需求清单 2. 对比技术栈成本 3.…

阅读更多 →
电子创新竞赛PCB样板加工设备选型指南:从需求到实战配置 2026/9/27 2:17:05

电子创新竞赛PCB样板加工设备选型指南:从需求到实战配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
工业控制器分级存储设计:STM32+FPGA+EEPROM/NOR Flash/SD卡协同架构 2026/9/27 2:17:05

工业控制器分级存储设计:STM32+FPGA+EEPROM/NOR Flash/SD卡协同架构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉