2024-08-15 01:46 AM
hello,
I use STM32CubeIDE 1.16.0 and working on a custom bootloader to jump to application at address 0x08100000, here're the jump code below:
void jump_to_application(uint32_t flash_address)
{
void (*app_reset_handler)(void);
uint32_t main_stack_pointer_value = *(volatile uint32_t *)flash_address;
__HAL_RCC_GPIOC_CLK_DISABLE();
__HAL_RCC_GPIOD_CLK_DISABLE();
__HAL_RCC_GPIOB_CLK_DISABLE();
__HAL_RCC_GPIOA_CLK_DISABLE();
HAL_RCC_DeInit();
HAL_DeInit();
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/**
* Step: Disable all interrupts
*/
__disable_irq();
__set_MSP(main_stack_pointer_value);
uint32_t reset_handler = *(volatile uint32_t *)(flash_address + 4);
app_reset_handler = (void*) reset_handler;
app_reset_handler();
}
And I change the ld file of application:
MEMORY
{
ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x08100000, LENGTH = 2048K
DTCMRAM1 (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
DTCMRAM2 (xrw) : ORIGIN = 0x20010000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 1024K
RAM_CD (xrw) : ORIGIN = 0x30000000, LENGTH = 128K
RAM_SRD (xrw) : ORIGIN = 0x38000000, LENGTH = 32K
}
And in application, it'll start up with turning on 3 LEDs, each delay by using HAL_Delay(100) like
below:
HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_PIN);
HAL_Delay(100);
printf("LED1 on, Delay trail\n");
// HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
HAL_Delay(100);
printf("LED2 on, Delay trail\n");
// HAL_GPIO_TogglePin(LED3_GPIO_PORT, LED3_PIN);
HAL_Delay(100);
but I found after jumping to application, only LED1 is turned on, seems stuck in HAL_Delay(if remove HAL_Delay, all LEDs will turn on), can you help me to check if the jump_to_application() is correct? What else do I need to do in application?
Thank you very much!
Bill
Solved! Go to Solution.
2024-08-15 02:16 AM
> seems stuck in HAL_Delay(if remove HAL_Delay
Do not forget to assign the vector table base register (VTOR). It must point to the vector table in the app. Align it properly (0x400 for H7)
2024-08-15 02:16 AM
> seems stuck in HAL_Delay(if remove HAL_Delay
Do not forget to assign the vector table base register (VTOR). It must point to the vector table in the app. Align it properly (0x400 for H7)
2024-08-15 03:04 AM - edited 2024-08-15 03:04 AM
Hello @lbapplem ,
Try configuring the VTOR register as recommended by @Pavel A.
Please have a look at these FAQs, which may be helpful for you:
2024-08-15 03:24 AM
Hello @lbapplem,
It is clear that you have disabled the systick in jump_to_application() function, so, automatically HAL_Delay() will not work, could you please try to re-enable the systick by adding HAL_Init() at the beginning of your application.
With regards
2024-08-15 10:40 PM
hi,Pavel:
Thanks, issue resolved.
Bill