中断向量表偏移寄存器配置方式

对于「引导程序+应用程序」之类的方案,我们通常是在系统初始化函数(SystemInit())中配置中断向量表偏移寄存器来实现中断向量表的重定向。但是这种直接修改官方库的方式往往会给后期的版本管理带来诸多不便。基于此,本文给出一个替代方案,供诸位参考。

vtor.c
#include "xxx32xxxx.h"

#define VECTOR_TABLE_OFFSET ((uint32_t)0x00018000) /* % 0x200 == 0 */

#define ROM_BASE ((uint32_t)0x08000000)
#define RAM_BASE ((uint32_t)0x20000000)

void SystemVTOR(void)
{
#ifdef EXECUTE_IN_RAM
SCB->VTOR = RAM_BASE | VECTOR_TABLE_OFFSET;
#else
SCB->VTOR = ROM_BASE | VECTOR_TABLE_OFFSET;
#endif
}
startup_xxx32xxxx.s
Reset_Handler   PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemVTOR
IMPORT SystemInit
IMPORT __main

LDR R0, =SystemVTOR
BLX R0
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP