Bootloader的用于Cortex M4 - 跳转到装载的应用(Bootloader for

2019-09-27 16:19发布

我使用爱特梅尔SAM4E-EK董事会爱特梅尔SAM4E-16E。 我写这个配置的引导程序。 引导加载程序通过UART接收.bin文件,文件,并将其写入到Flash中。 这工作没有任何问题,我犯了一个十六进制转储,它正是我所期望的:

  • 的0x400000(AT SAM4E的闪存起始地址)的Bootloader
  • 我在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(皮质M3)爱特梅尔的例子的。 调试器有时会说,它的PC跳转到另一个地址(0x004003E2)来代替,但不下去了。

我发现老话题用于Cortex M3的Bootloader那里解决办法是只需添加一个但这并不为我工作,即使我使用自己的代码。 然后,调试器不响应了。

我采用Atmel Studio的7与海湾合作委员会。 该处理器在Thumb-模式下运行。

我希望你能帮助我解决这个问题,或者给我一些的窍门是怎么回事错在这里。

Answer 1:

此代码假定在地址加载该程序0x420000用量表开始:

  • SP在偏移0(0x420000)
  • 复位地址偏移量4(0x420004)。

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

但你肯定这量表是正确的? 在0x420004的数据位设置为0,因为这是Thumb代码? 当你编译这段代码,是不是知道它会从这个地址(它可能使用任何绝对地址)上运行。 你必须使用一个调试器,当第一个故障发生时了解的可能性?

我想你应该提供您尝试在此地址加载程序的第一个指令disass。



Answer 2:

我现在已经解决了这个问题。 我还是用我张贴在我的问题的代码。 问题是,中的.bin文件我写我的处理器在0x420000闪光是在一种方式,它认为这是在闪存起始地址(为0x400000)编译。 当它加载的复位向量地址是在0x400xyz代替0x420xyz因此应用程序跃升到了错误的地址。

解决的办法是在我想通过引导程序即可上传项目的闪存的起始地址改为0x420000。



文章来源: Bootloader for Cortex M4 - Jump to loaded Application