STM32 USB IAP實作

IAP前言

IAP(In Application Programming,應用內編程),是指程序在運行過程中對User Flash的部分區域進行燒寫,目的是為了在產品發布後可以方便地通過預留的通信口對產品中的固件程序進行更新升級。

IAP流程

這邊是開啟2包專案,其中一包是DFU另一包APP則是看需求撰寫,流程如圖,為便捷開發我們都會以DFU為起始位置

USB DFU實作注意事項

這邊因是燒2包程式,把Flash切割成2個區塊,因此需要留意DFU在程式中所占比的空間與要轉跳到APP的指向位置

如圖這邊第一步是需要先確認DFU程式占比,一般會預留一些空間避免蓋到APP Flash

這邊要留意預留空間盡可能以一個page為單位,這邊範例以STM32CubeMX生成因DFU抓64kb為主體因此APP會燒入在0x8010000為起始,詳細參考各系列的reference_manual(這邊範例以STM32G0系列為出發)

APP端燒入注意事項

使用STM32cubePrg燒入記得要去留意Start address避免去覆蓋到DFU程式區域,且要確定DFU轉跳位置須為APP起始位置

這邊一樣要去修訂ld檔,但要修訂ld檔啟示位置

這邊最後一步是要去修訂中斷向量表的Offset這邊就需要依照各自需求去做變化

這邊有個小要點,就是部分MCU會沒有RCC初始化這區塊,如果APP轉跳後不會動,可以把這塊初始化移植上去
這塊在sample code上都會有但由STM32CubeMX生成檔案可能會缺少這區塊

轉跳參考機制

這邊提供官方範例是以按鈕做轉跳,如果也可以變通為特定flash位置數值判斷是否要執行DFU還是直接跳APP,
這邊以APP起始位置為0x08010000作為範例

if (BSP_PB_GetState(BUTTON_USER) != GPIO_PIN_RESET)
   {
     /* Test if user code is programmed starting from address 0x08010000 */
     if (((*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD) & 0xFFFF0000) ==
         0x20000000)
     {
       /* Jump to user application */
       JumpAddress = *(__IO uint32_t *) (USBD_DFU_APP_DEFAULT_ADD + 4);
       JumpToApplication = (pFunction) JumpAddress;

       /* Initialize user application's Stack Pointer */
       __set_MSP(*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD);
       JumpToApplication();
     }
   }

Leave a Comment

Your email address will not be published. Required fields are marked *

Shopping Cart