我使用爱特梅尔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-模式下运行。
我希望你能帮助我解决这个问题,或者给我一些的窍门是怎么回事错在这里。