一步一步實現STM32-FOTA系列教程之BIN文件解包

一步一步實現STM32-FOTA系列教程之BIN文件解包

文章系列鏈接

1、《一步一步實現STM32-FOTA系列教程之bin文件生成》

2、《一步一步實現STM32-FOTA系列教程之STM32-FLASH分區說明》

3、《一步一步實現STM32-FOTA系列教程之FLASH靜態區讀寫》
4、《一步一步實現STM32-FOTA系列教程之Bootloader編寫》

前言

上一篇文章一步一步實現STM32-FOTA系列教程之Bootloader編寫 實現了Bootloader 中加載不同分區固件的功能。但是兩個分區的固件都是通過 MDK 軟件調試燒錄功能燒寫到相應的FLASH分區中去的。而實際情況下,實現 FOTA 往往是通過其他的通信方式將固件BIN文件燒錄到 FLASH 中去的,例如串口、USB、以太網口、SPI通信總線等等。本文就來說說和 FOTA 升級息息相關的BIN文件操作內容。

爲什麼要進行 BIN 文件拆包?

一步一步實現 stm32-fota系列教程之bin文件生成文章中,介紹瞭如何通過 MDK 生成BIN文件。在實際的STM32項目工程中,一般的BIN文件大小小至十幾KB,大至幾十KB都有,例如在我們的教程中,爲每一個 FLASH 分區分別設置了80KB的大小,那麼就可以通過 FOTA 爲本教程所針對的 FLASH 相關分區更新最大80KB的固件。
但是,我們所使用的STM32F103RCT6的內部SRAM空間大小隻有 48KB,這樣的大小沒有辦法適用於BIN文件整包傳輸和寫入FLASH的需求。
所以,將需要進行升級的 BIN文件進行分包傳輸和 FLASH 燒寫就成爲一種可以實際應用的方案了。

BIN文件內容說明

一個 STM32 工程編譯出來的BIN文件,若果使用二進制方式將該文件打開,則會顯示如下內容。實際上 FOTA 要實現的兩個主要功能,一是如何將這種二進制文件傳輸到STM32中,二是如何再將其燒錄到FLASH中去。
BIN文件內容
我們編譯生成出來的 BIN 文件中是不包含 FLASH 燒寫地址相關信息的。這裏面的BIN文件僅僅包含運行在STM32中的可執行代碼。那麼,要將BIN文件寫入到哪一個FLASH分區實際上是由用戶區對 FLASH 操作的代碼所決定的。
可以參考一步一步實現STM32-FOTA系列教程之FLASH靜態區讀寫這一片博文對STM32進行寫入操作。

FOTA具體流程

實現 STM32的遠程升級(FOTA),就需要爲 STM32 遠程升級搭建一臺遠程升級服務器,我們稱作FOTA服務器。FOTA服務器主要的工作有兩個,一個是要對STM32的固件進行解析和分包處理,另外一個就是接收STM32發送來的升級請求,併發送對應的FOTA包。

討論 FOTA的流程,就要對服務器端和客戶端兩個流程進行分別說明。

FOTA 服務器端

FOTA服務器端流程

FOTA 客戶端

客戶端的升級流程就比較簡單了,就是向服務器請求固件信息,並根據返回固件的大小和包數量向服務器請求相應的升級文件包,然後再將升級文件包燒寫到對應的FLASH分區中。

如何進行拆包

對於拆包操作,指的是在服務器端對BIN文件進行的拆包操作。筆者在本教程所使用的一種方案是將需要升級的BIN文件按照有效報文長度爲512字節的包長進行拆解。如果不足512字節,則按照實際的長度,在其後進行補零操作。
例如,需要升級的 BIN文件 大小爲 10240 Bytes,也就是10KB,那麼按照這種拆包方式,就會將該 BIN文件拆解爲 20個包,每個包512Bytes。
BIN拆包

如果需要升級的 BIN文件 大小爲 14532 Bytes,按照如上的拆包方式的話,則會拆解成爲29個包,其中前28個包中每個包 512 Bytes ,第29個包中有效字節長度爲14532 - (28*512)= 196 Bytes ,剩餘的空間則會按照拆包組包要求,進行補零操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章