☰
JFlash实战:从零开始用J-Link烧录STM32固件完整教程
2026/9/25 2:06:21 网站建设 项目流程

JFlash这个工具,搞嵌入式的人多少都听过,但真正把它用顺手的其实不多。很多人习惯在Keil里点一下Download就把程序烧了,等哪天真要脱离工程单独烧录、给产线做批量烧录、或者想把芯片里的程序读出来备份的时候,才发现手上还缺一把趁手的家伙。JFlash就是SEGGER J-Link配套的独立烧录工具,跟Keil那套烧录镜像比起来,它不需要你有完整的编译工程,只要手里有一个hex或bin文件,就能直接往STM32的Flash里写,还能读、能擦、能批量,算是STM32烧录这条路上绕不开的一环。

这篇教程我从头到尾捋一遍:怎么下载安装、怎么接线、怎么建工程、怎么把固件烧进去,再把我这些年踩过的坑和网上问得最多的问题一起打包整理出来,适合刚接触JLink和STM32烧录的新手,也适合已经在用但想补全细节的老手。全程不需要你有太深的背景知识,照着做就行。

1. 安装与环境准备:把JLink工具链先伺候好

1.1 从哪下载、装哪个版本合适

JFlash不在别处,它就藏在SEGGER官方的J-Link软件安装包里。打开segger.com的Download页面,找到J-Link Software and Documentation Pack那一栏,选对应Windows版本下载就行。这里有个容易卡人的细节:安装包分32位和64位,现在绝大多数电脑都是64位的,但如果你还在用某些老版本的第三方上位机,他们调用的是32位DLL,Windows 10以上系统建议直接装64位版本,纯命令行和JFlash使用时基本不会碰到位数兼容问题。

版本怎么选?我的推荐是:不追新,但要够新。SEGGER的驱动是向下兼容的,老版本JLink能连老芯片,但新出的STM32型号往往需要较新的设备数据库(Device Database)里才有。如果你手上是常见的STM32F103、F407、G030这类片子,V7.84以上的版本都够用;要碰到STM32H7、U5或者更偏门的型号,建议直接下最新版。我自己的习惯是电脑上常备一两个版本,平时开发用稳定版,碰到新片子再临时换新版,反正SEGGER的安装包互相不冲突,但这里有个坑:多个JLink版本共存时DLL会被新版本覆盖,部分老工具会“莫名其妙”报DLL错误,后面排查篇我会细说。

安装过程没什么花活,一路Next就行。唯一要留意的是安装到最后会问要不要装USB Driver,一定要勾上。这个驱动是JLink和电脑通信的基础,少了它,后面插上调试器系统只会显示“未知设备”。装完建议重启一次电脑,让驱动生效,别偷懒。

1.2 硬件接线与驱动验证

装完软件不等于万事大吉,硬件先得对。JLink调试器现在主流是V9、V10、V11,还有一堆“兼容版”的,不管哪种,给STM32烧录最常用的接口就是SWD,四根线足矣:SWDIO、SWCLK、GND,再加一根VTref(参考电压检测)。很多新手上来就只接三根,以为不用Vref,结果JFlash死活报“Target voltage not found”,其实就是它没检测到目标电压,拒绝对话。

具体怎么接,以最常见的20针JTAG排母为例:1脚是VTref,接板子的3.3V;7脚SWDIO接STM32的PA13;9脚SWCLK接PA14;GND找任意地线连上就行。如果你的板子是自己画的,或者用杜邦线直接从JLink转接,记住一个原则:SWDIO和SWCLK尽量短、尽量绕开电源和晶振走线。我见过太多人拿着30厘米的杜邦线连SWD,然后跟我抱怨连不上,把速度降到100kHz倒是能连了,但这种状态做批量烧录,迟早出幺蛾子。

