嵌入式-IAP

APP中断向量表重映射(SCB->VTOR)

System Control Block中存在一个向量表偏移量寄存器 VTOR(0xE000ED08),系统产生中断后,内核通过这个寄存器的值来找到中断向量表的地址,进而执行中断例程代码,

首先调用systemInit函数初始化时钟系统,同时systemInit还完成了中断向量表的设置,我们可以打开systemInit函数,看看函数体的结尾处有这样几行代码:

1
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET;

从代码可以理解,VTOR寄存器存放的是中断向量表的起始地址。默认的情况VECT_TAB_SRAM是没有定义,所以执行SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; 对于FLASH APP,我们设置为FLASH_BASE+偏移量0x10000,所以我们可以在FLASH APP的main函数最开头处添加如下代码实现中断向量表的起始地址的重设:

1
SCB->VTOR = FLASH_BASE | 0x10000;

如果是APP2可以设置为SCB->VTOR = FLASH_BASE | 0x20000;

如果是APP3可以设置为SCB->VTOR = FLASH_BASE | 0x30000;

这样,我们就完成了中断向量表偏移量的设置。