13.1-自己开发一个“单片机烧写工具”!不是开玩笑吧?原来如此^~^(OTA升级)
聽(tīng)到這個(gè)"需求"的第一反應(yīng)“這是開(kāi)玩笑吧”。我是是一個(gè)普通的碼農(nóng),怎么可能開(kāi)發(fā)出了那么復(fù)雜的東西。
帶著一頭冷汗,開(kāi)始查資料中…
原來(lái)如此,有一種下載程序的方式叫做“IAP”。 懸著的心終于放了下來(lái)。
原來(lái)“給單片機(jī)燒寫程序”的實(shí)質(zhì)就是把“編譯”好的“程序二進(jìn)制文件”復(fù)制到芯片的flash中,和從電腦傳電影到MP4播放器上是相似的原理。只不過(guò)現(xiàn)在這個(gè)“電影”是 “程序二進(jìn)制文件”,而單片機(jī)就是這個(gè)“二進(jìn)制程序”的“播放器”。
一、前言(需求背景)
需求背景就是“遠(yuǎn)程更新硬件設(shè)備的芯片程序(固件)”。在開(kāi)發(fā)硬件設(shè)備的時(shí)候,一般使用專用“燒寫器”給芯片燒寫程序。從而完成芯片應(yīng)用程序編碼和調(diào)試工作。在硬件設(shè)備研發(fā)完成,正式生產(chǎn)出產(chǎn)品并賣給客戶后。如果需要更新硬件程序怎么辦。難道也要給用戶郵寄一個(gè)燒寫器和程序文件?一個(gè)批次的產(chǎn)品都需要更新,你能郵寄的過(guò)來(lái)嗎?這期間會(huì)消耗多少成本。這是要賠本的節(jié)奏呀。因此,你需要一個(gè)“更新固件”的功能。“更新固件”這個(gè)詞,對(duì)于愛(ài)鼓搗智能設(shè)備的兄臺(tái)應(yīng)該很熟悉吧。注意,使用網(wǎng)絡(luò)或GPRS遠(yuǎn)程升級(jí)固件的時(shí)候,這項(xiàng)技術(shù)被稱為“OTA升級(jí)”。
二、實(shí)現(xiàn)“更新固件”的原理
“更新固件”從技術(shù)角度來(lái)看,本質(zhì)上是“芯片自己給自己更新(燒寫)程序”。沒(méi)錯(cuò)就是自己給自己更新程序,聽(tīng)起來(lái)有點(diǎn)嚇人,萬(wàn)一芯片學(xué)會(huì)了自己給自己迭代升級(jí)程序,就像生物進(jìn)化一樣,一步一步的進(jìn)化,最終出現(xiàn)“智慧思想”怎么辦。如果你看過(guò)“終結(jié)者”就會(huì)知道:“沒(méi)辦法,攔是攔不住的”。因此,就會(huì)出現(xiàn)“硅基生物”代替“碳基生物”的地球(如果你看過(guò)劉慈欣的著作你就會(huì)明白我要表達(dá)的意思)。
芯片自己更新程序的原理是:芯片中是可以存放多個(gè)“程序”的。就和你的手機(jī)可以同時(shí)安裝“支付寶”和“微信”是一個(gè)道理。而實(shí)現(xiàn)芯片自己更新“程序”的原理就是,燒寫在芯片中的其中一個(gè)“程序”可以更新芯片中的另一個(gè)“程序”。把可以更新其他程序的“程序”叫做“Bootloader”,把被更新的“程序”叫做“App”。(當(dāng)然從原理上來(lái)說(shuō)芯片上的多個(gè)程序是可以實(shí)現(xiàn)互相更新的。只是現(xiàn)實(shí)中很少有這樣的需求)。更詳細(xì)的實(shí)現(xiàn)細(xì)節(jié),請(qǐng)閱讀13.2~13.5章節(jié)。
二、STM32單片機(jī)支持的幾種“燒寫”方式說(shuō)明
啟動(dòng)方式由芯片上的兩個(gè)管腳BOOT0和BOOT1來(lái)決定:
| BOOT1=x BOOT0=0 | 從用戶閃存啟動(dòng) | Flash | SWD/JTAG | 單片機(jī)正常運(yùn)行所使用的模式,在此模式,可以直接用專用燒寫器下載程序 |
| BOOT1=0 BOOT0=1 | 從系統(tǒng)存儲(chǔ)器啟動(dòng) | Flash | ISP | 從芯片自帶的bootloader(ISP程序)下載程序,下載完需要切換引腳為“BOOT1=x BOOT0=0 ”并復(fù)位芯片,才能運(yùn)行程序。 |
| BOOT1=1 BOOT0=1 | 從內(nèi)置SRAM啟動(dòng) | SRAM | ISP | 調(diào)試模式,下載到芯片的代碼存放在內(nèi)存中,從而加快下載速度,避免寫Flash。由于程序儲(chǔ)存在內(nèi)存中,因此掉電會(huì)丟失程序 |
-
SWD/JTAG
兩種標(biāo)準(zhǔn)的“燒寫器”編程接口(協(xié)議),支持這些編程接口的燒寫器有:JLINK、ULINK、ST-LINK -
ISP(In System Programing,在系統(tǒng)中編程)
使用固化在芯片內(nèi)部的bootloder更新應(yīng)用程序的一種方式。需要芯片硬件支持(閱讀芯片手冊(cè))。一般使用串口下載程序,常用的下載工具軟件有:國(guó)產(chǎn)的FlyMcu 和 stm公司官方提供的Flash Loader Demonstrator。注意,燒寫的時(shí)候,需要配置芯片的Boot引腳,燒寫完成之后,再修配置回來(lái)才能運(yùn)行程序。 -
IAP(In applicating Programing,在應(yīng)用編程),是一種除基本芯片燒錄方法之外的一種巧妙程序燒寫方式。
實(shí)現(xiàn)IAP下載程序,需要芯片保持在“從閃存啟動(dòng)模式”。其實(shí)現(xiàn)原理為:把flash 劃分為2個(gè)部分,一個(gè)部分用于放置“更新其他程序的bootloader”,另一部分放置普通的應(yīng)用程序。其中bootloder放置在芯片“上電”自動(dòng)運(yùn)行的位置(即用燒寫器燒寫普通程序的位置)。而普通的應(yīng)用程序被放置在flash偏后面的 扇區(qū)中。至此你會(huì)有以下幾個(gè)疑問(wèn),下面分別解答。手機(jī)自動(dòng)更新系統(tǒng),其實(shí)就是使用了IAP的原理。(其實(shí)電腦操作系統(tǒng)和手機(jī)操作系統(tǒng)都有bootloader,只不過(guò)用在電腦系統(tǒng)上,被叫做“Windows Boot Manager”)。
bootloader到底是什么?燒寫程序是怎么做到的?
bootloader起始就是一個(gè)普通的單片機(jī)應(yīng)用程序,但他的功能是,從芯片外界讀取“應(yīng)用程序的bin文件”并把這個(gè)文件放置到芯片F(xiàn)lash的指定位置。就完成了“應(yīng)用程序的燒寫”。
有了bootloader之后,芯片程序怎樣啟動(dòng)?
現(xiàn)在被燒寫好的“應(yīng)用程序”沒(méi)有放置到單片機(jī)上電運(yùn)行的位置,那么應(yīng)用程序怎么啟動(dòng)呢。答案是,芯片上電,默認(rèn)會(huì)運(yùn)行bootloader這個(gè)程序,而bootloader這個(gè)程序可以判斷是否存在可用的App,如果存在則把當(dāng)前程序運(yùn)行的“pc指針”指向放置應(yīng)用程序的flash地址(在此之前,重新指定新的“中斷向量表”和“堆棧”的地址)即可讓應(yīng)用程序跑起來(lái)。是的,使用IAP方式后,以后芯片每次上電都走這樣一個(gè)啟動(dòng)流程。
四、實(shí)現(xiàn)IAP有哪幾種方式,分別說(shuō)明
提到IAP的實(shí)現(xiàn)方式,那可多了去了。可以說(shuō)只要能實(shí)現(xiàn)“數(shù)據(jù)傳輸”,就可以用來(lái)開(kāi)發(fā)IAP升級(jí)固件的功能。以下把常用常見(jiàn)的方式加以詳細(xì)說(shuō)明:
U盤
Bootloader需要讀取U盤的文件系統(tǒng),從U盤讀取固件文件并寫在Flash的指定位置。從而完成程序更新。
最常見(jiàn)的IAP實(shí)現(xiàn)方式,也最方便。只要把固件放置到U盤,然后插入機(jī)器,啟動(dòng)機(jī)器即可自動(dòng)更新應(yīng)用程序。一般智能硬件,采用設(shè)備本身模擬U盤的功能,當(dāng)你把智能硬件使用USB數(shù)據(jù)線連接到電腦上之后,電腦上會(huì)彈出一個(gè)類似U盤的磁盤,你只需把固件文件(bin文件)復(fù)制粘貼到這個(gè)磁盤中即可。然后斷開(kāi)USB連接線,重啟或重新給智能硬件通電,智能設(shè)備就會(huì)自動(dòng)更新固件。缺點(diǎn):要做的支持市面上的所有U盤很難。
串口(RS232/RS485)
Bootloader需要實(shí)現(xiàn)串口通信,使用串口通道接收固件文件并寫在Flash的指定位置。從而完成程序更新。
這個(gè)也是常用的更新固件方式。使用硬件設(shè)備的的“串口通信線”即可完成芯片固件更新。需要配合相應(yīng)的上位機(jī)軟件來(lái)實(shí)現(xiàn)。使用體驗(yàn)比較好,使用起來(lái)也比較穩(wěn)定。(本文一開(kāi)始說(shuō)描述的需求,就是指這種實(shí)現(xiàn)方式)
網(wǎng)絡(luò)TCP
Bootloader需要實(shí)現(xiàn)網(wǎng)絡(luò)通信,使用網(wǎng)絡(luò)通道接收固件文件并寫在Flash的指定位置。從而完成程序更新。
常用于實(shí)現(xiàn)遠(yuǎn)程自動(dòng)更新。比如放置在野外的智能設(shè)備,通過(guò)4G網(wǎng)絡(luò)定期查看是否有更新,如果有則通過(guò)網(wǎng)絡(luò)下載固件并自動(dòng)更新。
藍(lán)牙
Bootloader需要實(shí)現(xiàn)藍(lán)牙通信,使用藍(lán)牙通道接收固件文件并寫在Flash的指定位置。從而完成程序更新。
常用于便攜式設(shè)備的更新。因?yàn)橐话愕谋銛y式設(shè)備都是使用藍(lán)牙通信。所以只能用藍(lán)牙來(lái)更新固件。
比如:智能手表,藍(lán)牙耳機(jī),藍(lán)牙鼠標(biāo),藍(lán)牙xx
CAN總線(主叢電路板方式)
常用于更新大型機(jī)器中的某一塊電路板上芯片的程序。主電路板有文件系統(tǒng),可以儲(chǔ)存其他電路板上芯片的固件文件。大型設(shè)備內(nèi)部,電路板與電路板之間常使用CAN總線通信。因此要更新機(jī)器內(nèi)某個(gè)電路板的程序,可以通過(guò)“主從電路板”的方式,線把固件文件先傳輸?shù)街麟娐钒逍酒?#xff0c;然后主電路板芯片通過(guò)CAN總線給目標(biāo)電路板更新程序。
五、IAP升級(jí)固件中的“加密”說(shuō)明
當(dāng)你的機(jī)器硬件出現(xiàn)問(wèn)題的時(shí)候,你需要把固件文件發(fā)給用戶,讓用戶使用“U盤”或串口來(lái)升級(jí)程序。這個(gè)時(shí)候相當(dāng)于把你的程序可執(zhí)行文件暴露了,如果讓想“復(fù)制”你設(shè)備的人拿到手,他可樂(lè)開(kāi)了花了。他只需要自己寫個(gè)bootloader就能借用你這個(gè)“可執(zhí)行文件”來(lái)生產(chǎn)一模一樣的設(shè)備了。你怎么辦,只能走法律途徑了。所以你不加密固件,相當(dāng)于“鼓勵(lì)別人犯罪”。
再bootloader中作修改。專門編寫一個(gè)加密軟件,來(lái)加密你要發(fā)給用戶的“固件”。然后你自己機(jī)器中的bootloader加入對(duì)應(yīng)的解密代碼。bootloader從U盤或串口拿到“固件”文件先解密,然后在寫到Flash中即可。至于用哪個(gè)加密算法,這里沒(méi)有推薦(需求明確了還怕沒(méi)有解決方案嘛.)。
六、IAP升級(jí)固件中的“壓縮”說(shuō)明
為啥要壓縮固件
因?yàn)榇髥h!普通Stm32的應(yīng)用程序,編譯出來(lái)的Bin文件大小在20K~100K之間。咦,不大呀,怎么說(shuō)大呢?
是不大,但是看對(duì)于什么通信方式來(lái)說(shuō)。
對(duì)于U盤更新固件方式,幾百K是小意思。如果對(duì)于網(wǎng)絡(luò)方式呢。一般都是給遠(yuǎn)程網(wǎng)絡(luò)設(shè)備更新固件,用的是流量。而物聯(lián)網(wǎng)卡的流量很有限,傷不起呀。其次,看你對(duì)速度有沒(méi)有要求。比如你用藍(lán)牙來(lái)更新固件。更新速度的瓶頸是在傳輸速度上。而速度是無(wú)法提高的,只能通過(guò)減小固件體積來(lái)達(dá)到提高更新速度的效果。
怎樣壓縮與解壓縮固件
使用電腦軟件來(lái)實(shí)現(xiàn)對(duì)固件的壓縮。bootloader只要負(fù)責(zé)解壓即可。推薦的芯片可用壓縮算法有:zlib、miniLZO
總結(jié)
以上是生活随笔為你收集整理的13.1-自己开发一个“单片机烧写工具”!不是开玩笑吧?原来如此^~^(OTA升级)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql查询排序(asc,desc)
- 下一篇: win7怎样设置计算机休眠时间,win7