OTA升級(jí)已經(jīng)不是什么新鮮事,現(xiàn)在大多數(shù)物聯(lián)網(wǎng)終端設(shè)備,基本具備這個(gè)功能。
今天以 AT32 為例給大家分享一下 OTA 升級(jí)的詳細(xì)流程。
概述
空中下載技術(shù) OTA(Over-the-Air Technology)是用戶自己的程序在運(yùn)行過(guò)程中對(duì) User Flash 的部分區(qū)域進(jìn)行燒寫,目的是為了在產(chǎn)品發(fā)布后可以方便地通過(guò)預(yù)留的通信口,對(duì)產(chǎn)品中的固件程序進(jìn)行更新升級(jí)。
通常實(shí)現(xiàn) OTA 功能時(shí),即用戶程序運(yùn)行中作自身的更新操作,需要在設(shè)計(jì)固件程序時(shí)編寫兩個(gè)項(xiàng)目代碼,第一個(gè)項(xiàng)目程序?yàn)?Bootloader 區(qū)域,第二個(gè)項(xiàng)目程序 App 代碼為真正的功能代碼,執(zhí)行應(yīng)用和升級(jí)。這兩部分項(xiàng)目代碼同時(shí)燒錄在 User Flash 中。
圖1. OTA代碼執(zhí)行流程
在上圖所示流程中,MCU復(fù)位后,從 0x08000004 地址取出復(fù)位中斷向量的地址,并跳轉(zhuǎn)到復(fù)位中斷服務(wù)程序,在運(yùn)行完復(fù)位中斷服務(wù)程序之后跳轉(zhuǎn)到 Bootloader 的 main函數(shù),如圖標(biāo)號(hào)①所示;
在執(zhí)行完 Bootloader 以后(App 代碼為圖中 FLASH 灰底部分 App 程序的復(fù)位中斷向量起始地址為 0x08000004+N+M),跳轉(zhuǎn)至 App 程序的復(fù)位向量表,取出 App 程序的復(fù)位中斷向量的地址,并跳轉(zhuǎn)執(zhí)行 App 程序的復(fù)位中斷服務(wù)程序,隨后跳轉(zhuǎn)至 App 程序的main函數(shù),如圖標(biāo)號(hào)②和③所示,同樣 main 函數(shù)為一個(gè)死循環(huán),并且注意到此時(shí) AT32 的 FLASH,在不同位置上,共有兩個(gè)中斷向量表。
在 main 函數(shù)執(zhí)行過(guò)程中,如果 CPU 得到一個(gè)中斷請(qǐng)求,PC 指針仍強(qiáng)制跳轉(zhuǎn)到地址0x08000004 中斷向量表處,而不是 App 程序的中斷向量表,如圖標(biāo)號(hào)④所示;
程序再根據(jù)我們?cè)O(shè)置的中斷向量表偏移量,跳轉(zhuǎn)到對(duì)應(yīng)中斷源的中斷服務(wù)程序中,如圖標(biāo)號(hào)⑤所示;
在執(zhí)行完中斷服務(wù)程序后,程序返回 main 函數(shù)繼續(xù)運(yùn)行,如圖標(biāo)號(hào)⑥所示。
通過(guò)以上兩個(gè)過(guò)程的分析,我們知道OTA程序必須滿足兩個(gè)要求:
App 程序必須在 Bootloader 程序之后的某個(gè)偏移量為 x 的地址開始。
必須將 App 程序的中斷向量表進(jìn)行相應(yīng)的移動(dòng),移動(dòng)的偏移量為 x。
AT32 USART OTA 快速使用方法
硬件資源
文檔中是用 AT-START-AT32F403A 實(shí)驗(yàn)板的硬件條件為例,OTA demo 源代碼還包括AT32 其他型號(hào),用戶只需編譯對(duì)應(yīng)型號(hào)工程燒錄于 AT-START 實(shí)驗(yàn)板運(yùn)行即可。
指示燈 LED2/LED3/LED4
USART1(PA9/PA10)
AT-START 實(shí)驗(yàn)板
軟件資源
tool_release
IAP_Programmer.exe,PC 機(jī) tool,用于演示 OTA 升級(jí)流程
source_code
Bootloader,Bootloader 源程序,運(yùn)行 LED2 閃爍
App_led3_toggle,App1 源程序,運(yùn)行 LED3 閃爍
App_led4_toggle,App2 源程序,運(yùn)行 LED4 閃爍
注:工程基于keil v5建立,若用戶需要在其他編譯環(huán)境上使用,請(qǐng)參考對(duì)應(yīng) BSP 目錄AT32F403A_407_Firmware_Library_V2.x.xprojectat_start_f403a emplates中各種編譯環(huán)境(例如IAR6/7/8,keil 4/5,eclipse_gcc)進(jìn)行對(duì)應(yīng)修改即可。
OTA Demo 使用
本文檔描述了兩種常用的 OTA 應(yīng)用 demo,template app 和 dual app,后面章節(jié)會(huì)分別介紹。
打開 Bootloader 工程源程序,選擇對(duì)應(yīng) MCU 型號(hào)的 target 編譯后下載到實(shí)驗(yàn)板
打開 IAP_Programmer.exe
選擇正確的串口、APP下載地址和 bin 文檔,點(diǎn)擊 Download 下載,如下圖
觀察 LED2/3/4 閃爍,LED2 閃爍-Bootloader 工作,LED3 閃爍-App1 工作,LED4 閃爍-App2 工作
圖2. IAP demo上位機(jī)
Template app OTA 程序設(shè)置
地址分布
圖3. Flash地址分配
注:Bootloader區(qū)域最后一個(gè)扇區(qū),用于存放防止升級(jí)過(guò)程出錯(cuò)(掉電等異常情況)的flag,用戶編譯修改Bootloader時(shí),要保證不覆蓋flag的地址。
執(zhí)行流程
OTA 分為 Bootloader、App 和 Template 三部分,應(yīng)用在 App 中執(zhí)行,Template 僅作為新 App 固件數(shù)據(jù)的臨時(shí)存放空間。程序執(zhí)行整體流程框圖如下:
圖4. 程序執(zhí)行流程
Bootloader project 設(shè)置
1)Keil 設(shè)置
圖5. Bootloader project中address 1在Keil設(shè)置
2) Bootloader 源程序修改 ota.h 文件中
圖6. Bootloader project中address 2在程序中設(shè)置
App project 設(shè)置
OTA demo 提供了 2 個(gè) App 程序供測(cè)試用,皆以 address 2(0x800 4000)為起始地址。App1 LED3 閃爍,App2 LED4 閃爍。以 App1 為例,設(shè)計(jì)步驟如下:
1) Keil工程設(shè)置
圖7. App project中address 2在Keil設(shè)置
2) App1 源程序設(shè)置
圖8. App project向量表偏移在程序中設(shè)置
3) 編譯生成bin文件
通過(guò) User 選項(xiàng)卡,設(shè)置編譯后調(diào)用 fromelf.exe,根據(jù) .axf 文件生成 .bin 文件,用于 OTA 更新。通過(guò)以上3個(gè)步驟,我們就可以得到一個(gè) .bin 的 APP 程序,通過(guò) Bootloader 程序即可實(shí)現(xiàn)更新。
4) 開啟debug app code功能
如果在設(shè)計(jì) App code 過(guò)程中需要對(duì) App project 進(jìn)行單獨(dú)調(diào)試,請(qǐng)按照以下操作。
先下載 Bootloader 工程
再調(diào)試 App 工程
Dual app OTA 與程序設(shè)置
地址分布
圖9. Flash地址分配
注:Bootloader 區(qū)域最后2個(gè)扇區(qū),用于存放 App 是否正常的 flag,用戶編譯修改Bootloader 時(shí),要保證不覆蓋 flag 的地址。
執(zhí)行流程
OTA 分為 Bootloader、App1 和 App2 三部分,應(yīng)用在 App1 或 App2 中執(zhí)行。程序執(zhí)行整體流程框圖如下:
圖10. 程序執(zhí)行流程
Bootloader project 設(shè)置
1)Keil 設(shè)置
圖11. Bootloader project中address 1在Keil設(shè)置
2)Bootloader 源程序修改 ota.h 文件中
圖12. Bootloader project中address 2在程序中設(shè)置
App project 設(shè)置
OTA demo 提供了 2 個(gè) App 程序供測(cè)試用,app_led3_toggle 以 0x800 4000 為起始地址,app_led4_toggle 以 0x8080000 為起始地址。App1 LED3 閃爍,App2 LED4閃爍。以 App1 為例,設(shè)計(jì)步驟如下:
1) Keil工程設(shè)置
圖13. App project中address 2在Keil設(shè)置
2) App1源程序設(shè)置
圖14. App project向量表偏移在程序中設(shè)置
3) 編譯生成bin文件
通過(guò)User選項(xiàng)卡,設(shè)置編譯后調(diào)用fromelf.exe,根據(jù).axf文件生成.bin文件,用于OTA更新。通過(guò)以上3個(gè)步驟,我們就可以得到一個(gè).bin的APP程序,通過(guò)Bootloader程序即可實(shí)現(xiàn)更新。
4) 開啟debug App code功能
如果在設(shè)計(jì)App code過(guò)程中需要對(duì)App project進(jìn)行單獨(dú)調(diào)試,請(qǐng)按照以下操作。
先下載Bootloader工程
再調(diào)試App工程
Bootloader/App與上位機(jī)串口通信協(xié)議
程序與上位機(jī)通信,接收固件升級(jí)數(shù)據(jù),上位機(jī)端和嵌入式端通信協(xié)議如下:
1) 上位機(jī)通信協(xié)議
圖15. 上位機(jī)通信協(xié)議
2) 嵌入式端下位機(jī)通信協(xié)議
圖16. 下位機(jī)通信協(xié)議
注:
ACK:0xCCDD
NACK:0xEEFF
Data:0x31+Addr+數(shù)據(jù)+chenksum(1byte)
Addr:4bytes,高位在前
2Kbytes,下載數(shù)據(jù),不足2K內(nèi)容填充0xFF
Checksum:1byte,4bytes的Addr+2KBytes數(shù)據(jù)的校驗(yàn)和的低八位
審核編輯:湯梓紅
-
程序
+關(guān)注
關(guān)注
117文章
3826瀏覽量
82985 -
uart
+關(guān)注
關(guān)注
22文章
1276瀏覽量
103958 -
OTA
+關(guān)注
關(guān)注
7文章
612瀏覽量
36581 -
bootloader
+關(guān)注
關(guān)注
2文章
239瀏覽量
46698 -
AT32
+關(guān)注
關(guān)注
1文章
121瀏覽量
2707
原文標(biāo)題:?jiǎn)纹瑱C(jī)通過(guò) UART 實(shí)現(xiàn) OTA 升級(jí)的詳細(xì)流程
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
AT32 IAP using the USART
AN0005—AT32 OTA 空中下載升級(jí)
在AT32系列MCU上Flash模擬EEPRO的應(yīng)用原理和使用方法
Micropython Based On AT32 RTT
在AT32微控制器上創(chuàng)建OTA應(yīng)用程序的一般準(zhǔn)則
AT32 MCU USB主機(jī)庫(kù)應(yīng)用說(shuō)明
AT32 MCU USB設(shè)備庫(kù)應(yīng)用說(shuō)明
AT32 MCU USART應(yīng)用說(shuō)明
AN0001 AT32 IAP 使用 USART

如何使用AT32 MCU主機(jī)庫(kù)快速開發(fā)USB相關(guān)應(yīng)用

雅特力AT32 MCU USB設(shè)備庫(kù)的架構(gòu)和使用方法
AT32 MCU如何使用OTA通過(guò)USART實(shí)現(xiàn)對(duì)固件的在線升級(jí)更新

AT32 MCU如何使用IAP通過(guò)USART實(shí)現(xiàn)對(duì)固件的在線升級(jí)更新

評(píng)論