ARM Cortex配置中断向量表偏移

Cortex-M3Cortex-M4处理器中,中断向量表的位置是由VTOR(SCB->VTOR)中定义的, VTOR全称Vector Table Offset Register,即中断向量表偏移寄存器,在嵌入式程序开发中,最开始的中断向量表一般放在Flash的零地址,这是因为ARM的SP指针和复位地址分别位于0x000x04地址的原因,当然一般会把其他中断向量表也放到这里,不过在程序运行的时候,因为可能需要修改中断向量表的中断处理函数,所以一般也会将中断向量表在程序初始化的时候拷贝到RAM中去。本文章就这个中断向量表重新定义偏移的问题做一点探讨。

官方建议

首先我们来看看官方怎么说的,可以看这里, 官方讲到在修改VTOR之后一定要跟一个DSB指令,这个可不是你想的DSB,而是Data Synchronization Barrier,只有加了这个指令才能立即使新的中断从新的地址取入口地址。不过这个对于普通用户倒是没什么必要,因为在Cotrex-M3, Cortex-M4, Cortex-M0+中,访问SCS寄存器组后面默认会有一个DSB。

SCB->VTOR

在我们的Cortex-M3权威指南中,我们来看一下这个寄存器的定义(地址0xE000_ED08):

位段名称类型复位值描述
29TBLBASERW0向量表在Code区(0)还是RAM区(1)
15ENDIANESSR-向量表起始地址

在修改这个寄存器的时候有一定要求,必须先求出系统中共有多少个向量,再把这个数字
向上增大到是 2 的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有 32 个
中断,则共有 32+16(系统异常)=48 个向量,向上增大到 2 的整次幂后值为 64,因此地址
地址必须能被 64*4=256 整除,从而合法的起始地址可以是:0x0, 0x100, 0x200 等。

另外,因为ARM Cortex系列MCU,寻址范围为4G,其中0x000000000x1FFFFFFFCODE区域, 0x200000000x3FFFFFFFSRAM区域,所以直接将偏移地址写入SCB_VTOR也可以不用管第29位,因为在地址划分上已经保证了偏移地址所在的区域。

发表新评论