STM32 IAP Advanced redirect using SRAM
前言
這邊因為需求在開發USB DFU 時範例都是使用外部pin腳去做切換,但實際上使用情況是會址接USB或其他Interface去下達指令,使其去切換APP or Bootloader mode,但如果使用Flash當flag使用會受限於10K 次使用次數限制,這邊其實還可以使用SRAM去做
實作
基本上要在SRAM上作區塊來使用,切記要點是不能斷電,因斷電會讓SRAM reset這邊Flag就會被清除
下面就可以參考SRAM位置宣告方式
#define END_SRAM_ADDR 0x20017FEC
uint32_t boot_value=0;
針對SRAM位置可以參考Flash ld檔
因這邊是選用STM32F401RET6因此SRAM起始區域是從0x20000000開始,另外我們要使用區域要不能被初始化,不然每次在MCU reset時會導致SRAM內資料被清除,所以我們這邊選擇的END_SRAM_ADDR 會是從0x20017FEC為最後一個,SIZE也不是原先的96KB而是96KB-所要使用區域,而這個區塊就是不會受到MCU reset等影響
boot_value = *( ( unsigned long* ) END_SRAM_ADDR );
//printf("boot_value0= 0x%x\r\n",*( ( unsigned long* ) END_SRAM_ADDR ));
if(boot_value!=0 &&boot_value!=0x2345)
boot_value=0;
if(boot_value==0)//HAL_GPIO_ReadPin(GPIOB,ChangeMode_Pin)==GPIO_PIN_SET)
{
*( ( unsigned long* ) END_SRAM_ADDR ) =0;
// printf("boot_value01= 0x%x\r\n",*( ( unsigned long* ) END_SRAM_ADDR ));
printf("Jump to APP\n\r");
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();
}
printf("Keep DFU\n\r");
這邊可以看到可以使用指標形式去存取特定位置的address來當成旗標使用