cancel
Showing results for 
Search instead for 
Did you mean: 

Switching from STM32F407VGT6 to STM32F437VIT6 bootloader application problem

Ogulcan Ariyurek
Associate II

Hi,

I've switched to STM32F437VIT6 from STM32F407VGT6, but I also switch my bootloader application.

In this application, there is a section that jumps to the real application that we've loaded using the bootloader:

 /* Test if Key push-button is not pressed */
 if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0x00)
 { /* Key push-button not pressed: jump to user application */
 pFlashStartAddr = *(__IO uint32_t*)FLASH_USER_START_ADDR;
	pFlashRes = (*(__IO uint32_t*)FLASH_USER_START_ADDR) & 0x2FFE0000;
  /* Check if valid stack address (RAM address) then jump to user application */
  if (((*(__IO uint32_t*)FLASH_USER_START_ADDR) & 0x30000000 ) == 0x20000000)
  {
   /* Jump to user application */
   JumpAddress = *(__IO uint32_t*) (FLASH_USER_START_ADDR + 4);
   Jump_To_Application = (pFunction) JumpAddress;
   /* Initialize user application's Stack Pointer */
   __set_MSP(*(__IO uint32_t*) FLASH_USER_START_ADDR);
   Jump_To_Application();
  }
 }
 /* enter in IAP mode */
	else
	{
  //Initialize kernel
  osInitKernel();
  //Configure debug UART
  debugInit(115200);
...

Please note that:

#define FLASH_USER_START_ADDR   ADDR_FLASH_SECTOR_5   /* Start address of user Flash area */
#define FLASH_USER_END_ADDR     ADDR_FLASH_SECTOR_23  /* End address of user Flash area */
 
/* Base address of the Flash sectors */ 
#define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base address of Sector 0, 16 Kbytes   */
#define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08004000) /* Base address of Sector 1, 16 Kbytes   */
#define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08008000) /* Base address of Sector 2, 16 Kbytes   */
#define ADDR_FLASH_SECTOR_3     ((uint32_t)0x0800C000) /* Base address of Sector 3, 16 Kbytes   */
#define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08010000) /* Base address of Sector 4, 64 Kbytes   */
#define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08020000) /* Base address of Sector 5, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08040000) /* Base address of Sector 6, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_7     ((uint32_t)0x08060000) /* Base address of Sector 7, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_8     ((uint32_t)0x08080000) /* Base address of Sector 8, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_9     ((uint32_t)0x080A0000) /* Base address of Sector 9, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_10    ((uint32_t)0x080C0000) /* Base address of Sector 10, 128 Kbytes */
#define ADDR_FLASH_SECTOR_11    ((uint32_t)0x080E0000) /* Base address of Sector 11, 128 Kbytes */
#define ADDR_FLASH_SECTOR_12    ((uint32_t)0x08100000) /* Base address of Sector 12, 16 Kbytes */
#define ADDR_FLASH_SECTOR_13    ((uint32_t)0x08104000) /* Base address of Sector 13, 16 Kbytes */
#define ADDR_FLASH_SECTOR_14    ((uint32_t)0x08108000) /* Base address of Sector 14, 16 Kbytes */
#define ADDR_FLASH_SECTOR_15    ((uint32_t)0x0810C000) /* Base address of Sector 15, 16 Kbytes */
#define ADDR_FLASH_SECTOR_16    ((uint32_t)0x08110000) /* Base address of Sector 16, 64 Kbytes */
#define ADDR_FLASH_SECTOR_17    ((uint32_t)0x08120000) /* Base address of Sector 17, 128 Kbytes */
#define ADDR_FLASH_SECTOR_18    ((uint32_t)0x08140000) /* Base address of Sector 18, 128 Kbytes */
#define ADDR_FLASH_SECTOR_19    ((uint32_t)0x08160000) /* Base address of Sector 19, 128 Kbytes */
#define ADDR_FLASH_SECTOR_20    ((uint32_t)0x08180000) /* Base address of Sector 20, 128 Kbytes */
#define ADDR_FLASH_SECTOR_21    ((uint32_t)0x081A0000) /* Base address of Sector 21, 128 Kbytes */
#define ADDR_FLASH_SECTOR_22    ((uint32_t)0x081C0000) /* Base address of Sector 22, 128 Kbytes */
#define ADDR_FLASH_SECTOR_23    ((uint32_t)0x081E0000) /* Base address of Sector 23, 128 Kbytes */

The loading part of my application works fine but the jumping part is not working, gives a hard fault.

Here is my scatter file:

LR_IROM1 0x08000000 0x200000
{
   ER_IROM1 0x08000000 0x200000
   {
      *.o (RESET, +First)
      *(InRoot$$Sections)
      .ANY (+RO)
   }
   
   RW_IRAM1 0x20000000 0x30000
   { 
      .ANY (+RW +ZI)
   }
   
   ARM_LIB_STACK 0x20020000 EMPTY -0x1000
   {
   }
   
   ARM_LIB_HEAP 0x20010000 EMPTY 0x0F000
   {
   }
}

How can I fix this issue?

Thanks in advance.

Regards,

Ogulcan

1 REPLY 1
Ogulcan Ariyurek
Associate II

If I check the "Use Memory Layout from Target Dialog", I get the attached error.