1. 程式人生 > 其它 >華大微控制器HC32L110遠端升級

華大微控制器HC32L110遠端升級

通常實現IAP功能時,需要在設計韌體程式時編寫兩個專案程式碼,第一個專案程式即BOOT程式不執行正常的功能操作,而只是通過某種通訊方式(如USB、USART)接收程式或資料,執行對第二部分程式碼的更新;第二個專案程式即APP程式使用者真正的功能程式碼。這兩部分專案程式碼同時燒錄在Flash中,當晶片上電後,首先是第一個專案程式BOOT開始執行,它主要實現如下功能:
1)檢查是否需要對第二部APP程式程式碼進行更新
2)如果不需要更新則轉到4)
3)執行更新操作
4)跳轉到第二部分程式碼執行
     第一部分BOOT程式碼可以通過SWD或者離線程式設計器下載到晶片Flash內部,第二部分APP和第一部分BOOT一起燒入晶片內部,以後需要程式更新再通過第一把BOOT程式碼更新。根據晶片系列的Flash存放不同地址範圍,從最低地址區域開始存放BOOT,緊跟其後的就是APP程式,本篇筆記受限於晶片內部Flash容量,只是存放一個APP程式。即在晶片內部有兩個程式即BOOT和APP程式。
IAP功能具體實現
      晶片程式一般從Flash地址0x0000_0000開始執行,基於Cortex-M0+核心特性,內部通過中斷向量表來響應中斷,程式從中斷向量表取出復位中斷向量執行中斷程式,當中斷產生,晶片內部PC指標定位到中斷向量表來取出對應的中斷服務程式執行。如果沒有中斷產生,在晶片執行完復位中斷服務程式後,跳轉到main函式順序執行死迴圈。如果有中斷產生,通過中斷向量表執行對應的中斷服務程式。
      當加入IAP後,晶片還是從中斷向量表取出復位中斷向量執行中斷程式,如果沒有中斷產生,在晶片執行完復位中斷服務程式後,跳轉到main函式。在執行完IAP後,新程式的復位中斷向量地址為0x0000_0004 + BOOT程式大小,跳轉到APP程式的復位向量表,執行APP的復位中斷服務程式,隨後跳轉到APP程式的main函式執行。
其中:BOOT程式大小3.5KB
      Para 區域存放IAP升級期間引數和標誌佔用0.5KB
      APP程式大小為24KB 
  Demo程式,操作流程如下:   
先將APP工程HEX下載到晶片內部
開啟BOOT工程HEX下載到晶片,或者可以使用工具將兩個HEX檔案合併在一起下載到晶片內部。
使用上位機演示程式,開啟串列埠波特率固定為9600。按照協議將APP工程的bin檔案下載到0x1000開始的晶片內部,其中要求APP的bin檔案小於28KB。
參考樣例及驅動
通過上述介紹,使用演示Demo程式IAP需要特定協議。
通訊協議格式如下:
///*frame:68  A0  A1  C  Page   L0  L1  D0... DN-1   CRC0  CRC1   16*///
///*offset :0    1    2    3      4       5    6    7      8+N     9+N   10+N   11 +N*///
頭字元:    固定字元為0x68 一個位元組
地址:       A0 A1 兩個位元組  
控制碼C: 讀地址為0x15    寫地址為0x25
頁地址page: 一個位元組 代表現在要操作的那個頁
長度L0 L1:  兩個位元組 L0代表高位元組,L1代表低位元組,此處長度僅代表資料區域長度
資料域D0…DN-1 : 代表讀出或者寫入的資料
資料校驗CRC: 採用CRC-16方式,代表資料域資料的校驗。
結束符號:固定字元為0x16 一個位元組
讀指令如下:
68   A0   A1   15   Page   0x00   0x00   CRC0   CRC1 16  
正確回覆:68 A0 A1   95   Page   0x04   0x00   D0 ………… D1023   CRC0 CRC1 16
錯誤回覆   68 A0  A1  D5   Page   0x00   0x00  CRC0  CRC1 16
Page 選擇(0 -- 27)
每次讀取1K位元組資料
寫指令如下:
68   A0   A1   25   Page   04   00   D0 ………… D1023   CRC0   CRC1 16  
正確回覆:68 A0   A1   A5   Page   04   00   CRC0 CRC1 16
錯誤回覆   68 A0   A1   E5   Page   00   00    CRC0  CRC1 16
Page 選擇(0 -- 27)
每次寫1K位元組資料
開始IAP升級指令
68   A0   A1   36   00   00    00    00   00   16  
正確回覆  68  A0   A1    B6   00    00  00  00    00   16
錯誤回覆  68  A0   A1    F6    00   00  00  00    00   16
結束IAP升級指令
68   A0   A1   49   00   00   00   00    00   16  
正確回覆  68  A0   A1   C9   00     00  00  00    00   16
錯誤回覆  68  A0   A1   09   00     00  00  00    00   16
傳送資料幀如果傳送結束到接收小於2s,如果超過說明IAP升級通訊錯誤。
以下部分簡要介紹IAP實現關鍵程式碼:
1)BOOT實現跳轉到APP程式碼:
if(((*(__IO uint32_t*)appxaddr)&0x2FFE0000)==0x20000000) //檢查棧頂地址是否合法
{
  jump2app=(iapfun)*(__IO uint32_t*)(appxaddr+4);  //APP程式復位地址
  MSR_MSP(*(__IO uint32_t*)appxaddr);              //初始化APP堆疊指標
  jump2app();                                      //跳轉到APP程式
}  
2)APP程式中斷向量偏移:
   new_vect_table  EQU     0x00001000         ;中斷向量偏移長度
; reset Vector table address.
   LDR     R0, =0xE000ED08
   LDR     R2, =new_vect_table
   STR     R2, [R0]       ;向量表重定義點選並拖拽以移動
總結
      以上章節簡要介紹了HC32L110系列的IAP控制模組基本功能,詳細說明了該模組的各個功能及操作步驟,使用者在實際的應用開發過程中,如果需要更深一步瞭解該模組的使用方法及操作事項,應以HC32L110的使用者手冊為準。本章中提到的樣例既可以作為使用者進一步的實驗與學習,也可以在實際開發中直接應用。