<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/alyota.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
前言
這節說明一下如何使用阿里雲物聯網平台的OTA遠程升級STM32程序
用戶必須已經學習完了基本控制篇里面的阿里雲物聯網平台教程!
阿里雲物聯網平台是通過MQTT獲取升級固件的版本,固件大小和下載地址信息.
升級概述
1,實現升級是使用的基礎通信里面的Topic
阿里雲介紹文檔:
https://help.aliyun.com/document_detail/89307.html?spm=a2c4g.11186623.6.712.2409429dNoQXsh
/ota/device/inform/a1m7er1nJbQ/${deviceName}
設備通過這個主題上報設備的固件版本號,要求設備在連接上服務器以后第一時間上報.
格式: {"id":"0000","params":{"version": "0.0.1"}}
/ota/device/upgrade/a1m7er1nJbQ/${deviceName}
設備需要訂閱這個主題,服務器會通過這個主題下發固件信息
一般在上傳新固件以后,在平台上操作以后,平台才會主動下發.
size是固件大小; version是服務器固件版本; url是固件下載地址
{ "code": "1000", "data": { "size": 432945, "version": "2.0.0", "isDiff": 1, "url": "https://iotx-ota-pre.oss-cn-shanghai.aliyuncs.com/nopoll_0.4.4.tar.gz?Expires=1502955804&OSSAccessKeyId=XXXXXXXXXXXXXXXXXXXX&Signature=XfgJu7P6DWWejstKJgXJEH0qAKU%3D&security-token=CAISuQJ1q6Ft5B2yfSjIpK6MGsyN1Jx5jo6mVnfBglIPTvlvt5D50Tz2IHtIf3NpAusdsv03nWxT7v4flqFyTINVAEvYZJOPKGrGR0DzDbDasumZsJbo4f%2FMQBqEaXPS2MvVfJ%2BzLrf0ceusbFbpjzJ6xaCAGxypQ12iN%2B%2Fr6%2F5gdc9FcQSkL0B8ZrFsKxBltdUROFbIKP%2BpKWSKuGfLC1dysQcO1wEP4K%2BkkMqH8Uic3h%2Boy%2BgJt8H2PpHhd9NhXuV2WMzn2%2FdtJOiTknxR7ARasaBqhelc4zqA%2FPPlWgAKvkXba7aIoo01fV4jN5JXQfAU8KLO8tRjofHWmojNzBJAAPpYSSy3Rvr7m5efQrrybY1lLO6iZy%2BVio2VSZDxshI5Z3McKARWct06MWV9ABA2TTXXOi40BOxuq%2B3JGoABXC54TOlo7%2F1wTLTsCUqzzeIiXVOK8CfNOkfTucMGHkeYeCdFkm%2FkADhXAnrnGf5a4FbmKMQph2cKsr8y8UfWLC6IzvJsClXTnbJBMeuWIqo5zIynS1pm7gf%2F9N3hVc6%2BEeIk0xfl2tycsUpbL2FoaGk6BAF8hWSWYUXsv59d5Uk%3D", "md5": "93230c3bde425a9d7984a594ac55ea1e", "sign": "93230c3bde425a9d7984a594ac55****", "signMethod": "Md5", "module": "MCU" }, "id": "1507707025", "message": "success" }
/ota/device/progress/a1m7er1nJbQ/${deviceName}
上報更新進度
/ota/device/request/a1m7er1nJbQ/${deviceName}
主動請求雲端固件信息
開始測試
1.打開本節的BootLoader程序 和 用戶程序
2.修改用戶程序 根據自己在平台注冊的設備信息修改
3.使用下載器分別下載BootLoader程序 和 用戶程序到開發板(順序不能顛倒)
4.如果沒有下載器
請用戶參考遠程升級的第一節組合hex文件以后下載到開發板.
5.正常運行
上報的版本是 0.0.0
把升級包上傳到服務器
1.修改用戶程序里面的固件版本
注:這個隨意,我修改的是0.0.2,不過在后面需要這個版本號,記着自己的版本號哈
2.編譯下工程
3.會在工程目錄的bin文件夾生成bin文件
4.打開OTA Tools.exe軟件生成帶有CRC校驗的固件
5.點擊生成固件以后會在原先的目錄生成user_crc.bin文件
user_crc.bin文件是在user.bin的基礎上增加了CRC校驗位
在物聯網平台上新增固件
1.設備運維 - 固件升級
2.選擇添加模塊(使用默認的好像不能主動查詢到固件信息)
升級包名稱:隨意寫, 所屬產品:選擇您當前設備所屬的產品
3.模塊名稱填寫1,這個是和單片機程序對應的
這個模塊具體啥作用還沒看出來!!!
4.選擇咱剛才添加的升級包模塊,版本號填寫剛才用戶程序設置的版本號
5.上傳固件
6.先不選擇驗證
驗證的話需要先讓其中一個設備遠程升級驗證下.有個繁瑣的過程
不過實際產品應用盡量選擇驗證!
這個驗證呢后面會說,咱先快速的使用起來.
開始控制設備升級了
1.點擊批量升級
2.選擇動態升級
3.下面這些選項,按照自己的需求更改
最后選擇覆蓋原先的升級任務,就是可以保持設備更新最新的程序
4.觀察下串口日志
服務器推送給了咱設備固件信息
5.BootLoader升級完成,運行下載的用戶程序
6.用戶程序每隔一段時間獲取下服務器上的固件信息
假設咱更新了程序
1.修改版本號
2.編譯下工程
3.打開OTA Tools.exe軟件生成帶有CRC校驗的固件
4.添加升級包
5.下面的步驟我就不多說了
假設需要驗證
1.改個新版本的程序上傳上去
2.點擊驗證
現在批量升級不可以點擊,必須先驗證下固件
這個是咱先前設備更新完成以后上報的版本號
3.選擇可以用來測試的設備
4.可以看到設備開始升級
升級成功上報版本
5.然后按照前面的操作下批量升級就可以了.
單片機程序說明(這篇文章有點長!!!)
2.小總結
遠程升級單片機程序其實就是使用模組以TCP方式連接Web服務器,
然后給TCP服務器發數據,數據格式是GET指令.
服務器接收到指令以后會下發文件給模組,模組通過串口把數據發給單片機,
單片機接收到數據以后寫到flash,最后加載運行.
不過這個Web服務器文件的下載地址是通過阿里雲的MQTT獲取到的.
3.Flash分配
用戶可以根據自己的需求調整stmflash.h文件Flash分配大小
注意:BootLoader程序和用戶程序的stmflash.h文件要保證一樣.
注意:如果使用的芯片的Flash容量是 256及其以上的型號
假設使用的是 256的
因為容量是256的,所以flash是以2K為一頁.
首先FLASH_IAP_SIZE, FLASH_UPDATE_SIZE, FLASH_USERDATA_SIZE 保證是2的倍數
為保證程序運行區和程序備份區的地址是某一頁的開始地址
所以 LASH_IAP_SIZE + FLASH_UPDATE_SIZE + FLASH_USERDATA_SIZE 的和需要是4的倍數
用戶程序詳細說明
1.設置中斷向量偏移
地址其實就是用戶程序運行地址
2.軟件設置程序運行位置和占用flash大小
注:日志會打印這些信息,根據日志打印的設置即可
4.處理更新(這個程序需要在認為用戶程序沒有問題的時候在用戶程序里面執行一下)
如果更新成功,BootLoader里面會把更新狀態置為 0xFF;用戶程序需要調用一下這個函數清零這個狀態.
如果用戶程序不清零這個狀態,重啟以后BootLoader檢查到0xFF會認為執行用戶程序失敗了.然后執行回滾.
如果本身BootLoader下載程序過程中就檢查到下載的程序文件有問題,BootLoader把更新狀態設置為對應的錯誤
然后執行回滾.用戶程序需要調用一下這個函數清零狀態,如果用戶程序不清零這個狀態,
重啟以后BootLoader檢查狀態是錯誤,就會再次執行回滾
5.控制模組連接MQTT服務器
6.在MQTT連接成功回調函數中發送消息和訂閱相關OTA的主題
7.在MQTT接收數據回調函數中解析數據
如果接收到更新文件信息,判斷版本,解析url,解析固件大小,把url和固件大小存儲到flash, 重啟
BootLoader程序詳細說明
1.查看IAPInit函數
2.獲取存儲的固件文件大小,固件下載的url,並解析下url
3.如果有更新標志,則備份下用戶程序
4.如果沒有更新標志,則查看下更新狀態
如果狀態是更新有錯誤,則執行回滾,如果檢測到沒有備份的程序,就重新執行升級
5.如果更新狀態是0x01,就設置更新狀態為0xFF
7.控制模組連接TCP服務器(Web服務器)
8.發送get指令獲取程序文件
8.在串口中斷函數里面把固件數據寫入緩存
注: IAPHttpHead是為了去掉http 頭,找到數據的開始位置
9.主循環從緩存取數據,並寫入flash
10.校驗數據的時候是把先前寫入的提取出來校驗
11.如果緩存里面沒有數據,如果接收到相應的文件個數或者超過一段時間沒有接收到數據
設置 IAPStructValue.ReadDataEndFlag = 1;則認為接收完成
然后做各種判斷,
如果確實接收完了,則寫入0x01狀態,重啟.
如果有錯誤,則嘗試重新下載.
超過一段時間沒有接收到數據,是在這里做的判斷
12,程序里面有下載超時和整體運行超時檢測
下載超時:只有在確認開始寫入程序文件的時候才運行,每次寫入程序文件會清零.
主要解決接收一半程序便不再接收的問題
整體運行超時:該超時只要執行BootLoader程序便一直運行
客戶可以在IAP.h修改默認的超時時間
12.重啟以后如果檢測到狀態是0x01則寫入0xFF,執行用戶程序
如果檢測狀態是更新錯誤,則回滾程序,執行用戶程序.
細節說明
1.如果編譯用戶程序出現下面的警告
其實是這個地方導致的
為了便於BootLoader程序提取用戶程序bin文件里面的型號,把型號存儲在了偏移1024字節的位置.
設置的這個字符串存儲的位置影響到了芯片本身分配一些數組的位置.就會報上面的錯誤
用戶可以把后面的16改為17或者其他大些的數值,直至不出現警告即可.
2.在前面的文章中說過一個事情:
凡是在BootLoader里面使用中斷,跳轉到用戶程序以后同樣有效
BootLoader里面使用了,滴答定時器中斷; 串口1,2接收中斷,空閑中斷; 看門狗.
在加載用戶程序之前清除了除了看門狗以外的所有中斷.
如果用戶在BootLoader里面使用了其它中斷,也需要在此處清除!!
如果用戶在BootLoader里面使用了其它中斷,也需要在此處清除!!
如果用戶在BootLoader里面使用了其它中斷,也需要在此處清除!!
4.用戶按照自己的項目修改BootLoader程序注意事項
1.在發送完獲取程序文件指令以后,主循環不能帶有執行超過5ms的延時函數
延時函數的存在會影響提取緩存數據寫入flash的時間,從而導致緩存溢出,數據接收不完整.
2.如果用戶想在BootLoader運行的時候顯示更新狀態或者進度
可以在IAPInit() ;IAPGetProgramFile(); IAPWriteData();函數里面相應的位置增加提示
注意:IAPWriteData()函數里面不能加延時!!!!
3.如果要展示更新進度
文件大小(字節): IAPStructValue.FileSizeSave
當前接收(字節): IAPStructValue.FileSizeNow