接好线之后,插上USB,先看一眼调试器上的灯:JLink正常工作应该是常亮绿灯,如果红灯或者不亮,先查USB线和供电。接着打开设备管理器,展开“通用串行总线设备”,如果能看到一个带“J-Link”字样的设备,说明驱动认到了。这时候可以顺手打开安装目录下的JLink Commander(JLink.exe,一个命令行小工具),输入回车,如果能打印出DLL版本、SN序列号,还能看到“VTref = 3.300V”这样的电压信息,说明软件、硬件、目标板供电这条链路全通了。这一步验证比直接去JFlash里碰运气要快得多。

1.3 固件文件格式:hex、bin、elf到底怎么选

烧录之前得先搞清楚你手上是什么文件,这直接决定了JFlash里怎么配置。STM32项目的固件常见三种格式:hex、bin、elf(axf也归这类)。Keil编译默认生成的其实是axf/elf,勾选“Create HEX File”选项后才会另外输出hex。

简单说下三者的区别:hex是Intel十六进制格式,一大特点是把“地址信息”也写进了文件里,所以JFlash加载hex的时候会按文件里记录的地址去放,不需要你手动指定烧录地址;bin是纯二进制裸数据,里面只有数据没有地址,你必须告诉JFlash“从哪个地址开始放”,对STM32来说通常就是0x08000000;elf/axf除了数据和地址,还带调试符号和段信息,调试有用,纯烧录用它反而有点“杀鸡用牛刀”。

格式是否含地址是否需手动指定烧录地址典型来源
hex包含不需要Keil勾选Create HEX File、CubeIDE生成
bin不包含需要(STM32一般填0x08000000)编译产物、OTA升级包
elf/axf包含不需要Keil默认、GCC编译产物

新手我推荐直接用hex,省事、不易错。bin文件在JFlash里加载时如果地址填错了,最常见的结果是烧录“成功”但程序跑不起来,因为数据被放到了错误的Flash区域。

2. 新建工程与关键配置:连接之前的每一环都不能含糊

2.1 芯片选型:在设备数据库里找到你的STM32

确定文件和接线没问题后,打开JFlash。第一次打开会让你选择新建或打开工程,直接选Create New Project即可。JFlash的工程文件后缀是.jflash,它会把芯片型号、接口类型、烧录地址这些设置统统存进去。下次再烧同样型号的板子,直接双击那个.jflash文件就能一键加载,不用重新配置——这是产线或者反复调试时非常省事的一点。

进入工程配置界面后,第一个要填的就是Device。点击右侧的Select按钮会弹出设备列表,里面按厂商分类,密密麻麻几百个芯片型号。找到ST的分支,展开,再找STM32F1、STM32F4、STM32G0这些具体系列。这里有个搜索功能,直接输入“STM32F103C8”能快速定位,不用在树形列表里翻半天。

选型号这个环节我最想提醒一句:宁可多花十秒确认选型,也别图快选错。比如STM32F103C8和STM32F103CB,一个是64KB Flash,一个是128KB,如果你用的是CB芯片却选了C8,JFlash会按照64KB的容量来管理Flash,烧录时超过64KB后面的数据就写不进去,甚至报错。反过来选大了也不太安全,因为JFlash的擦除和校验逻辑跟flash size绑定。确认方法很简单,看芯片顶丝印第二行,C8T6就是64KB,CBT6就是128KB。

2.2 接口与速度:SWD还是JTAG,4000kHz还是100kHz

选完芯片,下一栏是Interface,也就是通信协议。对STM32来说,选SWD几乎永远是正确答案。JTAG协议虽然也支持,但需要占用PA13/PA14/PA15/PB3/PB4五个引脚,而且SWD在这个场景下速度和稳定性完全不输它,接线还少两根。除非你有特殊需求,比如目标板只引出了JTAG口,否则无脑SWD。

