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