NXP

LPC11Uxx系列 中断向量表重映射

2019-07-12 12:56发布

   一般来说,任何IAP+APP升级程序都必须进行中断向量表重映射,因为默认情况下单片机上电后中断向量都是指向0x0000 0000地址处的,而使用使用IAP+APP的方式编程时,当进入APP程序入口时,APP已经不指向0x0000 0000处了,所以如果不进行中断向量表映射,当应用程序产生中断却找不到中断服务函数的入口地址,就没有办法处理中断。       对于Cortex-M2/3等芯片,是有Flash重映射功能的,即将中断向量表的地址重新映射到Flash中存APP程序的起始512个字节即可,设置VTOR这个寄存器即可。但是Cortex-M0芯片并没有Flash重映射功能,而只有一个重映射寄存器设置读取异常向量的位置,所以必须相应地将中断向量表映射到RAM中,当然映射之前需要将APP程序的中断向量表复制到RAM的前512个字节中。 在LPC11Uxx用户手册中,有这么一段:      系统存储器重映射寄存器选择是从Boot ROM、闪存还是SRAM 读取异常向量。默认情况下,闪存映射到地址0x0000 0000。当SYSMEMREMAP 寄存器的MAP 位设为0x0 或0x1时, Boot ROM 或RAM 将分别映射到存储器映射(地址0x0000 0000 至0x0000 0200)的底部512 字节。      0x0 引导加载程序模式。中断向量重映射到Boot ROM。
     0x1 用户RAM 模式。中断向量重映射到静态RAM。
     0x2 用户闪存模式。中断向量不会被重映射,一直位于闪存中。
   这就提供了一个改变0x0处中断向量表内容但又不需要对其进行重新擦除写入的方法:我们可以将APP程序起始地址开始的512字节内容先复制到SRAM(起始地址是0x10000000)中,然后设置重映射寄存器的值为0x1,让中断向量表重映射到RAM中,程序执行时就能取到APP程序的中断向量表了。然而,实际Debug时也能看到,当进行重映射后,0x0处开始的512字节数据就跟RAM区开始的512字节数据一样了(具体原因暂时不知晓),这样就完成了中断向量表的映射。映射而不是对其擦写也能防止在升级过程中掉电导致boot也无法启动的情况。