我正在使用mbed的LPC1768板,(带有cortex M3cpu),我试图在这里实现一些东西,主要是从SD卡升级用户应用程序,我正在编写两个程序,首先是bootloader/nano-kernel和user-app(helloworld将做一:

  • Bootloader/nano-kernel在0x00地址运行,它会做一些检查,并最终抓取SD卡上的二进制文件
  • Bootloader/nano-kernel将复制地址为0x9000的二进制文件(稍后可能需要更改,但bootloader/nano-kernel不使用此空间,因此应该没问题)
  • 引导程序在0x9000+4跳转到用户应用程序

Sd卡很容易解决,我在跳跃部分遇到问题。下面是跳转函数的代码。

void run(void) {

  void (*user_code_entry)(void);

  unsigned *p;   
  SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80);

  // Load contents of second word of user flash - the reset handler address
  // in the applications vector table
  p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000

  user_code_entry = (void (*)(void))p;

  // Jump to user application
  user_code_entry();

}

所以我已经编译(我正在使用Keil uvision4)用户应用程序将开始地址更改为0x9000。如果我编程我的板(使用flashmagictool),然后手动跳转(仍然使用flashmagictool)到0x9004(0x9000+4),用户应用程序将运行,所以我相信编译工作正常,所以user-app可以在0x9000运行。

但是,如果我运行bootloader/nano-kernel,这个不会跳转到用户应用程序,不幸的是,因为我无法调试,我不确定发生了什么。..我也试图不使用SD复制部分,所以我首先编程引导加载程序,基本上只是跳转到0x9004。然后我编程将坐在0x9000的用户应用程序。如果我重新启动电路板,bootloader会运行,但不会跳转到user-app。我已经检查了内存,似乎两个程序(bootloader+user-app)都是正确的,并且在正确的位置。

我确信我在这里遗漏了一些东西,是否有任何我应该看的低级代码?我已经在网上阅读了很多文档,从我发现的例子中,他们正在以与我相同的方式跳转到用户代码。..非常感谢你的帮助。

有帮助吗?

解决方案

Cortex M3只能在Thumb模式下运行。因此,你总是要跳到 address +1, ,否则会产生故障。

试试吧:

user_code_entry = (void (*)(void))(USER_FLASH_START +4 +1);

其他提示

只阅读南威记题网站上的AN10866文档。您可以加载PC和堆栈指针,然后跳转到复位中断:

__asm void boot_jump( uint32_t address ){
   LDR SP, [R0]     ;Load new stack pointer address
   LDR PC, [R0, #4] ;Load new program counter address
}

void execute_user_code(void)
{
    /* Change the Vector Table to the USER_FLASH_START 
    in case the user application uses interrupts */
    SCB->VTOR = USER_FLASH_START & 0x1FFFFF80;

    boot_jump(USER_FLASH_START);
}
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top