深入談談IAP公升級 2013 03 25

2021-07-27 08:01:36 字數 2217 閱讀 7115

最近做過51_iap和arm_iap公升級,感覺到他們的相同點和不同點,特記錄如下:

共同點:

做好iap的關鍵都是中斷向量的對映(remap)問題

一般都分為bootloader區和使用者區

不同點:

微控制器的中斷向量位置是固定的,位於0x0000的底部。

arm的中斷向量也一般是在0x0000的底部,但有的arm可以中斷向量的對映機制,可以將ram或其他位址的flash對映到0x0000底部

微控制器沒有中斷向量管理機制。一般0x0000-0x0002是乙個3個位元組的ljmp指令(該指令跳轉到使用者程式,注意不一定是main函式,可能是包括一些堆疊,暫存器初始化的彙編的初始化部分,然後跳轉到main函式),後面是各種具體中斷的跳轉函式的入口位址,例如串列埠,i2c等等。

arm有中斷管理機制。(cortex-m3核心又不一樣)

在arm體系中,異常中斷向量表的大小為32位元組,其中每個異常中斷佔據4個位元組大小,保留了4個位元組空間

0x00 復位

0x04 未定義的指令

0x08 軟體中斷

0x0c 指令預取終止

0x10 資料訪問終止

0x14 保留 未使用

0x18 irq模式 這個就是我們常用各種中斷(串列埠,i2c等)的乙個總中斷入口,後面再根據中斷其他暫存器進行判斷處理

0x1c fiq模式

中斷向量從0x0000000--0x00000001c共4*8=32個位元組,還應包括後面到0x00000040之前的**都應該對映,因為後面包括具體跳轉的位址。(所以要對映從0x0000000----0x000003f共64個位元組,自己看彙編覺得)

值得注意:

1.mc51設定r0_base, 只表示使用者**的存放區,r0_base這個位址並不存放中斷向量表,也不是main的入口位址

2.arm設定r0_base, r0_base開始處就是中斷向量表

mc51設定ro_base位置在於bl51 locate--》code range

arm設定ro_base位置在於target-->irom

做過公升級的例子:

(1)c8051f02*將使用者的中斷向量複製到0x0003之後,同時0x000-0x0002保留bootloader跳轉位址,另外找個地方儲存使用者跳轉位址,用於從bootloader區跳轉到使用者區。值得注意:bootloader區由於其他中斷向量表被使用者中斷向量表占用,bootloader**中不能出現中斷函式。

(2) str912 內部有bank0,bank1的對映功能,即可將bank0對映到0x0000,亦可將bank1對映到0x0000,這樣就可以將乙個bank作為bootloader ,另乙個作為使用者程式

(3) 2410 中斷向量表位於底部,沒有重對映機制。採用將中斷向量二次對映的方法,將中斷向量對映到指定的ram區,然後在ram寫入使用者的中斷向量表。

(4) adu7020 中斷向量表位於底部,有重新對映機制,remap暫存器,可以將中斷向量對映到flash或ram選擇,可以將使用者的中斷向量拷貝到ram區,然後選擇將中斷向量對映到ram,然後跳轉

(5) stm32 支援中斷向量表對映。cortex-m3核有專門的向量偏移暫存器,該暫存器決定:

1. 向量表是位於flash還是ram,向量表的基址

2. 向量表的偏移量

注:乙個優秀的iap公升級程式,必須做好公升級中出現故障等異常的處理。保證系統不會崩潰

(1) 接收到公升級命令,準備公升級

(2) 接收公升級資料完成,每個包最好有包序號和校驗

(3) 整個資料接收完,進行總的校驗

(4) 試執行剛公升級的版本,傳送讀取版本資訊或其他指令測試當前版本是否工作正常,如果不正常,外界通過對外專門的reset引腳,恢復到原版本

(5) 接收到版本確認命令,將公升級版本作為當前執行版本,並將原版本進行儲存

另外:(1)要保證公升級過程中任何時候掉電,下次上電後,系統能正常工作。例如新的程式正在搬運到執行區時候掉電,下次上電要實現自動搬運

(2)正常情況下,系統一般由bootloader區跳轉到使用者區。如果使用者區程式有問題的話,就玩over了,因此一定要在跳轉之前加一定延時,可以響應公升級命令

(3)執行bootloader區和使用者區跳轉指令,由於只是pc指標的跳轉,暫存器並未恢復到預設值,因此對bootloader和使用者區**中的暫存器初始化要小心。

說到底最重要的還是bootloader程式一定要寫好,這個畢竟是出廠前固化在flash中

給手機公升級,主機板公升級,其中強調的就是不能中途掉電,否則就要。。。這個應該就是沒做好公升級處理吧

IAP公升級初識

關注了這個概念有些日子了,這段時間總算有機會實戰 網路公升級應用韌體,這裡記錄下遇到的問題,及解決方案。原理與網上流傳的串列埠作為傳輸手段 一致 不同之處,無非我這裡使用了網路裝置傳輸。lwip tftp客戶端的應用.參考 iar環境下stm32 iap方案的實現 stm32 之iap.pdf 基於...

IAP公升級的注意事項

如果在iap中沒有使用中斷,那麼跳轉前只需要對照iap外設的初始部分,逐個deinit 關閉時鐘即可。如果在iap中使用到了中斷,那麼需要做以下部分 在nvic中關閉外設對應的中斷使能 nvic disableirq 尤其注意systick的中斷使能ll systick disableit dein...

STM32 IAP公升級工具

1 內部包含了crc mode的檢驗 2 檔案包含了頭尾 長度的資料,確保公升級操作的可靠性 3 win32串列埠查詢功能getseriallist 4 regkey.open hkey local machine,t hardware devicemap serialcomm key read e...