前言
上節實現遠程更新是更新的STM32F103C8T6的單片機
GPRS網絡(Air202/SIM800)升級STM32: 測試STM32遠程乒乓升級,基於(GPRS模塊AT指令TCP透傳方式),定時訪問升級
這節將告訴大家如何移植到其它型號的單片機.
這一節以 STM32F103RET6 (512KB Flash 64KB RAM) 為例
我使用我的這塊板子

大家測試的時候可以按照下面的方式接到自己的GPRS模塊(Air202 / SIM800)
單片機串口1 接到GPRS的AT指令配置串口
單片機引腳PB2 接到GPRS的復位引腳
直接上菜
一,由於是移植的F103系列所以BootLoader程序咱可以不用移植,直接先拷貝過去

二,調整下Flash的分配
2.1 自己自行調整哈,不過要注意最好設置成2的倍數因為512KB的Flash單片機都是以2KB作為一頁

三,其它大家應該知道的配置(以下根據自己使用的芯片選擇)



四,編譯下載,看下打印的信息
user1ROMStart: 0x8004000 //用戶程序1開始的地址
user1ROMSize : 0x3d000 //用戶程序1大小 249856字節 == 244KB
user2ROMStart: 0x8041000 //用戶程序2開始的地址
user2ROMSize : 0x3d000 //用戶程序2大小 249856字節 == 244KB

五,當前Flash分配

六,然后呢,還有一點,大家可以修改一個地方.這個是預留的,方便不同的用戶
6.1 在BootLoader里面呢,其實每隔30S訪問一下升級,不過是受升級標志限制的

6.2 通過上面的章節咱知道在BootLoader里面想操作升級,需要按下PB5等待3S指示燈快閃以后,寫入升級標志重啟,然后實現的升級
如果運行在BootLoader里面超過30S其實就說明沒有用戶程序可執行(或者在升級中)
我現在希望只要是運行在BootLoader里面超過30S,就主動訪問升級去吧!讓芯片主動一點
所以做以下更改

七,最后呢!修改下訪問的http路徑


現在看用戶程序
一,假設用戶程序是什么也沒有的,我以下面的作為用戶程序的底層


二,打開那個程序,首先咱弄的簡潔點,這個程序就是控制PC13 500Ms亮 500Ms滅,其它功能就不做了
咱遠程更新的時候只要發現PC13 500Ms亮 500Ms滅就說明更新進去了

三,拷貝BootLoader里面的stmflash 到咱當前工程

四,然后呢需要拷貝IAP文件(可以拷貝BootLoader里面的,也可以拷貝上幾節用戶程序里面的)
建議拷貝上幾節用戶程序里面的IAP文件,因為上幾節用戶程序里面的IAP相對於BootLoader里面的做了很多裁剪(省內存)
無所謂哈,拷貝哪個都一樣用,里面所有的操作都一樣,只不過BootLoader里面的IAP文件比較龐大點,占用內存大點

五,整理下工程

六,添加上處理升級部分
6.1 獲取更新的狀態,為了簡潔了當我就直接拷貝源碼

6.2 我是從原先用戶程序的這里拷貝的

6.2 處理更新狀態
這個處理狀態主要就是用來清零升級的狀態.

6.3 源碼位置

現在用戶程序的處理升級部分的完了,接着配置下生成bin文件
一,配置用戶程序1
1.1,還記得上面打印的不

1.2,配置用戶程序1

1.3 配置下生成的用戶程序1的bin文件名字 我設置的是 Progect.bin

二,配置用戶程序2
2.1 拷貝出來一份用戶程序


2.2 打開STM32F10xTemplate - 副本程序,首先把基本配置先檢查一遍

\

2.2 打開STM32F10xTemplate - 副本程序,配置生成bin文件

2.3 配置下生成的用戶程序2的bin文件名字 我設置的是 Progect2.bin

測試
一,拷貝記錄設備版本的updatainfo.txt文件,和用戶程序1文件(Progect.bin),用戶程序2文件(Progect2.bin)到服務器



最終效果

二,下載BootLoader程序

三,等待大約30S
3.1 我監控的數據 大家會發現執行了用戶程序,但是會每隔5S重啟

3.2 其實忘了告訴大家一講事情了,BootLoader 里面的程序配置,對用戶程序同樣有效,所以用戶程序需要有喂狗程序
可以自己加上喂狗程序以后,大家重新測試.

結語
該程序代碼可以比較方便的移植到F103全系列的型號上.
其實大家不必急於弄懂我的程序,因為這套升級程序我測試了很多很多次,做了很長時間,最終總結成現在的
如果不明白流程,可以問我哈.
其實無論再怎么變,本質改變不了,環形隊列緩存數據,寫入Flash,啟動運行.
其它的皆是為了穩定性而做的配合性程序
