為什么做這個(gè)?
上段時(shí)間做了個(gè)STM32串口IAP的開源項(xiàng)目,在實(shí)際項(xiàng)目中如果采用uart或者485等進(jìn)行數(shù)據(jù)通信那么采用串口IAP進(jìn)行固件升級(jí)將會(huì)是個(gè)很好的選擇,但是有的時(shí)候我們的產(chǎn)品或者項(xiàng)目不是用的串口而是用的USB和上位機(jī)進(jìn)行通信,那么這時(shí)候就沒必要用USB轉(zhuǎn)串口工具進(jìn)行協(xié)議轉(zhuǎn)換了,這樣不僅存在風(fēng)險(xiǎn)而且增加成本。所以很多時(shí)候會(huì)采用USB的HID、CDC等子類進(jìn)行數(shù)據(jù)通信,在這種情況下進(jìn)行固件升級(jí)就會(huì)優(yōu)選DFU方式了。什么是dfu? 準(zhǔn)確的說它也是IAP的子集,只不過我們常認(rèn)為的IAP是通過串口,而dfu是通過USB而已。
通過dfu進(jìn)行升級(jí)需要使用.dfu文件,ST官方提供了將.hex文件或者.bin文件轉(zhuǎn)成.dfu文件的工具,最新的版本是DfuSe—v3.0.4(可以從官方下載),我下載安裝之后發(fā)現(xiàn)并不能將.hex轉(zhuǎn).dfu 總是提示我文件錯(cuò)誤。還有一個(gè)問題就是.bin生成.dfu之后保存的位置總是不對(duì)。這真的不能忍呀,于是就直接看官方的MFC源碼開始跳進(jìn)了解BUG的坑。。。
我做了些什么?
基于ST官方所提供的DfuSe_v3.0.4版本。
特色:
1.解決ST官方版本無法將.hex格式文件直接轉(zhuǎn)換成.dfu格式文件的痛點(diǎn)。
2.解決ST官方版本保存生成的目標(biāo)文件之后文件找不到的BUG。
官方v3.0.4使用的是低版本vs,我這里使用的vs2017最新版,如果你要對(duì)源碼進(jìn)行修改請(qǐng)安裝相關(guān)環(huán)境。
干貨呢?
所有文件都放在github上了,點(diǎn)擊這里就會(huì)看到
目錄結(jié)構(gòu)
-
"Bin": 這里是生成好的最終可以直接使用的目標(biāo)文件,如果你對(duì)源碼不感興趣可以丟棄源碼只使用這里的可執(zhí)行文件就夠了。包括:
"DfuFileMgr.exe": 對(duì),這個(gè)就是能把hex文件直接轉(zhuǎn)換成dfu的神器了。
"DfuSeDemo.exe": 這個(gè)可執(zhí)行文件就是對(duì)下位機(jī)進(jìn)行固件升級(jí)的上位機(jī)工具了。
"DfuSeCommand.exe": 這個(gè)是腳本啦,就是給你提供命令行的方式去dfu升級(jí)固件,其實(shí)在真正的項(xiàng)目中不會(huì)使用DfuSeDemo.exe工具進(jìn)行固件升級(jí)的,你想呀,你要是把DfuSeDemo.exe丟給客戶,哪個(gè)客戶能忍受得了?都是直接把這個(gè)腳本嵌入到你的客戶端應(yīng)用中去神不知鬼不覺的升級(jí)。
"STDFUTester.exe": 這個(gè)跟你沒有半毛錢的關(guān)系,不要去操心。
".dll": 這個(gè)就是上面4個(gè)exe文件運(yùn)行所需要的動(dòng)態(tài)鏈接庫,不能少了。
"Doc": 這是ST官方提供的說明文檔,反正我是懶得看,也看不懂。
"Driver": 這個(gè)東西很重要,有的電腦自帶DFU驅(qū)動(dòng),但有很多就不行,所有這里提供了DFU的驅(qū)動(dòng)。根據(jù)的你電腦選擇對(duì)應(yīng)的驅(qū)動(dòng)安裝就好了。如果你是win10,并且沒有自帶驅(qū)動(dòng),那么你就試試win8的驅(qū)動(dòng)吧。
"version.txt": 你懂得
"Sources": 看名字就知道這是源碼了??梢蕴崆案嬖V你這是基于C++的MFC程序,如果你沒玩過MFC那就盡量遠(yuǎn)離吧,避免濺你一身血。。。
"keilkill.bat": 這是dos的腳本程序,因?yàn)榫幾g代碼后會(huì)生成很多鏈接庫或者中間文件之類的東西,很占用存儲(chǔ)空間。所以就寫了個(gè)腳本,當(dāng)你編譯完成之后退出vs然后雙擊執(zhí)行這個(gè)腳本就會(huì)把那些垃圾清除了。
"test.bin和test.hex": 沒啥用,就是給你做測(cè)試用的。
代碼工程打開的正確方式
用VS打開Sources文件夾下的DfuSe.sln,這個(gè)就不用我教你了吧。
(前4個(gè)要按照順序)
- 重新生成STTubeDevice30
- 重新生成STDFU
- 重新生成STDFUFiles
- 重新生成STFUPRT
- 之后就可以將DfuFileMgr、DfuSeDemo、DfuSeCommand中的任意一個(gè)設(shè)置為啟動(dòng)項(xiàng)進(jìn)行啟動(dòng)了。
- 根據(jù)你的期望去實(shí)現(xiàn)你的小目標(biāo)吧。
接下來有什么打算
將DfuFileMgr.exe做成腳本的形式,這樣當(dāng)Keil編譯完成生成hex文件之后自動(dòng)的去調(diào)用腳本生成dfu文件。就不用再用鼠標(biāo)在那點(diǎn)呀點(diǎn)呀的了。
這一項(xiàng)還沒想到。。。。。。。
更新日期
2017/06/17