<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/myota.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
說明
這節測試下STM32F407+Air724UG實現利用http或https遠程更新單片機程序
整個的升級流程和前面的文章一樣,只不過單片機換成了STM32F407
先測試下升級
1.打開這節的程序
2.連接引腳說明
使用串口1作為了日志打印,串口2連接模組.
(單片機)PA2 -- RX(模組)
(單片機)PA3 -- TX(模組)
(單片機)PA8 -- RST(模組復位引腳)
另外:
PA6作為了指示燈(用戶設置程序回滾時,快閃)
PE4作為了按鍵(手動設置程序回滾)
指示燈和按鍵不是必須的!
可以按照自己的板子在各個頭文件里面修改引腳定義
3.下載BootLoader到自己的開發板
4.接着再下載用戶程序(選擇只擦除程序使用的部分)
如果用戶沒有下載器(用戶可以合並Hex文件,然后使用串口下載)
1.用記事本打開BootLoader程序的hex文件
2.用記事本打開用戶程序的hex文件
3.刪除用戶程序的hex數據的第一行和最后一行
4.最終用戶程序
5.復制修改后的用戶程序的hex數據(全部復制)
6.把復制的數據粘貼到BootLoader文件的下面的位置
7.粘貼后的樣子
8.然后把組合后的hex文件下載到單片機里面即可
觀察串口1打印的日志
1.燒錄完BootLoader然后再燒錄用戶程序打印如下:
2.使用TCP連接服務器,發送GET命令獲取服務器固件信息,如果有新版本,重啟
3.BootLoader根據下載地址獲取固件
4.更新完成
應用到自己的項目
提示:
程序支持https下載,如果用戶需要https,只需要把http寫作https
1,首先確定好程序文件在服務器的路徑
關於本人服務器文件夾解釋:(自己隨意就好,最后的文件夾命名建議使用產品的型號)
html:網站根目錄
ota: ota升級
hardware : 硬件程序
STM32Air724BK: 作為產品的型號(根據自己的產品型號修改)
2.假設固件程序的名字為 user_crc.bin
把該固件文件放到上面的目錄中
固件程序下載地址為:
http://服務器IP地址/ota/hardware/STM32Air724BK/user_crc.bin
3.假設記錄固件程序信息文件的名字為 info.txt
把該文件放到上面的目錄中
則文件下載地址為:
http://服務器IP地址/ota/hardware/STM32Air724BK/info.txt
4.修改 用戶程序 的 IAP.C 文件
1.修改固件程序版本(可隨意指定,我設置的為0.0.2)
2.修改產品型號(我設置的為STM32Air724BK)
3.修改記錄雲端固件信息文件下載地址(我的為:http://mnif.cn/ota/hardware/STM32Air724BK/info.txt)
5.修改BootLoader程序 的 IAP.c,設置下產品型號和默認的固件程序下載地址
6.編譯用戶程序
會在工程目錄的bin文件夾生成 user.bin文件
7.打開OTA Tools上位機軟件
提示:該軟件是修改bin文件加入校驗(使得升級穩定可靠)
8.按照紅框選擇配置
9.選擇用戶程序生成的 bin文件
10.點擊 生成固件
11.將在user.bin目錄生成user_crc.bin文件
user_crc.bin文件是在user.bin的基礎上增加了CRC校驗位
12.把生成的user_crc.bin文件拷貝到服務器
13.還差一個info.txt文件
我准備了一個模板
14.修改版本號(和用戶程序里面設置的一樣)
15.修改固件程序大小(OTA Tools_1.0.5提示信息里面有這個大小)
16.修改固件程序下載地址(和服務器上面的保持一致)
17.最后的提示信息不需要更改,當前用不到
18.把info.txt文件也拷貝到服務器
19.然后按照一開始的測試步驟測試即可
記得修改下用戶程序里面的固件版本,然后重新下載到開發板,
讓本地版本和服務器上面的版本不一樣,一樣的話會提示版本已是最新不需要升級.
程序詳細說明
1.遠程升級其實就是使用模組以TCP方式連接Web服務器,
然后給TCP服務器發數據,數據格式是GET指令.
服務器接收到指令以后會下發文件給模組,模組通過串口把數據發給單片機,
單片機接收到數據以后寫到flash,最后加載運行.
2.流程圖
3.flash分配
4.用戶可以根據自己的需求調整BootLoader ,用戶程序, 備份用戶程序的flash分配扇區
注意:BootLoader程序和用戶程序要保持一致.
5.用戶可以根據自己的需求調整存儲其它數據使用的扇區
注意:BootLoader程序和用戶程序要保持一致.
注:這個是我自己封裝的一套falsh存儲代碼
關於這套代碼的詳細使用 https://www.cnblogs.com/yangfengwu/p/14476294.html
用戶程序詳細說明
1.設置中斷向量偏移
地址其實就是用戶程序運行地址,0x08010000
2.軟件設置程序運行位置和占用flash大小
64+128+128+128=448KB = 448*1024= 458752字節 = 0x70000
3.解析下info.txt(服務器上記錄固件信息的文件)
做這個程序是為省去用戶解析的繁瑣.
執行解析之后:
IAPStructValue.IP = mnif.cn;
IAPStructValue.Port = 80;
IAPStructValue.Path = /ota/hardware/STM32F4xxESP8266BK/info.txt
4.處理更新(這個函數需要在認為用戶程序沒有問題的時候在用戶程序里面執行一下.)
為什么要執行一下:
如果更新成功,BootLoader里面會把更新狀態置為 0xFF;用戶程序需要調用一下這個函數清零這個狀態.
如果用戶程序不清零這個狀態,重啟以后BootLoader檢查到0xFF會認為執行用戶程序失敗了.然后執行回滾.
如果本身BootLoader下載程序過程中就檢查到下載的程序文件有問題,BootLoader把更新狀態設置為對應的錯誤
然后執行回滾.用戶程序需要調用一下這個函數清零狀態,如果用戶程序不清零這個狀態,
重啟以后BootLoader檢查狀態是錯誤,就會再次執行回滾(擦除flash會縮短flash壽命).
5.控制模組獲取服務器上記錄固件信息的文件
6.解析info.txt文件內容
如果版本號不一樣,提取和存儲url和文件大小,然后設置升級標志,重啟.
BootLoader程序詳細說明
1.查看IAPInit函數
2.獲取存儲的固件文件大小,固件下載的url,並解析下url
3.如果有更新標志,則備份下用戶程序
4.如果沒有更新標志,則查看下更新狀態,如果狀態是更新有錯誤,則執行回滾
如果檢測到沒有備份的程序,就重新執行升級
5.如果更新狀態是0x01,就設置更新狀態為0xFF
6.控制模組連接TCP服務器(Web服務器),並配置為串口透傳
7.發送get指令獲取程序文件
8.把程序文件寫入緩存
IAPHttpHead是為了去掉http 頭
檢測到http頭過去,把真實的數據寫入緩存.
9.主循環從緩存取數據,並寫入flash
10.校驗數據的時候是把先前寫入的提取出來校驗
11.如果緩存里面沒有數據,如果接收到相應的文件個數或者超過一段時間沒有接收到數據
會設置 IAPStructValue.ReadDataEndFlag = 1;則認為接收完成
然后做各種判斷,
如果確實接收完了,則寫入0x01狀態,重啟.
如果有錯誤,則嘗試重新下載.
接收空閑是在這地方做的判斷
空閑時間默認3S
12.重啟以后如果檢測到狀態是0x01則寫入0xFF,執行用戶程序
如果檢測狀態是更新錯誤,則回滾程序,執行用戶程序.
細節說明
1.首先整體思路就是把程序文件寫入緩存,然后主循環從緩存里面提取數據寫入flash.
其它各種程序只是為了使升級更加穩定可靠而做.
2.BootLoader跳轉到用戶程序之前需要關閉使用的中斷
3.恢復出廠設置
為了預防超級意外的情況導致程序完全崩潰,在上電之前按下一個按鈕,然后給板子上電.
如果檢測到用戶按下時間超過5S,控制指示燈快閃,用戶松開按鈕以后
設置更新標志,清空flash里面記錄的url地址,重啟設備.
設備重啟以后便會按照默認的地址下載程序
4.程序里面有下載超時和整體運行超時檢測
下載超時:只有在確認開始寫入程序文件的時候才運行,每次寫入程序文件會清零.
主要解決接收一半程序便不再接收的問題
整體運行超時:該超時只要執行BootLoader程序便一直運行
客戶可以在IAP.h修改默認的超時時間