ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

JFlash实战:从零开始用J-Link烧录STM32固件完整教程

JFlash实战:从零开始用J-Link烧录STM32固件完整教程 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位DLLWindows 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.3V7脚SWDIO接STM32的PA139脚SWCLK接PA14GND找任意地线连上就行。如果你的板子是自己画的或者用杜邦线直接从JLink转接记住一个原则SWDIO和SWCLK尽量短、尽量绕开电源和晶振走线。我见过太多人拿着30厘米的杜邦线连SWD然后跟我抱怨连不上把速度降到100kHz倒是能连了但这种状态做批量烧录迟早出幺蛾子。接好线之后插上USB先看一眼调试器上的灯JLink正常工作应该是常亮绿灯如果红灯或者不亮先查USB线和供电。接着打开设备管理器展开“通用串行总线设备”如果能看到一个带“J-Link”字样的设备说明驱动认到了。这时候可以顺手打开安装目录下的JLink CommanderJLink.exe一个命令行小工具输入回车如果能打印出DLL版本、SN序列号还能看到“VTref 3.300V”这样的电压信息说明软件、硬件、目标板供电这条链路全通了。这一步验证比直接去JFlash里碰运气要快得多。1.3 固件文件格式hex、bin、elf到底怎么选烧录之前得先搞清楚你手上是什么文件这直接决定了JFlash里怎么配置。STM32项目的固件常见三种格式hex、bin、elfaxf也归这类。Keil编译默认生成的其实是axf/elf勾选“Create HEX File”选项后才会另外输出hex。简单说下三者的区别hex是Intel十六进制格式一大特点是把“地址信息”也写进了文件里所以JFlash加载hex的时候会按文件里记录的地址去放不需要你手动指定烧录地址bin是纯二进制裸数据里面只有数据没有地址你必须告诉JFlash“从哪个地址开始放”对STM32来说通常就是0x08000000elf/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芯片却选了C8JFlash会按照64KB的容量来管理Flash烧录时超过64KB后面的数据就写不进去甚至报错。反过来选大了也不太安全因为JFlash的擦除和校验逻辑跟flash size绑定。确认方法很简单看芯片顶丝印第二行C8T6就是64KBCBT6就是128KB。2.2 接口与速度SWD还是JTAG4000kHz还是100kHz选完芯片下一栏是Interface也就是通信协议。对STM32来说选SWD几乎永远是正确答案。JTAG协议虽然也支持但需要占用PA13/PA14/PA15/PB3/PB4五个引脚而且SWD在这个场景下速度和稳定性完全不输它接线还少两根。除非你有特殊需求比如目标板只引出了JTAG口否则无脑SWD。Speed设置是另一个新手容易忽略的地方默认值通常是4000kHz4MHz。这速度对大多数正常画板、短线连接的场景没问题但凡是碰到以下情况之一杜邦线超过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.300VFound Cortex-M3 r1p1, Little endianIDCode: 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读保护锁住了。芯片被人为设置了读保护RDPJLink连过去发现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、不用管工程配置丢个文件就能烧的感觉真到赶项目的时候才知道有多香。希望这篇能把你的烧录链路一次打通剩下的事儿就是多烧几块板子让手感和肌肉记忆先一步到位。
返回列表