void Bootloader_JumpToApplication() { [color=#f03]__disable_irq();[/color] //Load main stack pointer with application stack pointer initial value, //stored at first location of application area asm volatile("ldr r0, =0x4000"); asm volatile("ldr r0, [r0]"); asm volatile("mov sp, r0"); //Load program counter with application reset vector address, located at //second word of application area. asm volatile("ldr r0, =0x4004"); asm volatile("ldr r0, [r0]"); asm volatile("mov pc, r0"); //User application execution should now start and never return here.... } |
#define vector_in_ram((int32_t *) 0x10000000) void Bootloader_JumpToApplication() { int i = 0; __disable_irq(); // remap the interrupt vectors to the start of the code loaded in memory int32_t *p = (int32_t *) 0x4000; // copy the interrupt vector table on base RAM for (i=0;i<128;i++) { vector_in_ram = *p; p++; } LPC_SYSCON->SYSMEMREMAP = 0x1; // remap the interrupt vectors to ram //Load main stack pointer with application stack pointer initial value, //stored at first location of application area asm volatile("ldr r0, =0x4000"); asm volatile("ldr r0, [r0]"); asm volatile("mov sp, r0"); //Load program counter with application reset vector address, located at //second word of application area. asm volatile("ldr r0, =0x4004"); asm volatile("ldr r0, [r0]"); asm volatile("mov pc, r0"); //User application execution should now start and never return here.... } |
asm volatile("mov pc, r0"); |
#define VECTOR_IN_RAM_LENGTH 47 //stackpointer not counted uint32_t vector_in_ram[VECTOR_IN_RAM_LENGTH] __attribute__ ((section ("vtable"))); uint32_t *p = (uint32_t *) 0x1000; __disable_irq(); // copy the interrupt vector table on base RAM for (i=0; i<VECTOR_IN_RAM_LENGTH; i++) vector_in_ram = *(p + i); LPC_SYSCON->SYSMEMREMAP = 0x1; __enable_irq(); |
uint8_t volatile TickWas; uint32_t volatile Timeout; uint32_t volatile EnableStartApplication; void SysTick_Handler(void) { TickWas=1; if (++Timeout>1000) EnableStartApplication=1; } typedef void (*ISRPtr) (void); void main() { SysTick_Config(48000); BootRxTx();// new firmware receive and programming if (EnableStartApplication) {// uint32_t crc; uint32_t version_crc; crc=GetFlashCRC();// get application crc version_crc=*(uint32_t *)0x1000;// read crc from address 0x1000 if (crc==version_crc) { __disable_irq(); // load application MSP __set_MSP(*(uint32_t *)0x1004); // start application Reset_Handler ISRPtr application_reset_handler=(ISRPtr)(*(uint32_t *)0x1008); application_reset_handler(); } else NVIC_SystemReset();// reset if application sum fail } } |
uint8_t volatile TickWas; void SysTick_Handler(void) { TickWas=1; SystemTimerMs++; } #define LPC11XX_VECTOR_QTY 47 typedef void (*ISRPtr) (void); struct TLPC11xxVectorTable { ISRPtr StackPtr; ISRPtr ResetISR; ISRPtr Reserved0[9]; ISRPtr SvcISR; ISRPtr Reserved1[2]; ISRPtr PendSvcISR; ISRPtr SysTickISR; /* Device interrupt vectors */ ISRPtr WakeUpISR[13]; ISRPtr Reserved2; ISRPtr Ssp1ISR; ISRPtr I2cISR; ISRPtr Timer16_0_ISR; ISRPtr Timer16_1_ISR; ISRPtr Timer32_0_ISR; ISRPtr Timer32_1_ISR; ISRPtr Ssp0ISR; ISRPtr UART_ISR; ISRPtr Reserved3[2]; ISRPtr ADC_ISR; ISRPtr Wdt_ISR; ISRPtr Bod_ISR; ISRPtr Reserved4; ISRPtr EINT3_ISR; ISRPtr EINT2_ISR; ISRPtr EINT1_ISR; ISRPtr EINT0_ISR; }; TLPC11xxVectorTable IsrTable __attribute__ ((__section__(".IntVecTable"))); void main () { ISRPtr *isr_ptr=&IsrTable.ResetISR; for (i=0; i<(LPC11XX_VECTOR_QTY); i++) *isr_ptr++=Default_Handler; uint32_t *dest=(uint32_t *)&IsrTable; const uint32_t *src=(const uint32_t *)APPLICATION_START_ADDRESS; for (i=0; i<LPC11XX_VECTOR_QTY; i++) *dest++=*src++; IsrTable.SysTickISR=SysTick_Handler; SysTick_Config(48000); mhile (1) {} } |