Cortex M4的Bootloader - 跳转到加载的应用程序

时间:2016-05-02 13:18:46

标签: arm bootloader atmel cortex-m

我在Atmel SAM4E-EK主板上使用Atmel SAM4E-16e。我为这个配置写了一个bootloader。 引导加载程序通过UART接收.bin-File并将其写入Flash。这没有问题,我做了一个hex-dump,这正是我所期待的:

  • 引导加载程序位于0x400000(AT SAM4E的闪存起始地址)
  • 我的应用程序位于0x420000
  • 0x800000是Flash结束地址

这是C代码:

int main(void){
     // Init and downloading the .bin to Flash
     binary_exc((void*) 0x420000);
}



int binary_exec(void * vStart){
    int i;
    // -- Check parameters
    // Should be at least 32 words aligned
    if ((uint32_t)vStart & 0x7F)
    return 1;

    Disable_global_interrupt();
    // Disable IRQs
    for (i = 0; i < 8; i ++) NVIC->ICER[i] = 0xFFFFFFFF;
    // Clear pending IRQs
    for (i = 0; i < 8; i ++) NVIC->ICPR[i] = 0xFFFFFFFF;

    // -- Modify vector table location
    // Barriars
    __DSB();
    __ISB();
    // Change the vector table
    SCB->VTOR = ((uint32_t)vStart & SCB_VTOR_TBLOFF_Msk);
    // Barriars
    __DSB();
    __ISB();

    Enable_global_interrupt();

    // -- Load Stack & PC
    _binExec(vStart);
    return 0;
}

void _binExec (void * l_code_addr){
    __asm__ ("mov   r1, r0        \n"
    "ldr   r0, [r1, #4]  \n" //I also tryed #5 but that doesn't work, too
    "ldr   sp, [r1]      \n"
    "blx   r0"
    );
}

但是当我尝试跳转到我的应用程序时,应用程序无法启动。 跳转到该程序的代码不是用于SAM8X(Cortex M3)的Atmel的示例。调试器有时说PC会跳转到另一个地址(0x004003E2),但不会继续。

我找到了旧主题Bootloader for Cortex M3,其中解决方案只是添加一个,但这对我不起作用,即使我使用了他们的代码。然后调试器不再响应。

我正在使用带有GCC的Atmel Studio 7。处理器以Thumb模式运行。

我希望你能帮助我解决这个问题,或者告诉我一些问题。

2 个答案:

答案 0 :(得分:2)

此代码假定在地址0x420000处加载的程序以向量表开头:

  • SP在偏移0(0x420000)
  • 重置偏移量为4的地址(0x420004)。

为此,代码似乎完全正确。

但你确定这个向量表是正确的吗?是否将0x420004处的数据位0设置为Thumb代码?编译此代码时,它是否知道它将从此地址运行(对于它可能使用的任何绝对地址)。您是否可以使用调试器来了解第一个故障何时发生?

我认为您应该提供您尝试在此地址加载的程序的第一条指令的解释。

答案 1 :(得分:2)

我现在已经解决了这个问题。 我仍然使用我在问题中发布的代码。问题是我在我的处理器闪存0x420000上写的.bin文件是以它认为处于闪存起始地址(0x400000)的方式编译的。 当它加载了复位向量的地址时,它位于0x400xyz而不是0x420xyz,因此应用程序跳转到错误的地址。

解决方案是在我想通过bootloader上传的项目中将Flash起始地址更改为0x420000。