我正在开发一个Stellaris LM3S1607芯片的引导加载程序。我使用的是Keil MicroVision4 C编译器。这个想法是创建两个独立的固件,其中一个将更新另一个。在firmware1中,我下载了firmware2文件,并将其写入闪存地址0x3200。在此之前,它是有效的。我还验证了数据是否正确写入闪存。现在我在flash中有两个应用程序。一个是我的uip引导加载程序,而seoncd是我的主项目。我想知道如何从第一个程序跳到位于0x3200的第二个程序。
如果有人能帮我跳下去,那就太好了。谢谢
发布于 2013-01-19 03:58:50
这将适用于任何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
}内联汇编程序的语法各不相同;本例是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 ) ;请注意,本例中的APPLICATION_START_ADDR是链接应用程序代码的基址或位置地址(本例中为0x3200),而不是链接映射中指示的入口点。应用程序向量表位于此地址,向量表的开始部分包含应用程序的初始堆栈指针地址和程序计数器(实际代码入口点)。
boot_jump()函数从应用程序的矢量表加载堆栈指针和程序计数器,模拟重置时从闪存基址(引导加载器的矢量表)加载它们时发生的情况。
请注意,您必须在应用程序代码的链接器设置中将起始地址设置为与引导加载程序将复制映像的起始地址相同。如果您使用的是Keil调试器,则在没有引导加载程序的情况下(或者至少在没有手动正确设置SP和PC或使用调试器脚本的情况下),将无法在调试器中加载和运行应用程序,因为调试器加载的是重置矢量地址,而不是应用程序矢量地址。
在切换向量表之前禁用中断是很重要的,否则在应用程序初始化之前发生的任何中断都会向量到应用程序的处理程序,而这可能还没有准备好。
请注意应用程序和引导代码中使用的任何外设,如果外设寄存器已由引导代码设置,则有关复位条件的任何假设可能不成立。
https://stackoverflow.com/questions/14393715
复制相似问题