J-Link OB F103 固件提取及维修
2020.04.15更新
一年后回看这篇文,有种公开处刑的感觉。写的都是些啥玩意儿。(0.0)
给出重点:
- 不要用调试器给板子供电,无论你的调试器是不是有保险丝,无论3.3V或5V,都不要用。接GND共地就好。
- 下面写的一大堆操作,其重点在于WinHEX和JFlash这两个软件的使用。会用的情况下就很简单了,用WinHEX拷贝出相应字节,用JFlash写入到相应位置,就ok。
- 为什么固件是这个字节段,我不懂,也不需懂。这是segger的知识产权,是盗版。没钱买正版就低调地用,或者用CMSIS-DAP那种开源的。不是搞逆向的话把时间花在这里不值得,用别人造好的轮子就好。
- 焊板而言QFP是算简单的了,多练就好,唯手熟尔。STM32用来练手不错,便宜耐艹。
- 之前挖出来的固件(最后的链接)好像有点问题,建议还是用别人的吧。
- 之前又自己仿了个072的自用,没啥特别的就不分享了,没啥技术含量,真正的价值在于固件。
以下是旧文
事情起因
某日在调试stm32的时候,错将5v接入3.3v电源输入,开发板烧掉。而且因为jlink没拔掉,也一同阵亡了。光烧了个芯片把整个板换掉太亏,遂打算动手修复。
坏掉的J-Link
学习修复J-Link
- 厚着脸皮向jlink卖家要原理图,卖家表示他也没有
- 网上找资料,只找到部分f072和f103的相似原理图,pcb不一样。
- 看原理图可知布线其实很简单,没有pcb也不要紧,只要找到供下载固件的SWD口(或TX RX),并引出,下载固件即可。
- 万用表加手电筒抄板,SWCLK SWDIO对应PA14 PA13,LED连接到PB12,作为jlink的输出SWCLK SWDIO对应PA3 PA4。
- 找固件,在此特别感谢下列博客文章
x893大神 (万恶之源?)
x893文章的翻译
JLink OB 072固件寻找的过程
JLink OB最新固件提取教程
自制Jlink ob 072 (大致硬件原理图)
固件提取
网上有别人提取的固件,但苦于没csdn积分,最后还是自己提取。
具体过程我就不复读了,上面两篇固件寻找的文章已经写得很好,只说一下简略步骤和心得。
-
从jlink驱动的安装目录中找到JlinkARM.dll,用winhex打开。
-
拉到最后(从后往前找比较方便)→ Ctrl+F(搜索文本)→ J-Link OB(或stm32f103),找到以下描述的字段,上面有芯片型号,编译日期等信息,称之描述字段
描述字段
注意!上面找到的描述字段并不是固件的开头。固件开头在前面十来行或几十行,长这样:XX XX 00 20,从描述字段向上搜索16进制数值 00 20就能看到这个开头(!!!开头不是00 20,是 XX XX 00 20)
固件开头 -
顶栏→搜索→查找16进制数值→00 20 ,右键→选块开始
-
Ctrl+F(查找文本) → J-Link OB(同第二步),找到下一个固件的描述字段
-
右键→ 选块结尾 , 此时你就选择了 固件开头 到 下一个固件开头 的字段,此时选块已经包含了所需固件,且超过了固件结尾。
-
右键→编辑→复制选块→置入新文件 , 保存为.bin文件
2019.01.24更新:第一次弄的时候有点生疏,上面的参考博客也没有看太懂。做到这一步就直接把bin文件烧进去,jlink没有反应,最后还是用的网上hex格式的固件才成功
接着上面步骤:
- 从驱动中提出的固件还不能直接用,要在xxxx 0020前填0,共0x4000个,然后在开头处输入固件的前八个字节。具体见这篇博客结尾处:JLink OB最新固件提取教程
- 完成了上一步后,所得bin文件就可以直接烧录到f103的0x8000000处。
固件提取结束
2019.01.23更新
容易弄错的地方:
- 自己提取出来固件后还要补0,补开头八个字节,才能用
- f103的固件开始地址是0x4000,不同于x893的博客中所写的0x4800,0x4800是f072的。
- 同时f103也不需在0x8000000写x893提供的bin_8000000文件(据说是用于跳转到0x8004800)
- 用JFlash下载固件有时候提示跑崩了 "PC of target system has unexpected value after programming",这时候打开JLink安装路径下的JLinkSTM32.exe,将option bytes恢复出厂设置,即可解决
测试了自己提取的三个固件,分别编译于2012,2014,2017年。
2012年的下载速度4000kHz,无提示更新固件,无弹出联系SEGGER
2014年的下载速度4000kHz,提示更新固件,更新会失败,然后直接识别不到jlink
2017年的下载速度2250kHz,无提示更新固件,提示联系SEGGER。
另外,在更文前的一个月里,我一直使用的是网上提供的hex格式固件。这个固件编译于2009年,下载速度4000kHz,会提示更新固件。但奇怪的是更新没有失败,照常使用了一个多月。但仍在使用时会弹窗,提示建议联系SEGGER。
更新前原内容
- 快递已到,将f103换到板上。
- 准备另一个能用的JLink(STLink)供下载固件用,连好待修复JLink的SWCLK SWDIO(不要连错到板上另一组SWCLK SWDIO)
- 打开JLink.exe检查是否连上了待修复JLink,打开JFlash.exe,设置好设备型号等,打开刚才保存的bin文件,烧写。JFlash具体操作参考文章:Jlink&STlink工具烧录读取hex&bin
经过上述步骤后固件就下载完了。但插上电脑,不识别J-Link,LED指示灯不亮,示波器检查,晶振没有起振。更换晶振,更换固件,并下载bootloader到0x8000000,都尝试过后还是没有反应,郁闷。
为了检查是不是技术太差焊坏了芯片,写了个简单的led闪烁程序,下载进去,灯亮了!
打消了焊坏了芯片的担忧,应该是固件或者bootloader的问题。于是下载了别人的固件,发现是旧版本的,不管了先烧进去。连接电脑,成了
成辣
最后
J-Link OB修好了,对我来说难点其实在于固件提取csdn积分以及焊接
记录一下艰难摸索出的焊接心得
- 清理干净焊盘
- 芯片放上去,用镊子左右拨动,对齐
- 烙铁头上一坨锡,用手指轻轻按住芯片,使其保持对齐状态,用锡固定引脚
- 四端固定,检查是否真的对齐,否则拆下重新对齐
- 引脚全部堆满锡,手速要快,避免松香挥发(熟练一点之后感觉不堆锡也差不多)
- 烙铁头上少量新锡,可沾点松香 焊宝之类的,贴上引脚上的锡堆,将其吸走,手速同样要快,松香、焊宝越少挥发越好
- 吸走后适当调整烙铁上的锡量,不要擦太干净,烙铁头一定要有锡,越亮、越新越好。太干净会导致下次吸锡时难以触碰到残余的锡,难以吸走残锡
- 残余的一丁点锡是很难吸走的,要果断重新上锡堆,烙铁上新锡、焊宝。不要光着烙铁头慢慢抠,很难融化残锡的,也增加烫坏芯片的可能
风枪拆芯片所需时间并不长,360°C下,LQFP48我只吹了二十来秒,LQFP144不超过一分钟。只要出风口贴得低一点,吹均匀了,就很容易拿起来。
用镊子拿芯片的手法:
小芯片可以直接整块夹着往上提。稍大一点夹不住的,可以轻轻提没有引脚的角落。风枪吹的时候,提起的芯片角落能感受到松动,说明时间差不多了,再吹吹另几个角就能提起来。
提起来的时候不要太暴力,小心焊盘被拔坏,更要小心周围的贴片电容电阻之类的被带动掉落,没有原理图的话,掉了就几乎凉了。
另外,可以只先焊上SWCLK和SWDIO,测试能不能被电脑检测到,检测芯片的好坏。
附件
造福大家,文中提到的四个固件都分享出来了,都测试过能在电脑上识别到。
链接:https://pan.baidu.com/s/1DsmNB2dK_dEaLOeioesmeg
提取码:7rp4