前面文章提到,我準(zhǔn)備自己DIY一個(gè)DebugTool,自己做一個(gè)既能夠通過(guò)SWD下載又能實(shí)現(xiàn)RTT和兼容Jscop進(jìn)行波形輸出,同時(shí)還能進(jìn)行串口通信的工具。
在對(duì)比了DAPLink和Jlink-ob之后,我覺(jué)得先使用STM32F072這個(gè)芯片來(lái)DIY一個(gè)Jlink-ob,使用072好處是,它電路簡(jiǎn)單,不需要外部晶振,同時(shí)支持opencdc的虛擬串口和SWO引腳。
這樣,如果效果好的話,就在DebugTool上面繼承DAPlink和Jlink-ob兩個(gè)燒錄器,可以同時(shí)跟蹤調(diào)試多個(gè)板子。
首先花了一個(gè)小時(shí)畫了個(gè)小板子,正好嘉立創(chuàng)有免費(fèi)的打板優(yōu)惠卷,連運(yùn)費(fèi)都不需要,真的感謝嘉立創(chuàng)。
為了方便可靠,接口使用了TypeC接口,并將CC1和CC2進(jìn)行下拉,保證任何接口都可以獲取到5V的VBUS電壓。
由于無(wú)需晶振,電路非常簡(jiǎn)潔,為了方便手工焊接,所有阻容元器件全部選用了0603封裝,吃激素吃的手還是抖,駕馭不了0402的器件。
鑒于嘉立創(chuàng)的免費(fèi)卷,先做一個(gè)獨(dú)立的下載器手工一下。另外,立創(chuàng)商城的STM32真的價(jià)格太高了,我還是選擇了淘寶,目前STM32F072C8T6大概是3塊錢一片,拆機(jī)件便宜一些,還在板子上的,沒(méi)拆下來(lái)的更便宜,1.8就可以拿到手。
板子還沒(méi)到,所以先學(xué)習(xí)一下,如果獲取STM32F072中的jlink-ob的固件。
SEGGER肯定不會(huì)給我們?cè)诠俜骄W(wǎng)站上提供一個(gè)按鈕的。
但是,我們知道,我們?cè)谑褂胘link-ob的時(shí)候,經(jīng)常會(huì)遇到固件更新的提示,既然它能夠通過(guò)usb更新jlink-ob的固件,那么說(shuō)明jlink的驅(qū)動(dòng)程序中一定包含了對(duì)應(yīng)的固件。
一個(gè)網(wǎng)名為DIY JLink-OB-072 (JLink + COM) : X893的大神就找到了固件的位置,我們一起來(lái)探究一下。
先說(shuō)答案,這個(gè)固件存放在jlink的驅(qū)動(dòng)文件中,就是我們?cè)贛DK中也會(huì)調(diào)用的JlinkAMR.dll文件。
dll文件就是window系統(tǒng)中編譯好的二進(jìn)制文件,所以我們可以使用vs code或者Winhex打開這個(gè)二進(jìn)制文件,就像我們打開bin文件一樣。
我們可以在里面搜索關(guān)鍵字,關(guān)鍵字搜索可以直接搜索STM32F072,這個(gè)dll文件里面包含多個(gè)jlink-ob的固件,這里我們只關(guān)心對(duì)應(yīng)STM32F072的。
從上面的圖里,我們可以看到這個(gè)版本的dll文件中,對(duì)應(yīng)的jlink-ob的固件,以及他的編譯時(shí)間為2017年。
順著這個(gè)地方向上翻閱,可以翻到一個(gè)40 22 00 20 的地方,他后面還跟著 8D 46 01 08。
這里因?yàn)槭切《四J?,所以我們?yīng)該把這兩個(gè)32bit的數(shù)據(jù)反過(guò)來(lái),它就變成了0x20002240和0x0801468D。
熟悉Cortex-M核的朋友都知道,編譯后生成的bin文件的第一個(gè)32bit數(shù)據(jù)和第二個(gè)32bit數(shù)據(jù)是處理器的SP和PC兩個(gè)寄存器對(duì)應(yīng)的取值。
SP是對(duì)應(yīng)的程序的棧頂指針,而PC則對(duì)應(yīng)著程序要運(yùn)行的指令。
至于,這里的為什么是0x20002240和0x0801468D,我們?cè)谙乱黄恼轮蟹治觥?/p>
這里,我們有了程序的起始部分,只需要把他后面的數(shù)據(jù)全部copy出來(lái)另存為一個(gè)bin文件就可以了,要copy多少呢,其實(shí)按照STM32F072的flash大小來(lái)復(fù)制就可以,因?yàn)槌绦蚪Y(jié)尾之后的數(shù)據(jù)并不會(huì)執(zhí)行,除非他在程序末端存放了一些配置數(shù)據(jù)。
接下來(lái),我們還需要制作一個(gè)bootloader固件,因?yàn)閺腜C指針對(duì)應(yīng)的0x0801468D可以看出來(lái),固件是從很大的一個(gè)地址開始運(yùn)行,的所以我們需要將前面的數(shù)據(jù)補(bǔ)充為0xFF,然后將上面的提到的SP和PC指針對(duì)應(yīng)的8個(gè)字節(jié)一起覆蓋到bootloader的開始。
這樣程序就會(huì)自動(dòng)跳轉(zhuǎn)到我們的固件中執(zhí)行了。
關(guān)于SP和PC指針的確定,以及bootloader的大小還需要在研究一下。