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來當成旗標使用

Leave a Comment

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

Shopping Cart