LPC11U2/3x secondary bootloader doens't jump to app

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

LPC11U2/3x secondary bootloader doens't jump to app

Jump to solution
1,372 Views
emimad
Contributor III

Hi friends!

I've spent few days trying to get my secondary bootloader working.

I've studied AN10995, which is for LPC1114 (not the same family), but I can't get to make it jump from secondary bootloader to app.

App is in 0x002000 address (I've checked it with flashmagic) and this is my jump sequence:

 

 __disable_irq();
		    LPC_SYSCTL->MAINCLKSEL = 0;        // using FRO
		    LPC_SYSCTL->MAINCLKUEN = 0;
		    LPC_SYSCTL->MAINCLKUEN = 1;                                    

		    SystemCoreClockUpdate();
		/* Load main stack pointer with application stack pointer initial value,
		   stored at first location of application area */
		asm volatile("ldr r0, =0x2000");																//=0x1000");
		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, =0x2004");																//=0x1004");
		asm volatile("ldr r0, [r0]");
		asm volatile("mov pc, r0");

 

0 Kudos
Reply
1 Solution
1,369 Views
emimad
Contributor III

SOLVED!!!!

App needs to activate IRQs in the beggining of the main()!!!

int main(void) {
__enable_irq();

OMG!

View solution in original post

0 Kudos
Reply
2 Replies
1,370 Views
emimad
Contributor III

SOLVED!!!!

App needs to activate IRQs in the beggining of the main()!!!

int main(void) {
__enable_irq();

OMG!

0 Kudos
Reply
1,371 Views
emimad
Contributor III

IRQ Handlers are similar to AN10995:

void NMI_Handler(void)
{
	/* Re-direct interrupt, get handler address from application vector table */
	asm volatile("ldr r0, =0x2008");
	asm volatile("ldr r0, [r0]");
	asm volatile("mov pc, r0");
}

void HardFault_Handler(void)
{
	/* Re-direct interrupt, get handler address from application vector table */
	asm volatile("ldr r0, =0x200C");
	asm volatile("ldr r0, [r0]");
	asm volatile("mov pc, r0");
}

void SVCall_Handler(void)
{
	/* Re-direct interrupt, get handler address from application vector table */
	asm volatile("ldr r0, =0x202C");
	asm volatile("ldr r0, [r0]");
	asm volatile("mov pc, r0");
}

void PendSV_Handler(void)
{
	/* Re-direct interrupt, get handler address from application vector table */
	asm volatile("ldr r0, =0x2038");
	asm volatile("ldr r0, [r0]");
	asm volatile("mov pc, r0");
}

void SysTick_Handler(void)
{
	/* Re-direct interrupt, get handler address from application vector table */
	asm volatile("ldr r0, =0x203C");
	asm volatile("ldr r0, [r0]");
	asm volatile("mov pc, r0");
}

void WAKEUP_IRQHandler(void)
{
	/* Re-direct interrupt, get handler address from application vector table */
	asm volatile("ldr r0, =0x2040");
	asm volatile("ldr r0, [r0]");
	asm volatile("mov pc, r0");
}

 

Some help is needed, please.

Can somebody try my sequence and check what's the problem?

0 Kudos
Reply