__asm void boot_jump( uint32_t address )
{
LDR SP, [R0] ;Load new stack pointer address
LDR PC, [R0, #4] ;Load new program counter address
}
/**
* @brief Jump to second program
*
* @param address
*/
void jumpToProgram (uint32_t address)
{
SCB->VTOR = address & 0x3FFFFF80;
boot_jump(address);
}
//some code here
...
// jumping to second program from bootloader
else if(memcmp("jump\r", str, strlen("jump\r")) ==0 )
{
vTaskEndScheduler();
jumpToProgram(0x10000);
}
...
|
void SystemInit (void)
{
//code code
...
#ifdef __RAM_MODE__
SCB->VTOR = 0x10000000 & 0x3FFFFF80; /**< here it is! */
#else
SCB->VTOR = 0x00000000 & 0x3FFFFF80;
#endif
}
|
SCB->VTOR = (uint32_t) __Vectors; |
extern uint32_t * __Vectors;
void SystemInit (void)
{
//init code
...
SCB->VTOR = (uint32_t) __Vectors;
}
|
void jumpToProgram (uint32_t address)
{
MOV LR, #0xFFFFFFFF ;Reset Link Register
LDR SP, [R0];Load new stack pointer address
LDR PC, [R0, #4];Load new program counter address
} |
extern void __Vectors(void);
void SystemInit (void)
{
...
SCB->VTOR = (uint32_t) __Vectors;
...
} |