EFM32G(Cortex-M3 内核)NVIC 向量表偏移配置

    中断向量表(Vector Table)中包含了堆指针(Stack Pointer)的初始值,以及异常、中断处理函数的入口地址表,如下图所示:

EFM32G(Cortex-M3 内核)NVIC 向量表偏移配置_第1张图片

    系统复位时,中断向量表的起始存储地址为 0x00000000。在特权模式下(Privileged Mode),程序可以通过 VTOR 寄存器将中断向量表分配到其他地址空间(0x00000080 ~ 0x3FFFFF80)。

    VTOR 寄存器(中断向量表偏移寄存器,Vector Table Offset Register)隶属于系统控制块(SCB,System Control Block)。VTOR 寄存器定义了中断向量表的基地址相对于0x00000000 地址的偏移量,如下图所示:

EFM32G(Cortex-M3 内核)NVIC 向量表偏移配置_第2张图片

EFM32G(Cortex-M3 内核)NVIC 向量表偏移配置_第3张图片

    在设置 VTOR 时,要求偏移量必须对齐 2 的整数次幂(offset = M * align,align = 2^N),并且 offset 不小于中断向量数目。假设 IRQ 数目为 n,则中断向量数目为 n+16(Cortex-M3 包含 16 个内部异常)。通常可以设置 align = 64 WORDs,这样可以覆盖所有的内、外异常;如果 n 不超过 16,那么 n+16 不超过 32,可以设置 align = 32 WORDs。可见 align 的最小值为 32 WORDs,因此 VTOR 寄存器的 b[6:0] 为保留字段,固定为 0。

    Cortex-M3 的寻址范围为 4G,其中 0x00000000 ~ 0x1FFFFFFF 为 CODE 区域,0x20000000 ~ 0x3FFFFFFF 为 SRAM 区域。因此 b[29] 为 0 时,表示将向量表放置在 CODE 区域,b[29] 为 1 时,表示放置在 SRAM 区域。

可以定义如下函数,完成向量表偏移配置:

/***************************************************************************//**
 * @brief
 *   Set the allocation and offset of the vector table
 *
 * @details
 *
 * @note
 *
 * @param[in] NVIC_VectTab
 *   Indicate the vector table is allocated in RAM or ROM
 *
 * @param[in] Offset
 *   The vector table offset
 ******************************************************************************/
static void NVIC_SetVectorTable(
	uint32_t NVIC_VectTab,
	uint32_t Offset)
{
	/* Check the parameters */
	assert(IS_NVIC_VECTTAB(NVIC_VectTab));
	assert(IS_NVIC_OFFSET(Offset));

	SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
}

你可能感兴趣的:(EFM32G(Cortex-M3 内核)NVIC 向量表偏移配置)