1. 程式人生 > >STM32F10X 應用韌體升級

STM32F10X 應用韌體升級

IAP方案

把程式碼區分成了兩部分: 1.bootloader(啟動載入程式碼區) 2.user application(使用者應用程式碼區) 程式執行初始化進入bootloader,在bootloader裡面檢測條件是否被觸發(可通過按鍵是否被按下,串列埠是否接收有特定的資料、U盤是否插入等)訊號,如果有則對user application程式碼區進行擦除合重新寫入新的使用者程式碼的操作;如果沒有,就直接跳轉到user application執行應用;

正常STM32F103ZET6的啟動有三種方式: 1.內建Flash啟動; 2.內建SRAM啟動; 3.系統儲存器ROM啟動; 通過BOOT0合BOOT1引腳的設定可以選擇哪種啟動方式。

對於Flash啟動而言,Flash的地址:0x08000000 - 0x0807ffff,一共512KB。這裡首要的是中斷問題。正常中斷過程為:發生中斷請求,到中斷向量表中查詢中斷函式入口地址,跳轉到中斷函式內,執行中斷函式邏輯,然後返回。即說明了STM32有一箇中斷向量表用來存放各個中斷服務函式的入口地址,內建的Flash分配情況如下: 棧頂地址 | 中斷向量表 | 中斷服務函式 | 主程式 ↑ 0x08000000 (從0x08000000地址開始,借用網友的一張圖片) 這個中斷向量表存放在程式碼開始的後4個位元組處,即0x08000004地址。程式碼開始的4個地址是存放堆疊棧頂的地址,當發生中斷後程式通過查詢該表得到響應的中斷服務程式入口地址,然後再跳轉到相應的中斷服務程式中執行。上電後從0x08000004處取出復位中斷向量的地址,然後跳轉到復位程式的入口,執行結束後,跳轉到main函式中。從中斷向量表中找到相應的中斷函式入口地址,跳轉到相應的中斷服務函式,執行完中斷函式後,再返回到main函式中去,這就是整個啟動過程。

若使用IAP方案,則內建的Flash分配情況大致如下: 在這裡插入圖片描述 在內建的Flash裡面添加了一個bootloader程式,Bootloader程式和user application各有一箇中斷向量表,假設Bootloader程式佔用的空間為N+M位元組,則程式按照如下方式進行執行: 在這裡插入圖片描述

上電初始化程式還是從0x08000004地址處開始,取出中斷復位向量地址,執行復位中斷函式後,跳轉到IAP的main中。在IAP的main函式執行完成後,強制跳轉到0x08000004 + N + M地址處,在跳轉到user application程式碼區的中斷復位向量地址,當發生中斷復位請求後,程式跳轉到新的中斷向量表中,再跳轉到中斷函式去執行,完成後再跳轉到user application的main函式中。

當CPU產生一箇中斷請求時,對於user application處的中斷函式,是怎樣進來的呢? 在main函式的執行過程中,如果CPU得到了一箇中斷請求,PC指標本來應該跳轉到0x08000004處的中斷向量表中,但是由於我們設定了中斷向量偏移量N+M,所以使得PC指標被強制跳轉到0x08000004 + N + M處的中斷向量表中的地址,執行對應的user application中的中斷服務函式,執行結束後返回到user applicaiton main函式中去。

IAP過程描述:

1、IAP的bootloader載入程式。 對於片內Flash得至少分成2個分割槽,對應至少兩個完整的程式; 低地址分割槽放入IAP程式(bootloader載入程式);告抵制分割槽燒寫APP韌體。

IAP程式中,當滿足跳轉條件(通過串列埠,網路等方式,告知IAP程式可以進行升級)時,執行跳轉到user application的應用程式,跳轉程式碼流程: 需要設定跳轉目的地的APP應用程式棧頂地址指標: __set_MSP(*(__IO uint32_t *) USER_FLASH_START_PAGE_ADDRESS); 其中: #define USER_FLASH_START_PAGE_ADDRESS 0x08009000 — 分配36K空間

2、user application應用程式 需要配置修改,Target的IROM1的起始地址: 在這裡插入圖片描述

還有中斷向量表偏移: #define _ IAP__ (1) int main(void) { #ifdef _ IAP__ NVIC_SetVectorTable(NVIC_VectTab_FLASH, VectorTable_Offset); #endif }

其中: #define NVIC_VectTab_FLASH ((uint32_t)0x08000000UL) #define VectorTable_Offset ((uint32_t)0x9000UL)

3、查詢錯誤:

如果做了上邊的工作,IAP依然無法順利執行跳轉至app應用程式,可以檢視.map和.bin檔案,確定是否如實的改變的中斷向量表的偏移和棧頂指標,如圖: 在這裡插入圖片描述 .bin檔案: 在這裡插入圖片描述 可以看到,主棧頂MSP地址=0x2000C8C8、reset_handler地址=0x08009189 如此,才能生效,否則,可能原因: 修改後的向量表偏移,在之後的程式中,又再次被還原,通過如下的函式:

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

附:

1、如需要.hex檔案轉.bin,參見上邊的文章 當然,就算使用.hex檔案,同樣可以升級,只是需要修改IAP中判定已經升級的檔案是否有效,檔案條件部分的程式碼: if((((__IO uint32_t)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)

2、地址偏移後的app應用程式,是否能夠獨立的執行? 不能,理由: 在這裡插入圖片描述 可上知,開機上電並不能夠找到我們指定的偏移後的向量表