1. 程式人生 > 其它 >21-STM32+ESP8266+AIR202/302遠端升級方案-擴充套件例程-STM32F407VET6+ESP8266(WiFi)遠端升級微控制器程式(支援HTTPS,支援分段下載)

21-STM32+ESP8266+AIR202/302遠端升級方案-擴充套件例程-STM32F407VET6+ESP8266(WiFi)遠端升級微控制器程式(支援HTTPS,支援分段下載)

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

說明

這節測試一下STM32F407VET6通過ESP8266(WiFi)使用http或https遠端下載升級微控制器程式

我已經把韌體檔案放在了自己的伺服器上

預設使用本人提供的下載路徑測試

檔案路徑: 網站根目錄->ota->hardware->STM32F4xxESP8266BK

user_crc.bin:是韌體程式檔案.

該韌體程式檔案並不是直接可以執行的檔案

裡面的資料每隔128位元組後面增加2位CRC校驗位

微控制器下載以後每隔130位元組校驗一下資料,然後把前128位元組寫入Flash.

加入CRC校驗讓升級變的穩定可靠.

info.txt檔案內容:

version:0.0.1 雲端韌體程式版本

url:http://mnif.cn/ota/hardware/STM32F4xxESP8266BK/user_crc.bin 韌體程式下載地址

"info":"1.解決了部分BUG2.優化了部分程式" 使用APP控制升級時,APP的提示資訊.

升級過程:

注:使用TCP連線Web伺服器,然後傳送相應的GET指令獲取檔案!

使用者程式裡面每隔一定時間控制網路模組使用http的GET指令獲取雲端info.txt檔案

然後從檔案裡面獲取伺服器裡面的韌體程式版本和韌體程式下載地址等資訊

如果與自身版本號對比不一致,就把韌體程式下載地址寫入flash,然後設定更新標誌,重啟,

重啟執行BootLoader以後,BootLoader程式檢測到更新標誌,則提取韌體下載的地址,

然後使用http下載程式檔案,把程式檔案寫入flash,完成升級.

備份升級流程圖

連線引腳說明

使用串列埠1作為了日誌列印,串列埠2連線模組.

(微控制器)PA2 -- RX(模組)

(微控制器)PA3 -- TX(模組)

(微控制器)PA8 -- RST(模組復位引腳)

另外:

PA6作為了指示燈

PE4作為了按鍵

指示燈和按鍵不是必須的!

可以按照自己的板子在各個檔案裡面修改引腳定義

測試

1.使用下載器下載BootLoader程式

正常情況下串列埠1會列印如下日誌

2.開啟使用者程式,配置模組連線的路由器資訊

配置下模組連線的路由器(根據自己家的路由器修改)

3.使用下載器下載使用者程式

4.觀察日誌,說明執行流程

開始執行使用者程式,預設提供的使用者程式設定的程式版本是0.0.0

使用者程式控制模組連線路由器

使用者程式控制模組連線伺服器,使用get指令獲取獲取伺服器上的韌體資訊檔案 info.txt

檢測到版本不一致以後,把獲取的url儲存到flash,設定更新標誌,重啟.

重啟之後BootLoader提取url

BootLoader傳送get指令獲取程式韌體

升級完成以後,執行新下載的程式.

使用者程式每隔一段時間控制模組連線伺服器,使用get指令獲取獲取伺服器上的韌體資訊檔案 info.txt

現在程式版本和上面的是一致的,所以不需要更新

應用到自己的伺服器

1,首先確定好程式檔案在伺服器的路徑

關於本人伺服器資料夾解釋:(自己隨意就好,最後的資料夾命名建議使用產品的型號)

html:網站根目錄

ota: ota升級

hardware : 硬體程式

STM32F4xxESP8266BK: 作為產品的型號(根據自己的產品型號修改)

我把韌體放到了裡面那麼韌體程式下載地址為:

http://伺服器IP地址/ota/hardware/STM32F4xxESP8266BK/user_crc.bin

那麼韌體資訊的下載地址為:

http://伺服器IP地址/ota/hardware/STM32F4xxESP8266BK/info.txt

2.修改使用者程式的 IAP.C 檔案

提示:我把它們儲存在程式bin檔案的1024位元組倍數的位置是為了BootLoader下載的時候便於提取這些資料;

1.產品型號(我設定的為STM32F4xxESP8266BK)

2.修改韌體程式版本(可隨意指定,我設定的為0.0.2)

