<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左右)