<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLCH579M/Air724UG/myota.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
說明
這節測試一下CH579通過Air724UG(4G GPRS)使用http或https遠程下載升級單片機程序
我已經把固件文件放在了自己的服務器上
默認使用本人提供的下載路徑測試
文件路徑: 網站根目錄->ota->hardware->CH579Air724BK

user_crc.bin: 是固件程序文件.
該固件程序文件並不是直接可以運行的文件
里面的數據每隔128字節后面增加2位CRC校驗位
單片機下載以后每隔130字節校驗一下數據,然后把前128字節寫入Flash.
加入CRC校驗讓升級變的穩定可靠.
info.txt文件內容:

version:0.0.1 雲端固件程序版本
url:http://mnif.cn/ota/hardware/CH579Air724BK/user_crc.bin 固件程序下載地址
"info":"1.解決了部分BUG 2.優化了部分程序" 使用APP控制升級時,APP的提示信息.
升級過程:
注:使用TCP連接Web服務器,然后發送相應的GET指令獲取文件!
用戶程序里面每隔一定時間控制網絡模塊使用http的GET指令獲取雲端info.txt文件
然后從文件里面獲取服務器里面的固件程序版本和固件程序下載地址等信息
如果與自身版本號對比不一致,就把固件程序下載地址寫入flash,然后設置更新標志,重啟,
重啟執行BootLoader以后,BootLoader程序檢測到更新標志,則提取固件下載的地址,
然后使用http下載程序文件,把程序文件寫入flash,完成升級.
備份升級流程圖

提前說明
學習這節之前用戶務必已經親自測試學習了下面的章節
CH579不帶中斷地址偏移,是依靠最底層程序中斷函數轉過去的.

測試
1.GPRS模塊安裝好手機卡和天線
注意手機卡的缺角方向是朝里面


2.硬件連接(單片機使用串口0和模組通信,使用PB5復位模組; 串口1作為日志打印)

3.打開串口調試助手打印串口日志

4.一共有三個程序
base是負責轉中斷的程序(這個下載一次就可以)
BootLoader程序負責下載升級和跳轉執行用戶程序
UserApp是咱自己的用戶程序

5,使用ST-Link 進行下載

6.首先下載base程序

7.然后下載BootLoader程序


8.最后下載UserApp程序

9.觀察日志,說明執行流程
開始運行用戶程序,默認提供的用戶程序設置的程序版本是0.0.0

用戶程序控制模組連接服務器,使用get指令獲取獲取服務器上的固件信息文件 info.txt
檢測到版本不一致以后,把獲取的url存儲到flash,設置更新標志,重啟.
重啟之后BootLoader提取url

BootLoader發送get指令獲取程序固件

升級過程中會校驗數據

升級完成以后,運行新下載的程序.

用戶程序每隔一段時間控制模組連接服務器,使用get指令獲取獲取服務器上的固件信息文件 info.txt
現在程序版本和上面的是一致的,所以不需要更新

應用到自己的服務器
1,首先確定好程序文件在服務器的路徑
關於本人服務器文件夾解釋:(自己隨意就好,最后的文件夾命名建議使用產品的型號)
html:網站根目錄
ota: ota升級
hardware : 硬件程序
CH579Air724BK: 作為產品的型號(根據自己的產品型號修改)