Speed设置是另一个新手容易忽略的地方,默认值通常是4000kHz(4MHz)。这速度对大多数正常画板、短线连接的场景没问题,但凡是碰到以下情况之一:杜邦线超过10厘米、板上SWD走线过长、目标板供电不太稳、或者芯片在低功耗状态下,4MHz极可能连不上,或者连上后烧到一半“啪”断掉。这时候别硬撑,把速度降到1000kHz、400kHz甚至100kHz,多半就能稳定工作。SWD协议本身对速度不敏感,烧录一个几十KB的程序,100kHz和4000kHz也就差个几秒钟,稳定压倒一切。我自己的习惯是:新板子第一次上电连JLink,一律先降到400kHz试通,确认没问题再往上提。

2.3 数据文件与烧录地址的“默认值陷阱”

工程配置界面的第二个Tab通常叫Data File(数据文件),这就是指定待烧录固件的地方。点击右侧的按钮,选择你的hex或bin文件。选完hex之后,下方会显示这个文件的起始地址,它来自文件内部记录,一般就是0x08000000,不用改;选的是bin的话,就需要在Load Address(加载地址)里手动填0x08000000。

这里有一个我见过无数人踩的坑:JFlash的默认加载地址不一定是0x08000000。因为有些工程师随手打开老工程,上一次配置的是别的芯片或别的Flash起始地址,直接加载bin文件就烧,烧完程序不运行,还百思不得其解。所以每次新建工程,或者用别人的.jflash工程前,一定要看一眼这个Start Address/Data File区域,确认它指向的是你芯片的Flash基地址。STM32全系的Flash基地址基本都是0x08000000(个别型号如某些带额外QSPI的不算),RAM基地址是0x20000000,这两个数字在STM32的烧录场景里几乎是“刻烟吸肺”级别的常识,记不住就把这句话截个图。

还有几个选项也在这个界面或者Production窗口里,我建议首次烧录不要动高级选项,但有三个跟“烧完能不能跑”直接相关,值得单独说明:Program(打勾,执行烧写)、Verify(打勾,烧完读回校验)、Reset and Run(打勾,烧完自动复位运行)。前两个默认开,Reset and Run看需求——调试阶段我一般开着,跑不起来能立刻看出来;产线烧录建议也开着,省得后面人工上电验证。注意Verify不是可选项,它是对自己负责,烧录完不校验,跟蒙着眼睛干活没区别。

3. 完整烧录实操:从连接芯片到程序跑起来

3.1 连接目标板:学会看Log窗口里的输出

一切配置就绪,把JLink插到目标板的SWD座子上,确保目标板已供电,然后点击菜单栏的Target -> Connect。如果一切顺利,下方的Log窗口会刷出一连串信息,包括JLink版本、SN序列号、目标板电压、芯片IDCODE、内核类型等等。以STM32F103C8为例,你会看到类似这样的输出:VTref = 3.300V,Found Cortex-M3 r1p1, Little endian,IDCode: 0x1BA01477。连接成功后,JFlash会读取芯片的Flash内容并显示在数据缓冲区里,全新芯片看起来就是一堆0xFF。

这里我要特别强调看Log的习惯。很多人连不上就急得满头汗,其实Log窗口里已经把原因写得很明白了:是电压没检测到,还是SWD没响应,还是芯片被读保护锁住了,都有对应的提示。你把这些信息原样复制到搜索引擎里,十有八九能直接找到答案。后面常见问题部分我也会把这些提示逐个翻译成“人话”,方便你对照排查。

3.2 加载固件、执行烧录与校验

连接成功后,如果刚才在工程配置里没选数据文件,现在可以补上:File -> Open Data File,选你的hex文件,JFlash会自动把文件内容载入数据缓冲区,你会看到左边是地址,右边是十六进制数据,全部变为你的固件内容。

