04-STM32+Air724UG(4G模組)遠程升級篇OTA(自建物聯網平台)-STM32+Air724UG實現利用http或https遠程更新STM32程序(TCP指令,單片機程序檢查更新,精簡內存版)


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

 

說明

為了節省單片機ROM空間,做了這版精簡內存版的程序.

使得最低可以支持32KB ROM空間的單片機.

 

精簡版執行流程概述

在用戶程序里面接收程序文件並寫入flash,接收完成以后置位升級標志,復位重啟.

BootLoader程序檢測到升級標志,把接收的程序文件拷貝到運行區,並運行用戶程序.

 

測試

1.提供了兩份用戶程序(為了精簡內存,用戶可以根據自己實際應用場合選擇使用哪一個)

注:BootLoader程序都一樣,

STM32F10xTemplate   獲取程序文件的時候,先獲取info.txt 然后再獲取程序文件

STM32F10xTemplate_small  直接獲取程序文件

 

 

先看STM32F10xTemplate_small的使用過程

2,下載BootLoader程序到開發板

 

 

 

3.下載以后打印如下(默認開發板上的USB口,單片機串口1作為了日志打印口)

 

 

 

 

 

4.下載用戶程序到開發板

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

需要下載的時候做一下配置. 需要使用下載器 ST-Link  / Jlink 

提示:如果使用的串口下載,可以按照第一節把BootLoader和用戶程序的hex文件合成一個hex文件下載到開發板

提示:如果使用的串口下載,可以按照第一節把BootLoader和用戶程序的hex文件合成一個hex文件下載到開發板

提示:如果使用的串口下載,可以按照第一節把BootLoader和用戶程序的hex文件合成一個hex文件下載到開發板

 

下面演示使用下載器下載

打開用戶程序

 

 調整用戶程序的下載設置,只擦除使用的部分

 

 

 

注意檢查下其它配置是否正確(和BootLoader打印的保持一致)

 

 

 

然后點擊下載

 

 

 

正常情況下會顯示運行用戶程序

 

 

 

5.用戶程序是直接訪問下載程序文件,我是使用按鈕控制的

動作一下開發板上的 PB5 按鈕

 

 

6.在日志上會看到用戶程序訪問下載固件過程

獲取程序文件

 

 

升級完成,運行新的用戶程序

 

 

 

BootLoader程序詳細說明

BootLoader程序檢測到有更新標志,就把下載的用戶程序拷貝到運行區...

然后加載運行區執行.

 

 

因為BootLoader只是簡單的拷貝數據,所以只需要4KB就可以

注:去掉printf打印,可以縮減到3KB,注意如果修改了flash配置參數,記得要和用戶程序里面保持一致

 

 

 

用戶程序詳細說明

1.清除更新標志

用戶程序下載完程序以后,會置位更新標志,就重啟了,BootLoader只是判斷有這個更新標志就拷貝程序

並不清除這個標志,所以用戶程序需要清除這個標志

 

 

2.在IAP.c里面設置產品型號,版本號,和固件下載地址

注:size:AAAAAAAAAAAAAAA  是作為固件大小寫到bin文件里面,這個是由編輯bin文件軟件自動識別設置的

程序下載的時候會提取bin文件大小,然后和實際的文件大小做對比. 之所以增加這個是因為直接下載固件,沒有文件大小容易出問題!!!!

 

 

 

3.然后在配置文件里面控制模組下載固件文件

下載之前只要調用 IAPInit();來初始化所有變量 和 事先擦除flash

IAPResolveUrl(IAPUrlUserInfoPath); 是解析下載地址

在發送完獲取固件文件指令以后需要設置 IAPStructValue.LoopListPutStart = 1;

這個是允許把程序文件寫到環形隊列里面.用戶只需要按照這個流程做就可以.

 

 

4.接收固件寫到環形隊列里面

 

 

5.從緩存里面提取數據寫到flash里面

 

 

 

 

 

 

 

 

6.判斷寫完成以后,設置更新標志,重啟.

 

 

7.超時檢測

一個是檢測發送完獲取固件之后服務器返回數據超時

另一個是接收數據后空閑超時

 

 

 

超時時間可在IAP.h里面修改

 

 

 

 

應用到自己的服務器

1.確認固件文件在服務器上的下載路徑

我的是

 

 

 

 

 

注:設備型號根據自己的修改

版本號嘛...因為是直接訪問下載程序文件,所以程序里面並沒有去判斷版本號

 

2.編譯完成以后會在工程根目錄的bin文件夾里面生成user.bin文件

 

 

 

3.打開OTA Tools軟件(注意需要是2.0.0及其以上版本,如果不是最新,可到源資料中下載)

 

 

 

 

 

4.選擇 剛才生成的user.bin ,然后選擇生成固件

 

 

 

 

 

 

會在user.bin目錄里面生成  user_crc.bin的文件

 

 

 

 

5.然后把生成的固件放到服務器上即可

 

 

 

 

user.bin  和 user_crc_bin的區別

1.每隔128字節增加CRC校驗位

 

 

2.改寫size,把真實的文件大小填寫到bin文件

 

 

 

 

現在看下STM32F10xTemplate

STM32F10xTemplate 和 STM32F10xTemplate_small程序基本是一樣的

只不過STM32F10xTemplate是先通過服務器上面info.txt 文件獲取固件版本和下載地址

固件版本不一致以后再通過固件下載地址獲取固件(這個和上面的一樣了)

 

 

 

 

1.測試下

分別下載BootLoader和用戶程序到開發板

BootLoader和上面是一個程序,上面如果下載了只下載用戶程序就可以

 

 

2.串口日志輸出如下

訪問服務器的info文件,獲取固件版本信息和固件下載地址

如果版本不一樣,根據固件下載地址下載固件

 

 

升級完成以后,用戶程序獲取info文件,檢測到版本號一致,不需要更新.

 

 

 

 

 

 

 

應用到自己的服務器

1.確認下info.txt文件和固件在服務器上的下載路徑

我的都放在了

 

 

 

 

 

 

 

2.設備型號根據自己的修改,版本號可以改為別的

 

 

 

3.編譯完成以后會在工程根目錄的bin文件夾里面生成user.bin文件

 

4.打開OTA Tools軟件

 

 

 

 

 

 

 

4.選擇 剛才生成的user.bin ,然后選擇生成固件

 

 

 

 

 

 

 

 

會在user.bin目錄里面生成  user_crc.bin的文件

 

 

5.然后把生成的固件放到服務器上

 

 

 

 

6.還差一個info.txt文件

 

我准備了一個模板

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

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

 

 

 

 

 

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

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

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

記得修改下用戶程序里面的固件版本,然后重新下載到開發板,

讓本地版本和服務器上面的版本不一樣,一樣的話會提示版本已是最新不需要升級.

 

 

 

用戶程序說明

1.主函數和上一個程序相比就是直接控制模組訪問服務器

 

 

2.先獲取info.txt文件信息

 

 

 

 

 

3.再根據下載路徑獲取固件,就和上面的程序一樣了

注:info.txt和固件都在一個服務器里面,所以我直接再發了個指令(一般http連接超時時間是5s左右)

 

 


免責聲明!

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



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