我把固件放到了里面那么固件程序下載地址為:
http://服務器IP地址/ota/hardware/CH579Air724BK/user_crc.bin
那么固件信息的下載地址為:
http://服務器IP地址/ota/hardware/CH579Air724BK/info.txt
2.修改 用戶程序 的 IAP.C 文件
提示:我把它們存儲在程序bin文件的1024字節倍數的位置是為了BootLoader下載的時候便於提取這些數據;
1.產品型號(我設置的為CH579Air724BK)
2.修改固件程序版本(可隨意指定,我設置的為0.0.2)
3.修改記錄雲端固件信息文件下載地址(我的為:http://mnif.cn/ota/hardware/CH579Air724BK/info.txt)

5.修改BootLoader程序 的 IAP.c,設置下產品型號和默認的固件程序下載地址
注意:BootLoader里面的產品型號要和用戶里面的一樣!!!!
BootLoader程序下載的時候會判斷這個型號一不一致

6.編譯用戶程序
會在工程目錄的bin文件夾生成 user.bin文件


7.打開OTA Tools上位機軟件

8.按照紅框選擇配置

9.選擇用戶程序生成的 bin文件

10.點擊 生成固件

11.將在user.bin目錄生成user_crc.bin文件

user_crc.bin文件是在user.bin的基礎上增加了CRC校驗位

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

12.把生成的user_crc.bin文件拷貝到服務器

13.還差一個info.txt文件
我准備了一個模板

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

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

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

18.把info.txt文件也拷貝到服務器,然后按照一開始的步驟測試即可

小總結
遠程升級單片機程序其實就是使用模組以TCP方式連接Web服務器,
然后給TCP服務器發數據,數據格式是GET指令.
服務器接收到指令以后會下發文件給模組,模組通過串口把數據發給單片機,
單片機接收到數據以后寫到flash,最后加載運行.
關於Flash分配調整
因為單片機沒有設置中斷偏移的地方,所以調整flash分配呢有點繁瑣
大家伙以后可能會用到調整,所以我就詳細的說明一下過程
1.單片機的用戶應用程序Flash是從0地址開始的,總共250KB

2.現在是把初始地址的3K給了base程序使用

3.其余的空間分配可以看BootLoader或者用戶程序里的iap_interface頭文件
FLASH_MCU_BASE 3*1024 base程序用了3K,所以地址偏移3K
FLASH_MCU_SIZE 247 base程序用了3K,總共250K,所以還剩247K
FLASH_SECTOR_SIZE 512 Flash每次擦除的最小空間
FLASH_IAP_SIZE 30 給BootLoader分配了30K
FLASH_UPDATE_SIZE 2 更新的時候需要使用Flash記錄一些信息,分配了2K,這個最低是1K
FLASH_USERDATA_SIZE 2 用戶如果需要存儲自己的數據,可以根據自己需要存儲的數據量設置這個
設置好以上空間以后,運行區和備份區再平分其余的空間

3.咱們做項目的時候只要寫好了BootLoader就不會再大動了,所以一般寫完BootLoader以后,
看下BootLoader使用了多少空間,然后設置一下BootLoader空間
比如現在的BootLoader使用了14KB

4.假設我設置BootLoader占用20KB(預留些,防止以后添加程序), 首先呢在BootLoader程序里面

BootLoader是從第3K地址開始運行的,所以是 0xC00
BootLoader占用20KB所以是0x5000

5.然后下載base程序

6.然后編譯下載BootLoader程序

7.觀察打印的日志

7.修改base里面的用戶程序運行地址為0x5c00

8.配置UserApp用戶程序的iap_interface.h里面的flash分配內容,要和BootLoader里面的保持一樣

9.配置UserApp用戶程序運行地址和占用空間

9.然后先編譯下載base程序,然后下載BootLoader程序,最后下載UserApp程序



能運行用戶程序就說明配置的沒啥問題

10.注意
flash分配地址在產品投入使用之前就是設置好的,以后就不能動了哈.
大家伙一定要給BootLoader留夠足夠的空間哈.預防后期需要在BootLoader里面開發其它程序功能.
控制中斷偏移跳轉
1.我是使用了RAM的最后四字節數據存儲標記的
下載完base程序,中斷是跳轉到BootLoader里面的中斷里面


2,BootLoader里面為了預防被篡改,我又重新定義了下
保證在BootLoader里面運行的時候中斷都是跳轉到BootLoader里面的中斷函數

3,執行用戶程序的時候,我把標識改了下,這樣子base里面的中斷就會跳轉到用戶程序里面了

全新的遠程升級底層包
1.這次使用的遠程升級底層是最新優化的一版,優化的目的是便於移植各個單片機上面.

2. iap是控制着升級流程的文件
大家伙可以在里面設置基本的固件版本,升級地址啦等等


再深入些可以在BootLoader里面設置升級過程中需要如何去下載,設置多大的緩存區

3. iap_interface是接口文件
用戶在移植的時候需要根據自己的單片機實現內部的接口,只要完成里面的接口就完成了升級程序


4.提示
在后面的章節中會單獨拿出一節來寫移植到別的單片機的具體流程.
還是那句話: 代碼不僅是給別人看的,更是給別人用的.
代碼只有便於別人廣泛的去應用才是真正發揮它的價值.
用戶程序說明
1.解析下info.txt下載路徑(服務器上記錄固件信息的文件)
做這個程序是為省去用戶解析的繁瑣.



執行解析之后:
IAPStructValue.IP = mnif.cn;
IAPStructValue.Port = 80;
IAPStructValue.Path = /ota/hardware/CH579Air724BK/info.txt
4.處理更新(這個程序需要在認為用戶程序沒有問題的時候在用戶程序里面執行一下)
解釋:
BootLoader更新程序的時候會設置一些更新狀態;用戶程序需要調用一下這個函數清除更新狀態.
如果用戶程序不清除更新狀態,那么一旦程序重啟以后BootLoader檢查到更新狀態以后會自行回滾程序.

5.控制模組獲取服務器上記錄固件信息的文件



6.解析info.txt文件內容
如果版本號不一樣,提取和存儲url然后設置升級標志,重啟.

7,補充:如果編譯用戶程序出現下面的警告

其實是這個地方導致的

為了便於BootLoader程序提取用戶程序bin文件里面的型號,把型號存儲在了偏移1024字節的位置.
設置的這個字符串存儲的位置影響到了芯片本身默認分配一些數組的位置.就會報上面的警告.
貌似不影響什么...
BootLoader程序詳細說明
1.查看IAPInit函數

2.獲取存儲的固件下載的url,並解析下url

3.如果有更新標志,則備份下用戶程序

4.如果沒有更新標志,則查看下更新狀態
如果狀態是更新有錯誤,則執行回滾,如果檢測到沒有備份的程序,就重新執行升級

5.如果更新狀態是0x01,就設置更新狀態為0xFE

7.控制模組連接TCP服務器(Web服務器)




8.發送get指令獲取程序文件




8.在TCP接收數據函數里面把固件數據寫入緩存
單片機是通過串口和模組通信,所以在串口中斷里面接收
底層解析什么的都做好了,自動解析以后存儲到緩存里面


9.從緩存取數據,並寫入flash






11,如果接收到相應的文件個數或者超過一段時間沒有接收到數據
設置 IAPStructValue.ReadDataEndFlag = 1;認為接收完成

12,判斷接收完成之后做各種判斷
如果確實接收完了,則寫入0x01狀態,重啟.
如果有錯誤,則嘗試重新下載.


13,如果是程序文件下載完成以后重啟,重啟以后檢查到更新狀態是0x01會設置更新狀態為0XFE


14,然后加載運行用戶程序



15,超過一段時間沒有接收到數據,是在這里做的判斷


16,客戶可以在IAP.h修改默認的超時時間
整體運行超時是BootLoader一運行就一直累加的的定時,超過時間就會控制程序重啟




細節說明


