<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分配
調整以后,可以查看日志查看具體地址信息
然后根據上面打印的信息調整用戶程序參數
結語
其實此套升級方案經過了大量用戶的測試,應用和反饋,然后經過好幾次的迭代
才形成了當前的方案.客戶當前只需要拿去使用即可.
移植到自己的項目看后面的移植教程.