11

我正在使用 mbed 的 LPC 1768 板(使用 cortex M3 cpu),我想在这里实现一些目标,主要是从 SD 卡升级用户应用程序,我正在编写两个程序,首先是引导加载程序/纳米内核,然后一个用户应用程序(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),用户应用程序将运行,所以我相信编译工作正常,因此用户应用程序可以在 0x9000 运行。

但是如果我运行引导加载程序/纳米内核,这个不会跳转到用户应用程序,不幸的是我无法调试,我不确定发生了什么......我也试过不使用 SD 副本部分,所以我首先对引导加载程序进行编程,基本上只是跳转到 0x9004。然后我对位于 0x9000 的用户应用程序进行编程。如果我重新启动开发板,引导加载程序会运行但不会跳转到用户应用程序。我检查了内存,似乎两个程序(引导加载程序 + 用户应用程序)都是正确的并且在正确的位置。

我确定我在这里遗漏了一些东西,我应该查看任何低级代码吗?我已经阅读了在线文档的音调,并且从我找到的示例中,他们以与我相同的方式跳转到用户代码......非常感谢您的帮助。

4

2 回答 2

8

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

你试一试:

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

于 2012-10-03T23:33:40.213 回答
4

只需阅读 NXP 网站上的 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);
}
于 2013-05-22T07:11:51.067 回答