如何在Stellaris中的程序之间跳转

Shi*_*hab 5 c embedded bootloader keil

我正在为Stellaris LM3S1607芯片开发一个引导加载程序.我正在使用Keil MicroVision4 C编译器.我们的想法是创建2个独立的固件,一个将更新另一个.在firmware1中,我下载了firmware2文件,并将其写入地址0x3200的闪存中.直到这里它才有效.我还验证了数据写入闪存是否正确.现在我在flash中有两个应用程序.一个是我的uip引导装载程序,而seoncd就是我的主要项目.我想知道如何从第一个程序跳转到位于0x3200的第二个程序.

如果有人能帮我跳,那就太好了.谢谢

Cli*_*ord 2

这适用于任何 Cortex-M 部件...

创建一个汇编函数,例如:

__asm void boot_jump( uint32_t address )
{
   LDR SP, [R0]       ;Load new stack pointer address
   LDR PC, [R0, #4]   ;Load new program counter address
}
Run Code Online (Sandbox Code Playgroud)

内联汇编器语法各不相同;这个例子是Keil ARM-MDK / ARM RealView。

然后在引导加载程序的末尾:

// Switch off core clock before switching vector table
SysTick->CTRL = 0 ;

// Switch off any other enabled interrupts too
...

// Switch vector table
SCB->VTOR = APPLICATION_START_ADDR ;

//Jump to start address
boot_jump( APPLICATION_START_ADDR ) ;
Run Code Online (Sandbox Code Playgroud)

请注意,本例中的 APPLICATION_START_ADDR 是链接的应用程序代码的基址或位置地址(本例中为 0x3200),而不是链接映射中指示的入口点。应用程序向量表位于该地址,向量表的开头包含应用程序的初始堆栈指针地址和程序计数器(实际的代码入口点)。

boot_jump()函数从应用程序的向量表中加载堆栈指针和程序计数器,模拟复位时从闪存基础(引导加载程序的向量表)加载它们时发生的情况。

请注意,您必须将应用程序代码的链接器设置中的起始地址设置为与引导加载程序将复制映像的起始地址相同。如果您使用 Keil 调试器,则在没有引导加载程序的情况下,您将无法在调试器中加载和运行应用程序(或者至少在没有正确手动设置 SP 和 PC 或使用调试器脚本的情况下),因为调试器会加载重置向量地址而不是应用程序向量地址。

在切换向量表之前禁用中断非常重要,否则在应用程序初始化之前发生的任何中断都将向量到应用程序的处理程序,并且该处理程序可能尚未准备好。

请小心在应用程序和引导代码中使用的任何外设,如果外设寄存器已由引导代码设置,则有关复位条件的任何假设都可能不成立。