STM32+IAP方案 實現網絡升級應用固件

關注了這個概念有些日子了,這段時間總算有機會實戰==網絡升級應用固件,這裏記錄下遇到的問題,及解決方案。
原理與網上流傳的串口做爲傳輸手段 一致;不一樣之處,無非我這裏使用了網絡設備傳輸。==(lwip)TFTP客戶端的應用.
參考:
IAR環境下STM32+IAP方案的實現
STM32淺談之IAP.pdf
基於IAP和Keil MDK的遠程升級設計
keil MDK中如何生成*.bin格式的文件html


概況:

  • 什麼是IAP,爲何要IAP
  • 可實現的原理
  • 實現過程
  • 細節及實現
    以上基本均可以從【IAR環境下STM32+IAP方案的實現】中找到答案。這裏只是貼圖,醒目:
    IAP框架佈局:
    這裏寫圖片描述
    STM32F103ZET6的啓動方式有三種:內置FLASH啓動、內置SRAM啓動、系統存儲器ROM啓動,經過BOOT0和BOOT1引腳的設置能夠選擇從哪中方式啓動,這裏選擇內置的FLASH啓動。其FLASH的地址爲0x08000000—0x0807ffff,共512KB,這些都能從芯片數據手冊中直接獲得。而這裏首要的一個問題是中斷的問題。正常狀況下發生中斷的過程爲:發生中斷(中斷請求),到中斷向量表查找中斷函數入口地址,跳轉到中斷函數,執行中斷函數,中斷返回。也就是說在STM32的內置的Flash中有一箇中斷向量表來存放各個中斷服務函數的入口地址,內置Flash的分配狀況大體以下圖2-1。
    這裏寫圖片描述
    這裏寫圖片描述
    這裏寫圖片描述
    這裏寫圖片描述
    在內置的Flash裏面添加一個BootLoader程序,BootLoader程序和user application各有一箇中斷向量表,假設BootLoader程序佔用的空間爲N+M字節,則程序的走向應該如圖2-2所示(借用網友的原圖並作改動,其中虛線部分爲原圖步驟④⑤的走向,本人改成指向灰色部分)。
    這裏寫圖片描述
    上電初始程序依然從0x08000004處取出復位中斷向量地址,執行復位中斷函數後跳轉到IAP的main(標號①所示),在IAP的main函數執行完成後強制跳轉到0x08000004+N+M處(標號②所示),最後跳轉到新的main函數中來(標號③所示),當發生中斷請求後,程序跳轉到新的中斷向量表中取出新的中斷函數入口地址,再跳轉到新的中斷服務函數中執行(標號④⑤所示),執行完中斷函數後再返回到main函數中來(標號⑥所示)。
    對於步驟④⑤,網友認爲是:「在main執行的過程當中,若是CPU獲得一箇中斷請求,PC指針仍強制跳轉到地址0x08000004中斷向量表處,而不是新的中斷向量表,如圖標號④所示,程序再根據咱們設置的中斷向量表偏移量,跳轉到對應中斷源新的中斷服務程序中,如圖標號⑤所示」。我對此的理解是:「當發生中斷後,程序從0x08000004(舊)處的中斷向量表中獲得相應的中斷服務函數入口地址,繼而跳轉到相應的中斷服務程序」。可是舊的中斷向量列表裏邊存放的是IAP程序中斷函數的入口地址,它是如何獲得user程序中斷函數的入口地址呢?因此我以爲此種說法是錯誤的。「當發生中斷時PC指針強制會跳轉到0x08000004處」這種說法並無錯,只是忽略了後續的一些知識要點而致使這個說法出現矛盾。
    對於步驟④⑤我認爲的是,在main函數的執行過程當中,若是CPU獲得一箇中斷請求,PC指針原本應該跳轉到0x08000004處的中斷向量表,因爲咱們設置了中斷向量表偏移量爲N+M,所以PC指針被強制跳轉到0x08000004+N+M處的中斷向量表中獲得相應的中斷函數地址(待求證),再跳轉到相應新的中斷服務函數,執行結束後返回到main函數中來。

IAP流程描述:

一、IAP的bootloader引導程序

IAP在應用中編程,能夠拓展成遠程網絡更新應用固件。
片內的flash,至少劃分紅2個分區,對應至少兩個完整的程序;
低地址分區端推薦放入IAP程序==bootloader引導程序(這裏邊的手段能夠是串口、網絡等不一樣的方式),高地址分區端推薦燒寫app固件。
關鍵點說起:
IAP程序中,當知足跳轉條件(被觸發)時,執行跳轉代碼到app應用固件程序,跳轉代碼流程:
至少須要設定跳轉目的地的app應用固件 棧頂指針,:編程

/* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
  • 1
  • 2

其中,app應用固件的分區地址:網絡

#define USER_FLASH_FIRST_PAGE_ADDRESS 0x08009000
  • 1

二、app應用固件

須要兩處的更改,否則錯誤未知
IROM設置如圖:
這裏寫圖片描述
中斷向量表偏移:
這裏寫圖片描述app

NVIC_SetVectorTable(NVIC_VectTab_FLASH,VectorTable_Offset);
  • 1

其中:框架

#define NVIC_VectTab_FLASH ((uint32_t)0x08000000) #define VectorTable_Offset 0x9000 
  • 1
  • 2

查錯:

若是作了上邊的工做,IAP依然沒法順利執行跳轉至app應用程序,能夠查看.map和.bin文件,肯定是否如實的改變的中斷向量表的偏移和棧頂指針,如圖:
這裏寫圖片描述
.bin文件:
這裏寫圖片描述
能夠看到,主棧頂MSP地址=0x2000C8C八、reset_handler地址=0x08009189
如此,才能生效,不然,可能緣由:
修改後的向量表偏移,在以後的程序中,又再次被還原,經過以下的函數:函數

void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset); void SystemInit (void); SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
  • 1
  • 2
  • 3

附:

一、如須要.hex文件轉.bin,參見上邊的文章
固然,就算使用.hex文件,一樣能夠升級,只是須要修改IAP中斷定已經升級的文件是否有效,文件條件部分的代碼,佈局

if(((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
  • 1

二、地址偏移後的app應用程序,是否可以獨立的運行?
不能,理由:
這裏寫圖片描述
可知,開機上電並不可以找到咱們指定的偏移後的向量表。ui

相關文章
相關標籤/搜索