<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
說明
這節測試一下STM32+ESP8266實現利用http遠程更新STM32程序
升級方式為:備份升級
我已經把固件文件放在了自己的服務器上
默認使用本人提供的下載路徑測試
文件放在了網站根目錄html->ota->hardware->STM32ESP8266BK
user_crc.bin 固件程序
該固件程序文件並不是直接可以運行的文件
里面的數據每隔128字節后面增加2位CRC校驗位
單片機下載以后每隔130字節校驗一下數據,然后把前128字節寫入Flash.
加入CRC校驗讓升級變的穩定可靠.
info.txt文件內容:
{"version":"0.0.1","size":15990,"url":"http://mnif.cn/ota/hardware/STM32ESP8266BK/user_crc.bin","info":"1.解決了部分BUG
2.優化了部分程序"}
version:0.0.1 雲端固件程序版本
size:15990 固件程序大小(字節)
url:http://mnif.cn/ota/hardware/STM32ESP8266BK/user_crc.bin 固件程序下載地址
info":"1.解決了部分BUG
2.優化了部分程序 使用APP控制升級時,APP的提示信息.
此節代碼正常升級過程:
用戶程序里面每隔一定時間控制STM32通過WIFI模塊使用http的GET指令獲取雲端info.txt文件
然后從文件里面獲取服務器里面的固件程序版本,固件程序大小和固件程序下載地址等信息
如果與自身版本號對比不一致,就把固件程序大小和固件程序下載地址寫入flash,然后設置更新標志,重啟,
重啟執行BootLoader以后,BootLoader程序檢測到更新標志,則提取固件下載的地址,
然后使用http下載程序文件,把程序文件寫入flash,完成升級.
備份升級流程圖
提示
1.默認使用本人提供的下載路徑測試
后面會說明如何應用到用戶的服務器.
2.用戶程序配置生成bin文件,
用戶根據自己軟件的安裝路徑修改控制生成bin文件的指令,否則編譯報錯
3.和基礎篇一樣,串口1作為日志輸出口,串口2和ESP8266相連接(杜邦線連接)
(STM32)PA2 -- RX(WIFI)
(STM32)PA3 -- TX(WIFI)
下載BootLoader程序到開發板
提示:BootLoader程序讓軟件優化了下(減小內存占用)
1.下載以后打印如下
falsh分配情況
提示
上面已經下載進去了BootLoader程序
后面分為人為下載進去用戶程序運行以后執行正常的升級流程
和只下載BootLoader程序的情況下,在BootLoader里面控制升級進去用戶程序
然后執行正常的升級流程.
一,人為下載用戶程序到開發板(注意下載細節)
1.上面已經下載了BootLoader程序,為了下載用戶程序時不覆蓋掉BootLoader程序
需要下載的時候做一下配置.
需要使用下載器 ST-Link / Jlink
2.調整用戶程序的下載設置
只擦除使用的部分
3.注意檢查下其它配置是否正確
4.然后點擊下載
6.運行時打印的日志如下(程序是每隔10S發送get指令獲取 info.txt文件)
當前程序版本 0.0.0
7.連接服務器需要保證wifi可以上網
如果WIFI沒有配網,可以使用基礎控制篇的APP/微信小程序按照基礎篇教程給WIFI配網
為了方便測試,可以直接給調試串口發送連接路由器指令
指令: {"ssid":"QQQQQ","pwd":"11223344"}
QQQQQ :自家路由器名稱 pwd: 自家路由器密碼
8.正常運行下部分截圖說明
發送http請求 info.txt文件
9.程序內部判斷如果和當前程序版本不一致
則提取url寫入flash,置位升級標志,重啟
重啟以后是BootLoader檢測到有升級標志,則備份源程序,然后發送http指令獲取程序文件
10.升級完成以后,運行新程序.
程序是每隔10S發送get指令獲取 info.txt文件
二,只下載BootLoader的情況下測試
1.如果客戶不能按照上面的方式下載用戶程序
BootLoader程序里面也是可以測試升級
實際上該功能是為了預防程序徹底崩潰而做!
注意:程序本身就支持下載出錯自動回滾程序,崩潰處理基本上用不到!
2.下載好BootLoader程序以后,需要用戶按照下面的步驟操作
① 按下PB5(不要松開)
② 復位STM32(或者斷電上電)
③ PB5按下大約10S,指示燈500ms閃耀,此時松開PB5,程序進入崩潰處理狀態
3.客戶可以用串口調試助手設置wifi模塊連接的路由器
{"ssid":"QQQQQ","pwd":"11223344"}
4.發送 updata start 指令
發送了 updata start指令以后單片機會直接獲取更新程序文件,執行更新操作
(程序文件下載地址按照程序內部默認)
5.崩潰處理補充:
1.崩潰處理狀態下,也支持用串口重新設置程序文件下載地址
格式如下:
{"url":"http://mnif.cn/ota/hardware/STM32ESP8266PP/user_crc.bin"}
2.該狀態下也支持APUConfig配網,配網結束以后也會自動重新升級
應用到自己的服務器
1,首先確定好程序文件在服務器的路徑
關於本人服務器文件夾解釋:
html:網站根目錄
ota: ota升級
hardware : 硬件程序
STM32ESP8266BK: 作為產品的型號(根據自己的產品型號修改)
假設固件程序的名字為 user_crc.bin
然后把該固件文件放到上面的目錄中
則固件程序下載地址為:
http://服務器IP地址/ota/hardware/STM32ESP8266BK/user_crc.bin
假設記錄固件程序信息文件的名字為 info.txt
然后把該文件放到上面的目錄中
則文件下載地址為:
http://服務器IP地址/ota/hardware/STM32ESP8266BK/info.txt
2.打開用戶程序的IAP.C文件
1.修改固件程序版本(可隨意指定,我設置的為0.0.2)
2.修改產品型號(我設置的為STM32ESP8266BK,和服務器上面的文件夾對應)
3.修改記錄雲端固件信息文件下載地址(我的為:http://mnif.cn/ota/hardware/STM32ESP8266BK/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文件路徑
二是處理更新狀態變量
從上面的流程圖可知:寫完程序以后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.如果是有更新標志,則控制模塊連接Web服務器(建立TCP連接)
本程序也支持https下載程序文件
8.如果連接上Web服務器,則發送獲取程序文件指令
最后的紅框是控制如果發送了指令服務器10S內沒有返回數據,則會重新執行連接.
程序設置有下載超時30S檢測,一般只能重新連接3次.到達時間重啟,執行程序回滾.
9.發送完上面的獲取程序文件指令以后,服務器便下發程序文件
接收程序數據函數放在了串口中斷里面
函數 IAPHttpHead(Res); 是為了去除http的數據頭
函數 IAPPutDataToLoopList(Res); 是把程序數據寫入環形隊列
如果是https訪問即SSL訪問,返回的數據會攜帶着+IPD,XXXX:
所以需要剔除 +IPD,XXXX:
默認開啟了剔除程序,由 IAPDeleteIPDEnable 控制
10,只要環形隊列里面有數據,則取出來寫入flash
如果到達校驗個數,則提取先前存儲的數據進行校驗
注意:並不是先校驗再存儲,而是先存儲再提取校驗!
11,判斷處理接收完數據
環形隊列沒有了數據,如果Flash里面記錄的文件個數不是0,而且和接收的數據個數一致,就認為接收完了數據
如果沒有存儲文件個數,如果超過一定時間環形隊列沒有數據也認為接收完了數據.
11,程序里面有下載超時和整體運行超時檢測
下載超時:只有在確認開始寫入程序文件的時候才運行,每次寫入程序文件會清零.
主要解決接收一半程序便不再接收的問題
整體運行超時:該超時只要執行BootLoader程序便一直運行
客戶可以在IAP.h修改默認的超時時間
12,程序里面有個判斷接收數據超時時間
當前設置的是3S,如果是GPRS模塊可能延遲較高,客戶需要調整這個時間,增加更新成功率!
建議是3-5S,實在是延遲過高的根據自己的情況設置.
其它細節說明
1.在前面的文章中說過一個事情:
凡是在BootLoader里面使用中斷,跳轉到用戶程序以后同樣有效
BootLoader里面使用了,滴答定時器中斷; 串口1,2接收中斷,空閑中斷; 看門狗.
為了便於用戶移植使用,在加載用戶程序之前清除了除了看門狗以外的所有中斷.
用戶只需在用戶程序里面打開開門狗.具體看后面的移植使用部分
2.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):
3.關於flash區域分配
客戶可以在 stmflash.h里面設置flash分配
調整以后,可以查看日志查看具體地址信息
然后根據上面打印的信息調整用戶程序參數
結語
其實此套升級方案經過了大量用戶的測試,應用和反饋,然后經過好幾次的迭代
才形成了當前的方案.客戶當前只需要拿去使用即可.
移植到自己的項目看后面的移植教程.