接下来就是最核心的一步:Target -> Program。JFlash的烧录流程实际上是三步走:先擦除(默认只擦除数据涉及到的扇区,不是整片擦)、再写入、最后校验。整个过程会显示进度条,同时在Log里输出每一步的结果。一个几十KB的小固件,不出意外两三秒就完成。烧录完成后,如果你勾了Reset and Run,目标板会自动复位运行,LED该亮的亮,串口该打印的打印。如果没勾,可以手动按一下板子上的复位键。这一步我认为是最有成就感的瞬间——从安装软件走到这一步,意味着整条烧录链路你已经打通了。

3.3 读回、整片擦除与生产模式批量烧录

烧录只是JFlash的基本功,它还有几个高频使用的功能值得展开。

第一个是读回(Target -> Read Back)。这个功能能把芯片当前Flash里的内容完整读出来,保存成文件。我经常用它做固件备份:调试好的产品,先用JFlash把Flash读出来存一份hex,后面万一哪块板子的程序被意外擦掉了,或者调试时改坏了想回退,直接烧备份文件就行。要注意读回之前先确认地址范围,默认是整个Flash区域,一般不用改;保存格式建议选hex,因为它带地址信息,下次可以直接加载烧录,不用再填起始地址。

第二个是整片擦除(Target -> Manual Programming -> Erase All)。注意这和烧录时自动擦除不一样,它是把整颗芯片的Flash清空,全部恢复为0xFF。什么场景用得上?芯片设置了读保护导致连不上、想彻底清空程序、或者回收一块二手芯片时。整片擦除是个不可逆操作,点之前一定要想清楚,我曾经就有过手一抖把调试了两天的板子擦成空片,还好有备份,花十分钟烧回来才没耽误事。

第三个是生产模式(Production Programming)。点一下菜单栏左侧那个生产编程图标,JFlash会进入全自动烧录模式:只保留烧录相关按钮,界面极简,防止产线工人误操作。配合命令行参数,JFlash还能实现真正的无人值守批量烧录,这对有生产测试需求的团队来说价值很大,等于把一半的产线烧录工位软件钱省了。

4. 常见问题排查与避坑实录

这个板块我按实际使用中遇到的频率从高到低讲,都是网上每天被问烂了的问题,但能自己排查明白的人真不多。先给一张速查表,后面再逐条展开。

报错/现象最常见原因快速处理
设备管理器找不到J-LinkUSB驱动未装/线材问题重装USB Driver,换数据线
Target voltage not foundVTref未接/板子没供电接好VTref,给目标板上电
Cannot connect to targetSWD接线错/未共地/速度太高查接线和共地,降速重试
Flash timeout / Programming failed电源不稳、接线接触不良降速、短线、独立供电
Verification failed写保护/烧录地址错误检查Option Bytes和地址
target secured芯片开了读保护(RDP)执行Unsecure Chip,会擦除全片

4.1 驱动与连接类问题

设备管理器里找不到J-Link。先确认装软件时有没有勾USB Driver,没勾就重装;勾了还不行,就换一根USB线,很多USB方口线是充电线不带数据传输,这坑我都见怪不怪了。再一个办法是去设备管理器里手动更新驱动,指向JLink安装目录下的Driver文件夹。笔记本用户还要注意,有些电脑的USB3.0口对老设备不太友好,换到USB2.0口试试。

Target voltage not found(检测不到目标电压)。九成是VTref没接对或者目标板没供电。JLink通过VTref线“感知”目标芯片的电压平台,这根线不接,JLink根本不敢跟目标通信,因为不知道对方的电平标准。检查步骤:目标板上电,万用表量一下VTref引脚有没有3.3V;没有就查板子电源。

Cannot connect to target / No Cortex-M SW Device found(连不上目标)。这个报错信息量大,但绝大多数情况就是SWD接线问题或芯片没上电。先用万用表确认SWDIO和SWCLK都通,然后确认不是杜邦线虚接、不是插反、不是地线没共地。共地这个点很关键,JLink和目标板必须共地,不共地SWD信号就是浮空的,神仙也连不上。如果接线全对还连不上,把速度降到100kHz再试,并考虑把Reset引脚也接上(多数JLink SWD口有NRST)。最后再怀疑芯片本身是不是进入了低功耗、或之前烧录时把SWD引脚给禁用掉了——比如你用CubeMX初始化时把PA13/PA14配置成了普通GPIO,程序一跑起来SWD就废了,这种情况下需要按住复位键的同时快速连接,或者把BOOT0拉高让芯片进系统Bootloader后再连。

