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) {}
}
|