【IAP】IAP在線升級流程

IAP,全稱是“In-Application-Programming”,中文解釋爲“在程序中編程”。不同於ISP通過設置MCU內部的BootLoader程序引導燒寫或者是ICP通過SWD、JTAG在線仿真燒寫。IAP是一種對通過微控制器的對外接口如:USART,IIC,CAN,USB,以太網接口甚至是無線射頻通道等對正在運行程序的微控制器進行內部程序的更新的技術

如何實現?

1、實現IAP技術的核心是一段預先燒寫在單片機內部的IAP程序。這段程序主要負責與外部的上位機軟件進行握手同步,然後將通過外設通信接口將來自於上位機軟件的程序數據接收後寫入單片機內部指定的閃存區域,然後再跳轉執行新寫入的程序,最終就達到了程序更新的目的。

2、在STM32微控制器上實現IAP程序之前首先了解STM32的內部閃存組織架構和其啓動過程。關於啓動過程:

【FreeRTOS】讀書筆記,嵌入式微操作系統

3、STM32的內部閃存地址起始於0x8000000,一般情況下,程序文件就從此地址開始寫入。程序啓動後,將首先從“中斷向量表”(“中斷向量表”來響應中斷)取出復位中斷向量執行復位中斷程序完成啓動。“中斷向量表”的起始地址是0x8000004,當中斷來臨,STM32的內部硬件機制亦會自動將PC指針定位到“中斷向量表”處,並根據中斷源取出對應的中斷向量執行中斷服務程序。最後還需要知道關鍵的一點,通過修改STM32工程的鏈接腳本可以修改程序文件寫入閃存的起始地址

 

 

 

 

①、 STM32復位後,從地址爲0x8000004處取出復位中斷向量的地址,並跳轉執行復位中斷服務程序,隨後跳轉至IAP程序的main函數。

 

 

 

 

②、 執行完IAP過程後(STM32內部多出了新寫入的程序,地址0x8000004+N+M)跳轉至新寫入程序的復位向量表,取出新程序的復位中斷向量的地址,並跳轉執行新程序的復位中斷服務程序,隨後跳轉至新程序的main函數,注意在STM32的內部存儲空間在不同的位置上出現了2箇中斷向量表。

③、 在新程序main函數執行的過程中,一箇中斷請求來臨,PC指針仍會迴轉至地址爲0x8000004中斷向量表處,由於中斷向量表地址強制偏移而跳轉新程序的中斷向量表。⑤⑥⑦過程(內部存在兩個中斷向量表)

④、 根據中斷源跳轉至對應的中斷服務,注意此時是跳轉至了新程序的中斷服務程序中。

⑤、 中斷服務執行完畢後,返回main函數。

 

void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);

參數NVIC_VectTab爲中斷向量表起始位置,而參數Offset則爲地址偏移量,如將中斷向量表移至0x8002000處,則應調用該函數如下:(這個地方應該是固件庫裏面的,HAL庫應該沒有)

void NVIC_SetVectorTable(0x8000000, 0x2000);

注意:函數只會修改STM32程序中用於存儲中斷向量的結構體變量,而不會實質地改變中斷向量表在閃存中的物理位置。

設計IAP方案:

1、STM32復位後,利用一個按鍵的狀態進行同步,當按鍵按下時表示將要進行IAP過程。

2、IAP過程中,通過上位機軟件向STM32的USART設備發送所要更新的程序文件,(程序在flash存儲中起始地址由自己在BootLoader中設定好,每次復位檢測是否有新程序)

3、STM32藉助定時器來判斷數據是否完全接收,完全接收後IAP過程結束。

4、再次復位後,跳轉0x8000004+N+M地址開始運行新寫入的程序。

注意事項:

  • 利用IAP寫入的程序文件最好是.bin格式的文件。
  • 向STM32發送程序文件時儘量慢一些,因爲STM32對FLASH的寫入速度往往跟不上通訊外設接口的速度。
  • 防錯機制。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章