04-STM32+W5500+AIR202遠程升級方案-功能1-STM32+W5500實現利用http遠程更新STM32程序(定時訪問升級,備份升級)


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

 

 

說明

這節測試一下STM32+W5500實現利用http遠程更新STM32程序

升級方式為:備份升級

 

我已經把固件文件放在了自己的服務器上

默認使用本人提供的下載路徑測試

文件放在了網站根目錄html->ota->hardware->STM32W5500BK

 

 

 

user_crc.bin  固件程序

該固件程序文件並不是直接可以運行的文件

里面的數據每隔128字節后面增加2位CRC校驗位

單片機下載以后每隔130字節校驗一下數據,然后把前128字節寫入Flash.

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

 

 

info.txt文件內容:

{"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32W5500BK/user_crc.bin","info":"1.解決了部分BUG
2.優化了部分程序"}

 

version:0.0.1  雲端固件程序版本

size:15990     固件程序大小(字節)

 url:http://mnif.cn/ota/hardware/STM32W5500BK/user_crc.bin   固件程序下載地址

 info":"1.解決了部分BUG
2.優化了部分程序   使用APP控制升級時,APP的提示信息.

 

 

此節代碼正常升級過程:

用戶程序里面每隔一定時間控制STM32通過W5500使用http的GET指令獲取雲端info.txt文件

然后從文件里面獲取服務器里面的固件程序版本,固件程序大小和固件程序下載地址等信息

如果與自身版本號對比不一致,就把固件程序大小和固件程序下載地址寫入flash,然后設置更新標志,重啟,

重啟執行BootLoader以后,BootLoader程序檢測到更新標志,則提取固件下載的地址,

然后使用http下載程序文件,把程序文件寫入flash,完成升級.

 

備份升級流程圖

 

 

 

 

提示

1.默認使用本人提供的下載路徑測試

后面會說明如何應用到用戶的服務器.

 

2.用戶程序配置生成bin文件,

用戶根據自己軟件的安裝路徑修改控制生成bin文件的指令,否則編譯報錯

 

 

 

 

 

3.跳線帽短接單片機串口1 和 USB轉串口模塊

 

 

 

 

4.連接網線(網線另一端連接可以上網的路由器或者交換機)

 

 

下載BootLoader程序到開發板

 

 

1.下載以后打印如下

 

 

 

falsh分配情況

 

 

提示

上面已經下載進去了BootLoader程序

后面分為人為下載進去用戶程序運行以后執行正常的升級流程

和只下載BootLoader程序的情況下,在BootLoader里面控制升級進去用戶程序

然后執行正常的升級流程.

一,人為下載用戶程序到開發板(注意下載細節)

1.上面已經下載了BootLoader程序,為了下載用戶程序時不覆蓋掉BootLoader程序

需要下載的時候做一下配置.

需要使用下載器 ST-Link  / Jlink 

 

2.調整用戶程序的下載設置

只擦除使用的部分

 

 

 

 

3.注意檢查下其它配置是否正確

 

 

 

 

 

 

 

4.然后點擊下載

 

 

 

 

 

6.運行時打印的日志如下

注:用戶程序是在基本控制篇MQTT通信程序的基礎上增加了升級處理程序

程序是每隔10S發送get指令獲取 info.txt文件

當前程序版本 0.0.0

 

 

 

 程序內部判斷如果和當前程序版本不一致

則提取url寫入flash,置位升級標志,重啟

 

 

7.重啟以后是BootLoader檢測到有升級標志,則備份源程序,然后發送http指令獲取程序文件

 

 

 

 

 

 

 

10.升級完成以后,運行新程序.

 

 

 

 

 

 

11,我放到雲端的程序就是當前的用戶程序,只不過版本設置的不一樣

也是每隔10S發送get指令獲取info.txt文件,檢測一下版本

 

 

二,只下載BootLoader的情況下測試

1.如果客戶不能按照上面的方式下載用戶程序

BootLoader程序里面也是可以測試升級

實際上該功能是為了預防程序徹底崩潰而做!

注意:程序本身就支持下載出錯自動回滾程序,崩潰處理基本上用不到!

 

2.下載好BootLoader程序以后,需要用戶按照下面的步驟操作

① 按下PB5(不要松開)

② 復位STM32(或者斷電上電)

③ PB5按下大約10S,指示燈500ms閃耀,此時松開PB5,程序進入崩潰處理狀態

 

 

4.發送 {"data":updata,"cmd":"start"} 指令

發送了 {"data":updata,"cmd":"start"} 指令以后單片機會直接獲取更新程序文件,執行更新操作

(程序文件下載地址按照程序內部默認)

 

 

 

 

 

 

5.崩潰處理補充:

1.崩潰處理狀態下,也支持用串口重新設置程序文件下載地址

格式如下:

{"url":"http://mnif.cn/ota/hardware/STM32W5500BK/user_crc.bin"}

 

 

應用到自己的服務器

 

1,首先確定好程序文件在服務器的路徑

關於本人服務器文件夾解釋:

html:網站根目錄

ota: ota升級

hardware : 硬件程序

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

 

 

假設固件程序的名字為 user_crc.bin

然后把該固件文件放到上面的目錄中

則固件程序下載地址為:

http://服務器IP地址/ota/hardware/STM32W5500BK/user_crc.bin

 

假設記錄固件程序信息文件的名字為 info.txt

然后把該文件放到上面的目錄中

則文件下載地址為:

http://服務器IP地址/ota/hardware/STM32W5500BK/info.txt

 

2.打開用戶程序的IAP.C文件

1.修改固件程序版本(可隨意指定,我設置的為0.0.2)

2.修改產品型號(我設置的為STM32W5500BK,和服務器上面的文件夾對應)

3.修改記錄雲端固件信息文件下載地址(我的為:http://mnif.cn/ota/hardware/STM32W5500BK/info.txt)

 

 

 

 

3.打開BootLoader程序的 IAP.c,設置下默認的固件程序下載地址

 

 

 

編譯用戶程序

1.默認會生成 user.bin文件

 

 

2.打開OTA Tools上位機軟件

 

 

 

提示:該軟件是修改bin文件加入校驗(使得升級穩定可靠)

 

3.按照紅框選擇配置

 

 

 

 

4.選擇用戶程序生成的 bin文件

 

 

 

5.點擊 生成固件

 

 

 

 

6.將在user.bin目錄生成user_crc.bin文件

 

 

 

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

 

 

 

7.把生成的user_crc.bin文件拷貝到服務器

 

 

8.還差一個info.txt文件

1.我准備了一個模板

 

 

 

2.修改版本號(和用戶程序里面設置的一樣)

 

 

3.修改固件程序大小(OTA Tools_1.0.5提示信息里面有這個大小)

 

 

 

4.修改固件程序下載地址(和服務器上面的保持一致)

 

 

 

5.最后的提示信息不需要更改,當前用不到

 

 

 

 

 

9.把info.txt文件也拷貝到服務器

 

 

 

 

 

 

10.然后按照一開始的測試步驟測試即可

注意:如果用戶是自行下載進去當前的用戶程序以后測試,

記得修改下版本,讓本地版本和服務器上面的版本不一樣.

一樣的話會提示版本已是最新不需要升級.

 

 

 

用戶程序執行詳細說明

1.用戶程序就做三件事情

一是解析下用戶設置的info.txt文件路徑

 

 

 

 

 

 

上面的程序是解析  char IAPUrlUserInfoPath[IAPUrlPathLen]="http://mnif.cn/ota/hardware/STM32W5500BK/info.txt";

IAPStructValue.SSLEN    :0-http   1-https

IAPStructValue.IP   :IP地址或者域名  解析上面的為:mnif.cn

IAPStructValue.Port   :端口號  如果用戶不指定,http默認80端口,https默認443端口

IAPStructValue.Path  :路徑     /ota/hardware/STM32W5500BK/info.txt

 

二是處理更新狀態變量

 

 

 

 

 

 

 

從上面的流程圖可知:寫完程序以后BootLoader寫入更新狀態為 0x01

重啟以后,BootLoader判斷是0x01 寫入 0xFF

用戶程序需要清除這個狀態,如果不清除0xFF

那么再次重啟以后,BootLoader判斷是0xFF便會執行回滾操作!

 

提示:用戶應該在認為程序執行沒有錯誤的地方調用 

IAPUpdateDispose();

如果期間有了錯誤導致了重啟,BootLoader便自動回滾!

 

三是每隔一定時間獲取雲端的info.txt文件信息,檢查更新

 

 

 

 

 

 

 

 

 

 

上面的程序便是解析info.txt文件里面的內容

對比版本號,如果版本號不一致則把固件程序大小,固件程序下載地址存儲到Flash

然后設置更新標志,重啟.

 

 

BootLoader程序執行詳細說明

1.BootLoader程序執行相對比較復雜.

為了便於客戶移植使用,程序整體封裝成了包,后面會有相應的移植教程,供用戶參考移植

 

2.檢測是否進入崩潰處理

 

 

 

3.更新的所有初始化和崩潰處理都在這個里面

 

 

 

4.獲取固件文件大小,固件程序下載地址

 

5.如果有更新標志 ,備份程序

 

 

 

 

 

 

6.沒有更新標志便檢測更新狀態,如果更新狀態有錯誤則執行回滾操作

 

 

 

6.如果更新狀態是剛升級完程序,則寫入0xFF,執行主循環以后就加載用戶程序運行了

 

 

 

7.如果有更新標志,控制W5500連接服務器

 

 

8,連接上服務器以后,置位連接標志

 

 

9.如果連接上Web服務器,則發送獲取程序文件指令

 

 

 

 

 

 

 

 

 

9.發送完上面的獲取程序文件指令以后,服務器便下發程序文件

如果判斷接收到了 Web服務器返回的數據,寫入緩存

 

 

 

 

10,只要環形隊列里面有數據,則取出來寫入flash

如果到達校驗個數,則提取先前存儲的數據進行校驗

注意:並不是先校驗再存儲,而是先存儲再提取校驗!

 

 

 

 

 

 

 

 

 

 

11,判斷處理接收完數據

環形隊列沒有了數據,如果Flash里面記錄的文件個數不是0,而且和接收的數據個數一致,就認為接收完了數據

如果沒有存儲文件個數,如果超過一定時間環形隊列沒有數據也認為接收完了數據.

 

 

 

11,程序里面有下載超時和整體運行超時檢測

下載超時:只有在確認開始寫入程序文件的時候才運行,每次寫入程序文件會清零.

主要解決接收一半程序便不再接收的問題

 

整體運行超時:該超時只要執行BootLoader程序便一直運行

 

 

 

客戶可以在IAP.h修改默認的超時時間

 

 

 

 

12,程序里面有個判斷接收數據超時時間

當前設置的是3S,如果模塊延遲較高,客戶需要調整這個時間,增加更新成功率!

建議是3-5S,實在是延遲過高的根據自己的情況設置.

 

 

 

 

其它細節說明

1.再過一遍流程

用戶程序get指令獲取info.txt文件的內容

從內容里面提取版本號

如果版本號和本地的不一致

則接着提取size(程序文件大小),url(固件下載的地址) 存儲到flash,置位升級標志,重啟

BootLoader執行以后從Flash里面提取size,url.然后根據url獲取程序文件

 

2.BootLoader從Flash里面提取size,url解析部分

 

 

 以上程序會把用戶存儲的url解析處理

假設url是 http://mnif.cn/ota/hardware/STM32W5500BK/user_crc.bin

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

IAPStructValue.IP = "mnif.cn"

IAPStructValue.Port = 80 (如果開頭是http則為80,如果是https則為443,如果指定了端口則按照指定的)

IAPStructValue.Path =  "/ota/hardware/STM32W5500BK/user_crc.bin"

 

3.再次解析IAPStructValue.IP

w5500連接服務器之前,如果地址是域名,則需要先執行DNS解析域名,獲取IP地址

如果地址是字符串型IP地址,則需要轉成十進制.

實際上最終的IP地址存儲在  IAPStructValue.IPValue 數組里面

 

4.在前面的文章中說過一個事情:

凡是在BootLoader里面使用中斷,跳轉到用戶程序以后同樣有效

BootLoader里面使用了,定時器2;  串口1,2,3接收/發送/空閑中斷; 看門狗.

為了便於用戶移植使用,在加載用戶程序之前清除了除了看門狗以外的所有中斷.

用戶只需在用戶程序里面打開開門狗.具體看后面的移植使用部分

 

  

 

5.http / https 訪問與用戶填寫的url有關

http://mnif.cn/ota/hardware/STM32ESP8266PP/            http訪問,端口80          
https://mnif.cn/ota/hardware/STM32ESP8266PP/          https訪問,端口443        
http://mnif.cn:8080/ota/hardware/STM32ESP8266PP/   http訪問,端口8080

https://mnif.cn:888/ota/hardware/STM32ESP8266PP/    https訪問,端口888

注:當前底層單片機支持https訪問下載,但是Web服務器還需要配置

 

解析函數位置(BootLoader IAP.c):

 

 

 

 

 

6.關於flash區域分配

客戶可以在 stmflash.h里面設置flash分配

 

 

 

調整以后,可以查看日志查看具體地址信息

 

 

 

 

 

然后根據上面打印的信息調整用戶程序參數

 

 

 

 

結語

其實此套升級方案經過了大量用戶的測試,應用和反饋,然后經過好幾次的迭代

才形成了當前的方案.客戶當前只需要拿去使用即可.

移植到自己的項目看后面的移植教程.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM