單片機的程序升級其實本質就是對單片機的片上Flash進行擦寫,將新的程序寫入到運行的Flash位置。做了2G模塊的IAP程序升級和基於串口上位機的IAP程序升級。寫下一點自己的淺見。
概況:
-
軟件上:
具備遠程升級的單片機的程序整體具體包含兩個部分,一部分是(APP)應用程序,另一部分是(BOOT)引導程序。
APP程序 就是我們需要進行更新的程序,程序包括的內容:應用相關的程序(業務相關),接受並解析升級數據包的程序,存儲數據包的程序。
BOOT程序 就是負責對已經存儲好的升級數據包文件寫入APP程序所在的Flash;並跳轉到APP程序;
這兩部分的程序是相互獨立的運行的,擁有相互跳轉的能力,相互升級對方的能力。上電一般先運行BOOT程序,然後跳轉到APP程序執行。BOOT程序一般很小,APP程序比較大。 -
硬件上:
單Flash塊的單片機:Flash存儲位置上BOOT程序從默認啓動Flash地址 0x0000000 開始開始存儲 ,APP程序從BOOT 程序後的指定Flash頁的基地址開始(Flash擦除寫入以頁(page)爲單位)。
多個Flash塊的單片機:單片機有相應的Flash區分(例如LDROM,APROM等),一般將兩個程序存儲與不同的區塊,查看手冊配置好,啓動flash即可。
如下圖所示:
1. BOOT程序結構:
- 單塊Flash的BOOT程序結構簡單(單片機爲新唐的M4系列,使用復位跳轉方式。也可以使用非重啓方式跳轉:重映射向量表之後,棧指針也要修改到APP_ADDR,(APP_ADDR + 4) 復位中斷處理函數爲程序入口),如下:
//只是示意步驟,並非真正程序,隱去細節
int32_t main(void)
{
SYS_Init(); //系統以及外設初始化
SYS_UnlockReg(); //解鎖系統寄存器的寫保護
FMC_Open(); //開啓Flash擦寫
set_IAP_boot_mode(); //進入IAP模式
if(CheckUpdateFlag()) //檢查是否需要升級APP程序
{
if(DataCheck()) //檢驗待寫入的APP數據的完整性
{
FMC_ENABLE_AP_UPDATE(); //開啓程序區的Falsh寫入
load_image_to_flash(); //寫入新的APP程序
WriteUpdateFlag(Update_Success); //更新升級標誌位至升級完成
FMC_DISABLE_AP_UPDATE(); //關閉程序區的Falsh寫入
}
else
{
WriteUpdateFlag(Update_Failed); //更新升級標誌位至升級完成
}
}
NVIC->ICER[0] = 0xFFFFFFFF; //關閉所有中斷
FMC_SetVectorPageAddr(APP_ADDR); //重定向APP程序執行向量,頁對齊
NVIC_SystemReset(); //重啓跳轉至APP程序,或者使用程序跳轉
}
- 多塊Flash的情況:只是將跳轉的方式的操作有所區別,基本一致。
2. APP程序結構:
APP程序的程序升級流程就把從數據源獲取的數據(不管是網絡傳輸過來的數據,還是通過串口傳輸的數據),按照約定的格式解析出APP的二進制數據包和程序的校驗值存儲起來,在接收完畢數據之後把升級的標誌位置爲需要升級,然後執行跳轉到BOOT程序,進行升級。新的APP程序,檢查升級是否完成的,上報或者回復相應信息。
至此升級流程就全部完成。這裏只講流程,由於傳輸的方式和傳輸協議等的差異,具體的實現方式很多。
3. Flash寫入相關:
一般升級文件爲單片機工程編譯生成的BIN文件,傳輸量最小。Hex文件大小至少是BIN文件的2倍。
例如如上圖所示,數據存儲於片上Flash的另一區域,那麼一般這塊數據的第一頁都是用來存放數據包的信息,校驗值,升級標誌位等升級相關的數據。升級文件的Flash寫入就是將BIN文件原封不動的從Flash指定地址(例如APP_ADDR)開始寫入,不足一頁的用0xFF填充剩下的字節寫入。
題外話:現在單片機的功能越來越強大,主頻也越來越高,像Coretex-M7的已經達到了500MHz。相應的應用也是越來越豐富,互聯網思維(敏捷開發)的全行業推進,做一款產品先做一個demo先上線,然後根據實際情況慢慢的完善。這時候程序的升級就變得非常的重要了,你要是聯網的的設備遠程升級那就更加的方便了。IAP升級也適用於功能出了問題進行緊急維護。