cancel
Showing results for 
Search instead for 
Did you mean: 

Trouble Jumping to Bootloader from Application on STM32H747 with Riverdi Display and TouchGFX

Sasa1234
Associate II

Hello everyone,

I'm facing an issue with jumping from my application to the bootloader on an STM32H747 microcontroller. I'm using a 7-inch Riverdi display and have developed graphical interfaces using TouchGFX. My application, which I've built using only the M7 core (disabling the M4 core) and FreeRTOS for task management and graphics, has its main file structured as man1.c attached.I've also created a bootloader program with the following structure:  The bootloader works perfectly when the STM32H747xx_FLASH.ld file contains the following instruction:

Assolutamente! Ecco la traduzione del tuo post in inglese, adatta per un forum tecnico come quello di STM:

Subject: Trouble Jumping to Bootloader from Application on STM32H747 with Riverdi Display and TouchGFX

Hello everyone,

I'm facing an issue with jumping from my application to the bootloader on an STM32H747 microcontroller. I'm using a 7-inch Riverdi display and have developed graphical interfaces using TouchGFX. My application, which I've built using only the M7 core (disabling the M4 core) and FreeRTOS for task management and graphics, has its main file structured as follows:

I've also created a bootloader program with the following structure:

The bootloader works perfectly when the STM32H747xx_FLASH.ld file contains the following instruction:

MEMORY
{
RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K
/*FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K*/ /* Memory is divided. Actual start is 0x08000000 and actual length is 2048K */

FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 250K

DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K
RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K
ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K
SDRAM (xrw) : ORIGIN = 0xD0000000, LENGTH = 4M
SDRAM2 (xrw) : ORIGIN = 0xD0400000, LENGTH = 4M
}

 

However, when I try to jump to the bootloader from my application using a jump_to_bootloader() function, the jump to the bootloader fails. This is code snipet:

 

typedef void (*pFunction)(void);
 
 
#define BOOT_ADDR 0x080B50000
void jump_to_bootloader(void)
{
 
 
 
__disable_irq();  // Disabilita tutti gli interrupt
 
HAL_RCC_DeInit(); // Disabilita tutti i clock
HAL_DeInit();     // Deinizializza le periferiche
 
 
 
SCB_DisableICache();
SCB_DisableDCache();
 
// Disabilita SysTick timer
   // SysTick->CTRL = 0;
   // SysTick->LOAD = 0;
   // SysTick->VAL  = 0;
 
 
// Pulisci flag di reset
__HAL_RCC_CLEAR_RESET_FLAGS();
 
 
 
__set_MSP(*(__IO uint32_t*)BOOT_ADDRESS); // Imposta il nuovo Stack Pointer
 
 
SCB->VTOR = BOOT_ADDRESS;
 
// Puntatore alla funzione di reset dell'applicativo
uint32_t JumpAddr = *(__IO uint32_t*)(BOOT_ADDRESS+ 4);
pFunction Jump = (pFunction)JumpAddr;
 
__enable_irq(); // Riabilita gli interrupt prima del salto
// Esegui il salto
Jump(); // Salta all’applicazione
// Se il salto fallisce, reset
NVIC_SystemReset();
}

 

 I've made to the .ld files of both the application and the bootloader.

// Application .ld

/* Memories definition */
MEMORY
{
RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K
/*FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K*/ /* Memory is divided. Actual start is 0x08000000 and actual length is 2048K */

FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 724K

DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K
RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K
ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K
QUADSPI (r) : ORIGIN = 0x90000000, LENGTH = 64M
SDRAM (xrw) : ORIGIN = 0xD0000000, LENGTH = 4M
SDRAM2 (xrw) : ORIGIN = 0xD0400000, LENGTH = 4M
}

// Bootloader.ld

 

/* Memories definition */
MEMORY
{
RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K
/*FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K*/ /* Memory is divided. Actual start is 0x08000000 and actual length is 2048K */

FLASH (rx) : ORIGIN = 0x08B500000, LENGTH = 250K

DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K
RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K
ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K
SDRAM (xrw) : ORIGIN = 0xD0000000, LENGTH = 4M
SDRAM2 (xrw) : ORIGIN = 0xD0400000, LENGTH = 4M
}

 

 

Could someone please advise on what modifications I need to make in both the application and the bootloader code to successfully jump to the bootloader? Is there something I'm missing in the process?How may I had to manage all peripherals?

Thank you in advance for your help!

 

 

 

2 REPLIES 2

#define BOOT_ADDR 0x080B50000

FLASH (rx) : ORIGIN = 0x08B500000, LENGTH = 250K

Should be 0x080B5000, Memory in range 0x08000000..0x081FFFFF (2MB)

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
MM..1
Chief III

Are you sure ? FLASH (rx) : ORIGIN = 0x08B500000, LENGTH = 250K

too your main dont show where and how you try jump. Primary jump to system bootloader is safe from safe state of MCU optimaly after boot main with som marker. No inside RTOS No with 20 peripherals active ... NEVER.