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

Arm LPC1768加载应用程序到新内存偏移量,arm,cortex-m3,keil,Arm,Cortex M3,Keil,问题:-如何将应用程序定位到非0x0000.0000地址? 处理器:NXP LPC1768 开发系统:Keil ARM 4.73 使用的步骤: 1) 下面的散点文件用于将加载区域和执行区域设置为0x0000.2000 2) 已将向量表复制到0x2000 3) 将vtor寄存器设置为0x2000 问题:应用程序未运行 Scatter file used: LR_IROM1 0x00002000 0x00000D000 { ; load region size_region ER_

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

使用的步骤: 1) 下面的散点文件用于将加载区域和执行区域设置为0x0000.2000 2) 已将向量表复制到0x2000 3) 将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)
  }
}

这遵循NXP应用程序说明AN10744中指定的说明,我还缺少什么?

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

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

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

引导加载程序需要:

  • 确保中断已禁用,以免意外使用VTOR
  • 将VTOR寄存器更新为地址
    0x2000
  • 0x2000
    获取堆栈指针地址并更新堆栈指针寄存器
  • 0x2004
    获取程序开始地址并更新程序计数器
  • 您可能想查看CMSIS库,它具有类似于
    NVIC\u SetVTOR
    \u set\u MSP
    的功能,这使设置这些寄存器变得更容易

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

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