LPC1768加载应用程序到新的内存偏移量

时间:2014-04-14 21:07:20

标签: arm cortex-m3 keil

问题: - 如何将应用程序定位到非0x0000.0000地址? 处理器:恩智浦LPC1768 开发系统:Keil ARM 4.73

使用的步骤: 1)下面的分散文件用于将加载区和执行区设置为0x0000.2000 2)将向量表复制到0x2000 3)udpated vtor注册到0x2000

问题:应用程序无法运行。

Scatter file used:
LR_IROM1 0x00002000 0x00000D000     
{   ; load region size_region
  ER_IROM1 0x00002000 0x0000D000    
  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x10000000 0x00008000    {   ; RW data
   .ANY (+RW +ZI)
  }
}

这遵循恩智浦应用笔记AN10744中指定的说明,我还缺少其他内容?

1 个答案:

答案 0 :(得分:1)

向量表偏移寄存器(VTOR)在复位时指向0x00000000。 因此,堆栈指针必须位于0x00000000,程序起始地址(程序计数器)位于0x00000004

如果在链接器设置中更改向量表的位置,则需要更新VTOR以指向此新位置。这只能在运行时发生。

这意味着您需要一个小的引导加载程序来执行重映射,这意味着必须为此目的保留第一个扇区。

Bootloader需要:

  1. 确保禁用中断,因此您不会意外使用VTOR。
  2. 将VTOR寄存器更新为地址0x2000
  3. 0x2000获取堆栈指针地址并更新堆栈指针寄存器。
  4. 0x2004获取程序起始地址并更新程序计数器。
  5. 您可能想要查看CMSIS库,它具有NVIC_SetVTOR__set_MSP等功能,可以让这些寄存器更容易设置。

    要设置程序计数器,可以将地址转换为函数指针,然后调用函数:

    uint32_t * vtor = (uint32_t *)0x2000;
    uint32_t startAddr = vtor[1];
    ( (void(*)(void))startAddr )(); // Cast and call