__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; ... } |