前面文章提到,我准备自己DIY一个DebugTool,自己做一个既能够通过SWD下载又能实现RTT和兼容Jscop进行波形输出,同时还能进行串口通信的工具。
在对比了DAPLink和Jlink-ob之后,我觉得先使用STM32F072这个芯片来DIY一个Jlink-ob,使用072好处是,它电路简单,不需要外部晶振,同时支持opencdc的虚拟串口和SWO引脚。
这样,如果效果好的话,就在DebugTool上面继承DAPlink和Jlink-ob两个烧录器,可以同时跟踪调试多个板子。
首先花了一个小时画了个小板子,正好嘉立创有免费的打板优惠卷,连运费都不需要,真的感谢嘉立创。
为了方便可靠,接口使用了TypeC接口,并将CC1和CC2进行下拉,保证任何接口都可以获取到5V的VBUS电压。
由于无需晶振,电路非常简洁,为了方便手工焊接,所有阻容元器件全部选用了0603封装,吃激素吃的手还是抖,驾驭不了0402的器件。
鉴于嘉立创的免费卷,先做一个独立的下载器手工一下。另外,立创商城的STM32真的价格太高了,我还是选择了淘宝,目前STM32F072C8T6大概是3块钱一片,拆机件便宜一些,还在板子上的,没拆下来的更便宜,1.8就可以拿到手。
板子还没到,所以先学习一下,如果获取STM32F072中的jlink-ob的固件。
SEGGER肯定不会给我们在官方网站上提供一个按钮的。
但是,我们知道,我们在使用jlink-ob的时候,经常会遇到固件更新的提示,既然它能够通过usb更新jlink-ob的固件,那么说明jlink的驱动程序中一定包含了对应的固件。
一个网名为DIY JLink-OB-072 (JLink + COM) : X893的大神就找到了固件的位置,我们一起来探究一下。
先说答案,这个固件存放在jlink的驱动文件中,就是我们在MDK中也会调用的JlinkAMR.dll文件。
dll文件就是window系统中编译好的二进制文件,所以我们可以使用vs code或者Winhex打开这个二进制文件,就像我们打开bin文件一样。
我们可以在里面搜索关键字,关键字搜索可以直接搜索STM32F072,这个dll文件里面包含多个jlink-ob的固件,这里我们只关心对应STM32F072的。
从上面的图里,我们可以看到这个版本的dll文件中,对应的jlink-ob的固件,以及他的编译时间为2017年。
顺着这个地方向上翻阅,可以翻到一个40 22 00 20 的地方,他后面还跟着 8D 46 01 08。
这里因为是小端模式,所以我们应该把这两个32bit的数据反过来,它就变成了0x20002240和0x0801468D。
熟悉Cortex-M核的朋友都知道,编译后生成的bin文件的第一个32bit数据和第二个32bit数据是处理器的SP和PC两个寄存器对应的取值。
SP是对应的程序的栈顶指针,而PC则对应着程序要运行的指令。
至于,这里的为什么是0x20002240和0x0801468D,我们在下一篇文章中分析。
这里,我们有了程序的起始部分,只需要把他后面的数据全部copy出来另存为一个bin文件就可以了,要copy多少呢,其实按照STM32F072的flash大小来复制就可以,因为程序结尾之后的数据并不会执行,除非他在程序末端存放了一些配置数据。
接下来,我们还需要制作一个bootloader固件,因为从PC指针对应的0x0801468D可以看出来,固件是从很大的一个地址开始运行,的所以我们需要将前面的数据补充为0xFF,然后将上面的提到的SP和PC指针对应的8个字节一起覆盖到bootloader的开始。
这样程序就会自动跳转到我们的固件中执行了。
关于SP和PC指针的确定,以及bootloader的大小还需要在研究一下。