1. 程式人生 > 其它 >2-HC32F460(華大)+BC260Y(NB-IOT)遠端升級篇(自建物聯網平臺)-整體執行測試-HC32F460通過BC260Y(NB-IOT)使用http遠端下載升級微控制器程式(微控制器程式輪訓檢查更新)

2-HC32F460(華大)+BC260Y(NB-IOT)遠端升級篇(自建物聯網平臺)-整體執行測試-HC32F460通過BC260Y(NB-IOT)使用http遠端下載升級微控制器程式(微控制器程式輪訓檢查更新)

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

說明

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

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

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

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

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

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

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

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

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

info.txt檔案內容:

version:0.0.1 雲端韌體程式版本

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

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

升級過程:

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

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

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

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

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

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

備份升級流程圖

NB-IOT模組和底板安裝說明

安裝到第三排排母!模組的第一個VCC引腳和底板的5V引腳相連線

2.開啟串列埠除錯助手列印串列埠日誌

V1.2版本

V1.4及其以上版本

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

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

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

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

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

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

重啟之後BootLoader提取url

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

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

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

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

應用到自己的伺服器

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

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

html:網站根目錄

ota: ota升級

hardware : 硬體程式

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

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

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

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

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

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

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

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

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

3.修改記錄雲端韌體資訊檔案下載地址(我的為:http://mnif.cn/ota/hardware/HC32F460BC260YBK/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檔案

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.開啟BootLoader或者使用者程式裡面的iap_interface.h 檔案

微控制器的型號是HC32F460JETA, 共有512KB的flash, 然後總共分了64個扇區.一個扇區佔8KB

每次擦除是以扇區進行擦除,所以分配的時候我是以使用多少個扇區進行分配的.

因為最後一個扇區某些位置系統儲存了固定資料,是無法使用的,所以下面實際寫的是64-1 (63個扇區)

2.關於扇區調整

①假設使用者後面編寫了BootLoader程式, 使得BootLoader程式量變化了,使用者需要編譯一下BootLoader程式

然後在bin資料夾裡面可以看到程式大小

②一個扇區是8KB,那麼需要4個扇區就可以了, 假設我設定為5個扇區

BootLoader裡面的設定為5個扇區

使用者程式裡面要和BootLoader裡面設定的一樣

③然後編譯下載BootLoader程式到板子

④然後編譯下載BootLoader程式到板子

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

3,警告! 危險! 危險! 危險!

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

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

4,關於記錄更新資訊和使用者資訊的flash分配

儲存更新相關資料和儲存使用者資料都給了1個扇區(8KB)

儲存使用者資料其實是我預先留給使用者的,程式上並沒有使用那塊空間.如果使用者需要儲存資料

儲存資料的起始地址就是FLASH_USERDATE_ADDR, 如果使用者不需要儲存,那麼可以設定為 0

當然現在顯得有些浪費!!!!因為內部的儲存更新相關資料總共才使用了1KB. 但是為了程式便於移植,就這樣吧.

關於升級底層包

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

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

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

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

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

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

3. iap_interface是介面檔案

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

使用者程式說明

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

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

執行解析之後:

IAPStructValue.IP = mnif.cn;

IAPStructValue.Port = 80;

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

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

解釋:

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

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

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

6.解析info.txt檔案內容

如果版本號不一樣,提取和儲存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一執行就一直累加的的定時,超過時間就會控制程式重啟

細節說明