1. 程式人生 > 其它 >1-STM32+MN316(NB-IOT)遠端升級篇OTA(自建物聯網平臺)-STM32通過MN316使用http下載程式檔案,升級程式(微控制器程式輪訓檢查更新)

1-STM32+MN316(NB-IOT)遠端升級篇OTA(自建物聯網平臺)-STM32通過MN316使用http下載程式檔案,升級程式(微控制器程式輪訓檢查更新)

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

說明

這節測試一下STM32通過MN316(NB-IOT)使用http遠端下載升級微控制器程式

提示:升級程式只是把bin檔案資料寫到微控制器,使用哪種方式獲取bin檔案資料都是可以的.

這節是使用http的方式獲取程式bin檔案

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

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

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

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

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

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

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

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

info.txt檔案內容:

version:0.0.1 雲端韌體程式版本

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

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

升級過程:

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

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

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

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

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

備份升級流程圖

GPRS模組和底板安裝說明

測試

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

使用usb口列印串列埠日誌

2.下載使用者程式到開發板

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

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

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

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

重啟之後BootLoader提取url

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

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

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

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

應用到自己的伺服器

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

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

html:網站根目錄

ota: ota升級

hardware : 硬體程式

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

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

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

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

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

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

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

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

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

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

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

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

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

6.編譯 使用者程式(mcu_project)

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

7.開啟OTA Tools上位機軟體

8.按照紅框選擇配置

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

10.點選 生成韌體

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

兩個bin檔案的區別:

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

2.改寫size,把真實的檔案大小填寫到bin檔案

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

13.還差一個info.txt檔案

我準備了一個模板

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

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

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

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

小總結

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

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

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

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

關於Flash分配調整

1.開啟BootLoader 或者 使用者程式裡面的iap_interface.h 檔案

flash的最一開始儲存的BootLoader程式, 結尾儲存更新相關資料, 預留一些空間讓使用者儲存其它資料

最後剩下的平半分, 一部分儲存使用者程式, 另一部分用來備份使用者程式

使用者可以根據自己的需求調整Flash分配大小,注意:BootLoader程式和使用者程式的Flash分配要保證一樣.

使用者可以根據自己的需求調整Flash分配大小,注意:BootLoader程式和使用者程式的Flash分配要保證一樣.

使用者可以根據自己的需求調整Flash分配大小,注意:BootLoader程式和使用者程式的Flash分配要保證一樣.

我設定了BootLoader佔用50KB(使用者可以根據自己的BootLoader程式的bin檔案大小進行更改)

儲存更新相關資料至少用1K, 我設定為2K(使用一頁,便於儲存)這個使用者不要改動.

如果使用者在專案中也需要使用flash儲存資料, 可以根據自己儲存的資料量調整flash大小

資料儲存的起始地址是: FLASH_USERDATE_ADDR

2.調整完成以後,下載BootLoader程式, 串列埠會列印flash具體分配

使用者需要根據上面列印的設定下使用者程式(mcu_project)執行地址和佔用空間

關於升級底層包

1.升級底層包分為iap檔案 和iap_interface檔案

2. iap檔案主要是控制著升級流程的檔案

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

3. iap_interface是介面檔案

根據移植的微控制器實現內部的介面,只要完成裡面的介面就完成了升級程式框架

使用者程式(mcu_project)說明

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

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

執行解析之後:

IAPStructValue.IP = mnif.cn;

IAPStructValue.Port = 80;

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

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

解釋:

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

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

5.控制模組傳送get指令獲取伺服器上記錄韌體資訊的檔案

提取和儲存url然後設定升級標誌,重啟.

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

其實是這個地方導致的

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

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

貌似不影響什麼...

BootLoader程式詳細說明

1.檢視IAPInit函式

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

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

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

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

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

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

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

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

network_module_extract_data 函式是提取網路資料

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

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

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

11,如果接收到相應的檔案個數

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

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

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

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

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

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

15,超過一段時間沒有接收到資料了也設定為接收完了資料

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

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