我在Atmel SAM4E-EK主板上使用Atmel SAM4E-16e。我为这个配置写了一个bootloader。 引导加载程序通过UART接收.bin-File并将其写入Flash。这没有问题,我做了一个hex-dump,这正是我所期待的:
这是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模式运行。
我希望你能帮助我解决这个问题,或者告诉我一些问题。
答案 0 :(得分:2)
此代码假定在地址0x420000处加载的程序以向量表开头:
为此,代码似乎完全正确。
但你确定这个向量表是正确的吗?是否将0x420004处的数据位0设置为Thumb代码?编译此代码时,它是否知道它将从此地址运行(对于它可能使用的任何绝对地址)。您是否可以使用调试器来了解第一个故障何时发生?
我认为您应该提供您尝试在此地址加载的程序的第一条指令的解释。
答案 1 :(得分:2)
我现在已经解决了这个问题。 我仍然使用我在问题中发布的代码。问题是我在我的处理器闪存0x420000上写的.bin文件是以它认为处于闪存起始地址(0x400000)的方式编译的。 当它加载了复位向量的地址时,它位于0x400xyz而不是0x420xyz,因此应用程序跳转到错误的地址。
解决方案是在我想通过bootloader上传的项目中将Flash起始地址更改为0x420000。