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

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

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

跳至解决方案
1,349 次查看
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 项奖励
回复
1 解答
1,346 次查看
emimad
Contributor III

SOLVED!!!!

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

int main(void) {
__enable_irq();

OMG!

在原帖中查看解决方案

0 项奖励
回复
2 回复数
1,347 次查看
emimad
Contributor III

SOLVED!!!!

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

int main(void) {
__enable_irq();

OMG!

0 项奖励
回复
1,348 次查看
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 项奖励
回复