1. 程式人生 > >WiFi物聯中的OTA韌體升級設計原理

WiFi物聯中的OTA韌體升級設計原理

在物聯網開發中,OTA升級是產品必備功能之一,本篇文章將以慶科EMW3165模組的OTA升級原型為例進行設計原理介紹,以及提供簡單的STM32 DEMO實現幫助大家進一步理解。本文為分析WIFI模組韌體升級,藍芽BLE的韌體升級設計和分析請看《韌體空中升級(OTA)與韌體二次引導的原理和設計》。

一、EMW3165硬體架構


(圖片來自慶科官網)

         EMW3165內部集成了一個Cortex-M4微控制器以及一個無線射頻晶片,其片內Flash容量為512K,RAM為128K,除此之外,通過SPI介面連線2M的片外Flash。現在物聯網開發很多都採用這種類似的架構,或者是通過STM32外部連線WiFi模組聯網,如串列埠等。

        OTA升級設計很重要的一個工作就是首先規劃好Flash區域的佈局,必須清晰地知道Bootloader, Application以及下載的.bin檔案在Flash中放置的位置。

二、Bootloader和Application的角色

         OTA韌體升級其實就是IAP應用程式設計,要完成韌體升級需要設計兩個程式,一個為Bootloader程式,另外一個為Application程式。通常我們是在Application程式中建立socket連線來發起HTTP請求去查詢伺服器是否有新的韌體並進行下載的,並且在片外Flash中修改和儲存韌體的引數資訊,而Bootloader程式主要檢查韌體的引數資訊並且如果需要就負責將Application程式下載的韌體從片外Flash搬運到片內Flash,然後跳到那裡執行。

1.Bootloader角色主要完成的:

         1)讀取韌體引數資訊;

         2)判斷是否需要更新,如果不需要直接跳到Application區域執行;

         3)如果需要更新,則將韌體搬到Application區域,並且更新韌體引數資訊(表示已將更新過該韌體了),最後跳到Application區域執行。

         當然,在搬運韌體前還需要進行校驗如CRC以確保完整性。

2.Application角色主要完成的:

         1)傳送HTTP請求查詢伺服器最新韌體資訊;

         2)和當前韌體做對比,如果需要更新,就進行下載;

         3)將下載的韌體寫到規劃好的OTA韌體儲存區域;

         4)更新韌體引數回寫片外Flash,最後進行軟體復位;

         這裡也相應地首先完成網路上韌體下載的完整性校驗,以確保在網路下載下來的韌體是完整的,然後在寫進OTA韌體儲存區域的時候也需要再進行校驗計算,以在Bootloader在搬運韌體時校驗確保完整性。

三、Flash區域規劃

        在OTA升級中我們需要儲存更新的韌體,如果片內Flash不夠大的時候我們需要加片外Flash進行儲存,簡單介紹一下OTA升級時Flash區域的規劃。(這裡的地址劃分與後面的stm32 demo程式對應,和慶科模組實際位置和大小稍有區別,但是原理都是一樣的)


         1.Bootloader放置在片內Flash的0x08000000地址,大小為64K,STM32裝置上電後首先跳到這裡執行;(主快閃記憶體儲存器被選為啟動區域)

         2.Application放置在片內Flash的0x08010000地址;

         3.PARAMETER_1和PARAMETER_2(備份用)記錄韌體引數資訊的區域,它們放在片外Flash;

         4.OTA_TEMP區域為OTA韌體儲存區域,放在片外Flash,Application從網路下載bin檔案然後寫到該區域,而Bootloader從這個區域搬運韌體到Application區域。

         從上面可以看出,不管是Bootloader還是Application都需要做好片內Flash驅動和片外的Flash驅動來進行Flash操作。

四、OTA升級過程

         1.Application查詢伺服器下載韌體到OTA_TEMP區域;

         2.Application根據下載的韌體修改PARAMETER_1和PARAMETER_2區域的內容,韌體引數資訊可以簡單用一個結構體記錄,如:


        3.Application進行軟體復位;

         4.Bootloader讀取PARAMETER_1區域資訊,判斷是否有韌體需要更新,如判斷上述結構體upgrade_type的值;

         5.如果upgrade_type值為’U’,先做一下校驗,再將OTA_TEMP區域的韌體搬運到片內Flash區域,最後修改PARAMETER_1區域資料如upgrade_type的值改為’0’,裝置下次上電後Bootloader就不會再更新韌體;

         6.最後Bootloader跳到Application區域執行應用程式;

五、總結

         OTA韌體升級設計主要做好幾部分工作:清楚晶片啟動流程、完成Flash區域規劃以及做好Flash驅動,Bootloader主要判斷片外是否有韌體待更新,如果有就搬到片內Flash,而Application程式主要完成韌體的下載,其實韌體更新並沒有大家想象中的難以實現。

六、STM32 DEMO(內附使用說明)

嵌入式企鵝圈原創團隊由阿里、魅族、炬力、華南師範大學物聯網創新中心等資深工程師組成。百分百原創,每週兩篇,分享嵌入式、Linux、物聯網、GPU、Android等技術。歡迎掃碼關注微信公眾號:嵌入式企鵝圈,實時推送原創文章!