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

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


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

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



    在设置 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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值