Clean jump app to app
Hello,
WORKING ON : STM32H753
I am looking to implement a jump from one application to another on an STM32H7 (Cortex-M7), so that the new application starts as if the microcontroller had just been reset: MSP initialized, VTOR set, caches (and MPU maybe?) correctly managed, peripherals reset, SysTick and IRQs disabled.
Knowing that my APP1 is a custom bootloader at address 0x08000000 and my APP2 is my main application with lots of peripherals, timers, DMA, etc. at address 0x08020000.
I tried many sequences to make a jump without crashing.
My jump from APP2 (app) to APP1 (bootloader) seems to work without bugs:
//disable interrupts
__disable_irq();
//disable Systick
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
//deinit
HAL_RCC_DeInit();
HAL_DeInit();
// __enable_irq();
// vide cache
SCB_DisableICache();
SCB_DisableDCache();
__DSB();
__ISB();
// je définis ma table des vecteurs au début de mon IAP donc à IAP_ADRESS (0x08000000), avec les cortex M7 SCB est un ptr vers la struc SCB_type qui contient notamment VTOR
SCB->VTOR = IAP_ADDRESS; // table vecteurs IAP
// le premier élement de la table des vecteur est le MSP (Main stack pointer) on doit l'initialiser au début du VTOR OFFSET 0
__set_MSP(*(__IO uint32_t*)IAP_ADDRESS); // MSP correct
// on récupère l'addresse de la fonction de ResetHandler qui est le 2eme élement du VTOR OFFSET 4
JumpAddress = *(__IO uint32_t*)(IAP_ADDRESS + 4);
// JumpToIAP appelle la fonction qui se trouve à l'addresse du ResetHandler
JumpToIAP = (pFunction)JumpAddress;
__enable_irq();
__DSB();
__ISB();
// on appelle la fonction resetHandler pour basculer vers l'IAP
JumpToIAP();My jump from APP1 (bootloader) to APP2 (app) seems to work without bugs but i only if I put it in comments :
(i dont know why?)
// SCB_DisableDCache();
// SCB_DisableICache();:
//disable interrupts
__disable_irq();
//disable Systick
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
//deinit
// on désactive toutes les horloges pour éviter d'utiliser la config d'horloge de l'app (Peut etre mis en commentaire si pas dérangeant pour améliorer la rapidité)
HAL_RCC_DeInit();
// on désactive touts les périphériques (UART,timer, GPIO etc) HAL pour éviter d'utiliser la config de l'app (Peut etre mis en commentaire si pas dérangeant pour améliorer la rapidité)
HAL_DeInit();
// // vide cache
// SCB_DisableDCache();
// SCB_DisableICache();
// je définis ma table des vecteurs au début de mon IAP donc à IAP_ADRESS (0x08000000), avec les cortex M7 SCB est un ptr vers la struc SCB_type qui contient notamment VTOR
SCB->VTOR = APPLICATION_ADDRESS; // table vecteurs IAP
// le premier élement de la table des vecteur est le MSP (Main stack pointer) on doit l'initialiser au début du VTOR OFFSET 0
__set_MSP(*(__IO uint32_t*)APPLICATION_ADDRESS); // MSP correct
// on récupère l'addresse de la fonction de ResetHandler qui est le 2eme élement du VTOR OFFSET 4
JumpAddress = *(__IO uint32_t*)(APPLICATION_ADDRESS + 4);
// JumpToIAP appelle la fonction qui se trouve à l'addresse du ResetHandler
JumpToApplication = (pFunction)JumpAddress;
// on appelle la fonction resetHandler pour basculer vers l'IAP
__enable_irq();
__DSB();
__ISB();
JumpToApplication();I am looking for a robust method that simulates a complete reset: all devices reset to their initial state, caches and MPU correctly configured, allowing APP 1 or 2 to start normally as a single program without using a system reset.