3.修改記錄雲端韌體資訊檔案下載地址(我的為:http://mnif.cn/ota/hardware/STM32F4xxESP8266BK/info.txt)

5.修改BootLoader程式的 IAP.c,設定下產品型號和預設的韌體程式下載地址

注意:BootLoader裡面的產品型號要和使用者裡面的要保持一樣!!!!

BootLoader程式下載的時候會判斷這個型號一不一致

6.編譯使用者程式

會在工程目錄的bin資料夾生成 user.bin檔案

7.開啟OTA Tools上位機軟體

8.按照紅框選擇配置

9.選擇使用者程式生成的 bin檔案

10.點選 生成韌體

11.將在user.bin目錄生成user_crc.bin檔案

12,關於user_crc.bin和user.bin的區別

user_crc.bin檔案是在user.bin的基礎上增加了CRC校驗位

還有就是改寫size,把真實的檔案大小填寫到bin檔案

12.把生成的user_crc.bin檔案拷貝到伺服器

13.還差一個info.txt檔案

我準備了一個模板

14.修改版本號(和使用者程式裡面設定的一樣)

16.修改韌體程式下載地址(和伺服器上面的保持一致)

17.最後的提示資訊不需要更改,當前用不到

18.把info.txt檔案也拷貝到伺服器,然後按照一開始的步驟測試即可

小總結

遠端升級微控制器程式其實就是使用模組以TCP方式連線Web伺服器,

然後給TCP伺服器發資料,資料格式是GET指令.

伺服器接收到指令以後會下發檔案給模組,模組通過串列埠把資料發給微控制器,

微控制器接收到資料以後寫到flash,最後載入執行.

關於Flash分配調整

1,首先儲存一些使用者用到的其它資料是使用的我封裝的flash_helper框架

https://www.cnblogs.com/yangfengwu/p/14476294.html

該節例程整體的分配是下面的樣子

2.關於扇區調整(舉個例子說明一下)

1,現在編譯完BootLoader,BootLoader只佔用了22KB的Flash

咱就規定使用扇區0和1儲存BootLoader, 扇區2儲存其它資料, 扇區3-7儲存使用者執行程式, 扇區8-11儲存備份程式

2,設定BootLoader程式裡面儲存其它資料使用扇區2

3,設定使用者程式裡面儲存其它資料使用扇區2

4,設定BootLoader程式裡面使用扇區3-7儲存執行程式區

5,設定使用者程式裡面使用扇區3-7儲存執行程式區

6,編譯下載BootLoader程式

7,根據列印的日誌,調整下使用者程式裡面的配置

3,修改完成以後按照一開始的步驟重新上傳bin檔案到伺服器,然後測試即可

注意哈: Flash的分配在產品上線之前就是配置好的!後期不能再調整了.

所以大傢伙一定要給BootLoader和使用者程式留夠足夠的空間!

關於升級底層包

1.這次使用的遠端升級底層是最新優化的一版

此底層包是在前面各種微控制器遠端升級的基礎上提煉優化的一版,

使得更便於移植應用到各個微控制器+各種網路模組上.

2. iap檔案是控制著升級流程的檔案(BootLoader和使用者程式裡面都有這個檔案)

①大傢伙可以在裡面設定基本的韌體版本,升級地址

②可以在BootLoader的iap.h裡面設定升級過程中需要如何去下載,設定多大的快取區

3. iap_interface是介面檔案

使用者在移植的時候需要根據自己的微控制器實現內部的介面,只要完成裡面的介面就完成了升級程式

使用者程式說明

1.解析下info.txt下載路徑(伺服器上記錄韌體資訊的檔案)

做這個程式是為省去使用者解析的繁瑣.

執行解析之後:

IAPStructValue.SSLEN =0; (如果是https,則為1)

IAPStructValue.IP = mnif.cn;

IAPStructValue.Port = 80;

IAPStructValue.Path =/ota/hardware/STM32F4xxESP8266BK/info.txt

2.處理更新(這個程式需要在認為使用者程式沒有問題的時候在使用者程式裡面執行一下)

解釋:

BootLoader更新程式的時候會設定一些更新狀態;使用者程式需要呼叫一下這個函式清除更新狀態.

如果使用者程式不清除更新狀態,那麼一旦程式重啟以後BootLoader檢查到更新狀態以後會自行回滾程式.

3.控制模組獲取伺服器上記錄韌體資訊的檔案

6.解析info.txt檔案內容

如果版本號不一樣,提取和儲存url然後設定升級標誌,重啟.

7,補充:如果編譯使用者程式出現下面的警告

其實是這個地方導致的

為了便於BootLoader程式提取使用者程式bin檔案裡面的型號,把型號儲存在了偏移1024位元組的位置.

設定的這個字串儲存的位置影響到了晶片本身預設分配一些陣列的位置.就會報上面的警告.

貌似不影響什麼...

使用者也可以增大這個變數,增大變數的同時會增大bin檔案大小

BootLoader程式詳細說明

1.檢視IAPInit函式

2.獲取儲存的韌體下載的url,並解析下url

3.如果有更新標誌,則備份下使用者程式

4.如果沒有更新標誌,則檢視下更新狀態

如果狀態是更新有錯誤,則執行回滾,如果檢測到沒有備份的程式,就重新執行升級

5.如果更新狀態是0x01,就設定更新狀態為0xFE

7.控制模組連線TCP伺服器(Web伺服器)

8.傳送get指令獲取程式檔案

8.在TCP接收資料函式裡面把韌體資料寫入快取

微控制器是通過串列埠和模組通訊,所以在串列埠中斷裡面接收

底層解析什麼的都做好了,自動解析以後儲存到快取裡面

9.從快取取資料,並寫入flash

11,如果接收到相應的檔案個數或者超過一段時間沒有接收到資料

設定 IAPStructValue.ReadDataEndFlag = 1;認為接收完成

12,判斷接收完成之後做各種判斷

如果確實接收完了,則寫入0x01狀態,重啟.

如果有錯誤,則嘗試重新下載.

13,如果是程式檔案下載完成以後重啟,重啟以後檢查到更新狀態是0x01會設定更新狀態為0XFE

14,然後載入執行使用者程式

15,超過一段時間沒有接收到資料,是在這裡做的判斷

16,客戶可以在IAP.h修改預設的超時時間

整體執行超時是BootLoader一執行就一直累加的的定時,超過時間就會控制程式重啟

細節說明

1.flash_helper 在程式中已經使用了陣列的 0-255位置了,使用者使用的時候從256開始使用

2.使用https下載的時候推薦開啟分段下載模式

如果檔案很大,使用https分段下載如果下載時間過長伺服器會主動關閉連線,使用者可以適當增大每次分段下載的資料個數

這個個數最好 <= 下面的環形佇列接收資料快取大小