<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
說明
1.這節測試下STM32F407VET6+串口網絡模組(ESP8266/Air202/Air302)使用http或者https遠程升級單片機程序.
當前已經了做好:
STM32F407VET6+ESP8266(http/https)
STM32F407VET6+Air202(http/https)
因為程序基本都是一樣的,以STM32F407VET6+ESP8266為例.
2.整個的升級流程和前面的文章一樣
先測試下升級
先使用我提供的程序下載地址測試.
注意:ESP8266的程序當前不能測試使用https訪問mnif.cn這個服務器下載程序文件
如果要測試,需要把地址改為: https://mnifdv.cn/ota/hardware/STM32F4xxESP8266BK/user_crc.bin
我把文件也放在mnifdv.cn這個服務器上了一份.
1.打開這節的程序
2.連接引腳說明
使用串口1作為了日志打印,串口2連接模組.
(單片機)PA2 -- RX(模組)
(單片機)PA3 -- TX(模組)
(單片機)PA8 -- RST(模組復位引腳)
另外:
PA6作為了指示燈
PE4作為了按鍵
指示燈和按鍵不是必須的!
可以按照自己的板子在各個頭文件里面修改引腳定義
3.下載BootLoader到自己的開發板
4.打開用戶程序,修改成連接自己的路由器名稱和密碼
5.如果測試https方式.把地址改為:
https://mnifdv.cn/ota/hardware/STM32F4xxESP8266BK/info.txt
6.接着再下載用戶程序(選擇只擦除程序使用的部分)
觀察串口1打印的日志
1.燒錄完BootLoader然后再燒錄用戶程序打印如下:
2.在用戶程序中控制模組連接路喲器
3.獲取服務器固件信息,如果有新版本,重啟
4.更新完成
應用到自己的項目
1.在自己的Web服務器上建一個目錄,作為存放固件文件
我的地址為: 網站根目錄/ota/hardware/STM32F4xxESP8266BK
2.修改BootLoader的IAP.c文件里面的產品型號和默認固件的下載地址
3.打開用戶程序的IAP.c文件,修改里面的產品型號和記錄固件信息文件的地址
注:如果需要使用https下載,則可以寫成: https://{用戶的IP地址或者域名}/下載路徑
4.分別編譯下BootLoader程序和用戶程序
先下載BootLoader程序到板子
再下載用戶程序到板子
5.把用戶程序的版本改為其它版本,然后編譯下用戶程序
6.編程以后會在其工程目錄生成Bin文件夾,並在里面生成user.bin文件
7. 如果用戶程序編譯出現下面的警告
其實是這個地方導致的
為了便於BootLoader程序提取用戶程序bin文件里面的型號,把型號存儲在了偏移1024字節的位置.
就是我設置的這個字符串存儲的位置影響到了芯片本身分配一些數組的位置.
用戶可以把后面的20改為21或者其他大些的數值,直至不出現警告即可.
這個數值目前是不能超過0x70000 /1024 = 447;
不用設置為最大哈,這樣的話編譯出來的文件就會很大,其中大部分空間都是每用的!
8.打開OTA Tools上位機軟件
提示:該軟件是修改bin文件加入校驗(使得升級穩定可靠)
9.按照紅框選擇配置
10.選擇用戶程序生成的 bin文件
11.點擊 生成固件
12.將在user.bin目錄生成user_crc.bin文件
user_crc.bin文件只是在user.bin的基礎上增加了CRC校驗位
13.把生成的user_crc.bin文件拷貝到服務器
14.打開info.txt文件
15.修改版本號(和用戶程序里面設置的一樣)
16.修改固件程序大小(OTA Tools提示信息里面有這個大小)
17.修改固件程序下載地址(和服務器路徑保持一致)
18.最后的提示信息不需要更改,當前用不到
19.把info.txt文件也拷貝到服務器
20.然后觀察日志,查看升級情況
正常情況下會和一開始的日志流程一樣完成升級.
程序詳細說明
1.遠程升級其實就是使用模組以TCP方式連接Web服務器,
然后給TCP服務器發數據,數據格式是GET指令.
服務器接收到指令以后會下發文件給模組,模組通過串口把數據發給單片機,
單片機接收到數據以后寫到flash,最后加載運行.
2.流程圖
3.flash分配
4.用戶可以根據自己的需求調整BootLoader ,用戶程序, 備份用戶程序的flash分配扇區
注意:BootLoader程序和用戶程序要保持一致.
5.用戶可以根據自己的需求調整存儲其它數據使用的扇區
注意:BootLoader程序和用戶程序要保持一致.
用戶程序詳細說明
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頭過去,把真實的數據寫入緩存.
注:+IPD,XXXX:是模塊在非透傳模式下,模塊會在每一條數據前面增加的內容.
如果自己使用的模塊會有類似的添加的內容,用戶可參考修改.
咱的主要目的是把真實的程序文件數據寫到緩存里面.
9.主循環從緩存取數據,並寫入flash
10.校驗數據的時候是把先前寫入的提取出來校驗
11.如果緩存里面沒有數據,如果接收到相應的文件個數或者超過一段時間沒有接收到數據
會設置 IAPStructValue.ReadDataEndFlag = 1;則認為接收完成
然后做各種判斷,
如果確實接收完了,則寫入0x01狀態,重啟.
如果有錯誤,則嘗試重新下載.
接收空閑是在這地方做的判斷
空閑時間默認3S
12.重啟以后如果檢測到狀態是0x01則寫入0xFF,執行用戶程序
如果檢測狀態是更新錯誤,則回滾程序,執行用戶程序.
細節說明
1.首先整體思路就是把程序文件寫入緩存,然后主循環從緩存里面提取數據寫入flash.
其它各種程序只是為了使升級更加穩定可靠而做.
2.BootLoader跳轉到用戶程序之前需要關閉使用的中斷
3.恢復出廠設置
為了預防超級意外的情況導致程序完全崩潰,在上電之前按下一個按鈕,然后給板子上電.
如果檢測到用戶按下時間超過5S,控制指示燈快閃,用戶松開按鈕以后
設置更新標志,清空flash里面記錄的url地址,重啟設備.
設備重啟以后便會按照默認的地址下載程序
4.程序里面有下載超時和整體運行超時檢測
下載超時:只有在確認開始寫入程序文件的時候才運行,每次寫入程序文件會清零.
主要解決接收一半程序便不再接收的問題
整體運行超時:該超時只要執行BootLoader程序便一直運行
客戶可以在IAP.h修改默認的超時時間
移植使用說明
1.建議用戶直接在提供的工程上進行增加額外的功能
警告:用戶不能在BootLoader程序主循環加硬延時
警告:用戶不能在BootLoader程序主循環加硬延時
警告:用戶不能在BootLoader程序主循環加硬延時
加了延時會影響提取緩存數據的速度,從而導致緩存溢出,接收數據錯誤.
底層串口1日志打印printf為了不過多占用主循環時間,使用的是環形隊列+中斷發送.
如果用戶更改了日志打印口,也必須如此!否則就會造成上面說的情況.
2.BootLoader程序主要是修改對應的模組連接TCP服務器的命令.
如果模組是串口透傳模式,那么修改完命令就可以了.其它的底層就自動完成了.
3.如果模組不是串口透傳模式,用戶需要處理下數據,然后把正常的數據丟給緩存
.其它的底層就自動完成了.
4.如果用戶想在BootLoader運行的時候顯示更新狀態或者進度
1.可以在IAPInit() ;IAPGetProgramFile(); IAPWriteData();函數里面相應的位置增加提示
注意:IAPWriteData()函數
2.如果要展示更新進度
文件大小(字節): IAPStructValue.FileSizeSave
當前接收(字節): IAPStructValue.FileSizeNow
5.對於WiFi模塊而言可以在BootLoader程序里面加上配網程序
加上這個程序以后,可以出廠的時候只燒錄BootLoader.配網結束以后讓設備自己去更新程序.
配網程序直接從提供的用戶程序里把文件復制過來即可
6.關於使用APP控制升級
1.使用APP的話流程就是APP使用http或者mqtt或者mqtt獲取下和設備通信獲取下設備的版本,
然后APP也獲取下服務器上的info.txt文件,APP對比下版本,如果版本不一致,就把info.txt文件發給單片機就可以.
2.更新完了以后,用戶程序里面可以在IAPUpdateDispose函數里面獲取到這次的升級是不是成功.
然后上報給APP即可.
STM32F407VET6+Air202(GPRS)簡要說明
前要:默認固件不支持SSL,如果要測試https方式下載數據
用戶參考硬件使用說明刷下支持SSL的固件.
1.程序和上面的是一樣的.
只是控制模組的指令不一樣,我只簡要說下不一樣的地方
2.打開程序
3.用戶程序不一樣的地方只是配置模組連接TCP服務器(Web服務器),獲取服務器固件信息.
4.BootLoader 程序中控制模組連接服務器
5.發送獲取文件GET 指令
6.https是非透傳模式才可以,模組返回數據是 \r\n+SSL RECEIVE,0,數據個數:\r\n真實數據,所以需要剔除
7.因為GSM通信延遲高些,所以修改為了5S.
8.然后就是這些.