报错J-Link DLL version mismatch / DLL太老。前面提到装多个版本JLink容易遇到,因为新版安装会覆盖系统DLL,而老版本工具用的还是自己目录下的DLL,一冲突就报错。解决思路是统一版本:要么都升到新版,要么把老工具换到和DLL版本一致。最简单的办法,卸载所有JLink软件,重新只装一个最新版。

4.2 烧录过程中的报错

连接都通了,烧录时弹错误,这个阶段的问题更像“硬钉子”,好在原因也相对集中。

Programming failed / Flash timeout(烧录超时)。这类错误最常见的原因是Flash电压或时钟配置不对。检查目标板电源是否稳定、电压是否符合芯片要求。另一个常见原因是接线太长或接触不良导致SWD通信不稳定,烧到一半丢了数据,处理办法还是那句:降速、短线、查接触。

Verification failed(校验失败)。烧写之后JFlash会读回Flash内容和源文件比对,不一致就报这个。要么是Flash写保护了(芯片的Option Bytes写保护打开),要么是烧录地址跟实际文件不匹配。如果是新板子,先检查地址,再检查Option Bytes;是二手板子或来路不明的板子,先整片擦除,再重新烧录,一般就能解决。

Failed to connect / target secured(读保护锁住了)。芯片被人为设置了读保护(RDP),JLink连过去发现Flash被锁,拒绝正常调试访问。这种要么在JFlash里执行Unsecure Chip(解除保护,会自动整片擦除)——注意数据会全丢;要么使用JLink Commander输入unlock命令。对量产板,我建议烧录完成前最后再开读保护,防止别人把固件读走;对调试板,提前开了RDP就是给自己添堵。

4.3 几个容易忽略的硬件与环境细节

最后补充几个我踩过、也帮别人排查过无数次的“隐形坑”。

电源问题永远是第一嫌疑人。JLink自己的供电能力很弱,很多“兼容款”只是把目标板的3.3V引脚串联到了一个LDO上,带不动大的负载。如果你板子上有电机驱动、WiFi模块这些大电流器件,程序运行时瞬间电流一拉,SWD通信立刻崩。所以目标板尽量独立供电,JLink只做调试和烧录,别指望它当电源。

BOOT0跳线帽的影响。STM32F1的BOOT0拉高会从系统存储器启动,程序不会正常运行,很多新手烧录成功但看到程序没起来,第一反应是“烧录失败”,其实烧录是成功的,是BOOT0状态不对。烧完直接把BOOT0跳回低电平再复位,问题就没了。

换一块芯片就要“忘记”老配置。JFlash的工程文件是跟着芯片走的,但很多人喜欢用“另存为”的方式复刻工程,导致烧录F1的板子用的还是F4的工程。这种张冠李戴的配置下,轻则烧录报错,重则地址搞错程序跑飞。我的习惯是每种芯片保存一个独立.jflash工程文件,命名直接带芯片型号,比如“STM32F103C8_400kHz_SWD.jflash”,一眼就知道该用哪个。

说回我自己,入行这些年烧过的板子没有一千也有八百,工具换来换去,最后桌面固定的还是JFlash配JLink这一套。倒不是因为它多高级,胜在稳、快、省心,尤其是不用开IDE、不用管工程配置,丢个文件就能烧的感觉,真到赶项目的时候才知道有多香。希望这篇能把你的烧录链路一次打通,剩下的事儿就是多烧几块板子,让手感和肌肉记忆先一步到位。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询