ARM Cortex配置中断向量表偏移
在Cortex-M3
和Cortex-M4
处理器中,中断向量表的位置是由VTOR(SCB->VTOR)
中定义的, VTOR
全称Vector Table Offset Register
,即中断向量表偏移寄存器,在嵌入式程序开发中,最开始的中断向量表一般放在Flash
的零地址,这是因为ARM的SP指针和复位地址分别位于0x00
和0x04
地址的原因,当然一般会把其他中断向量表也放到这里,不过在程序运行的时候,因为可能需要修改中断向量表的中断处理函数,所以一般也会将中断向量表在程序初始化的时候拷贝到RAM
中去。本文章就这个中断向量表重新定义偏移的问题做一点探讨。
官方建议
首先我们来看看官方怎么说的,可以看这里, 官方讲到在修改VTOR之后一定要跟一个DSB
指令,这个可不是你想的DSB,而是Data Synchronization Barrier
,只有加了这个指令才能立即使新的中断从新的地址取入口地址。不过这个对于普通用户倒是没什么必要,因为在Cotrex-M3, Cortex-M4, Cortex-M0+
中,访问SCS寄存器组后面默认会有一个DSB。
SCB->VTOR
在我们的Cortex-M3权威指南中,我们来看一下这个寄存器的定义(地址0xE000_ED08
):
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
29 | TBLBASE | RW | 0 | 向量表在Code区(0)还是RAM区(1) |
15 | ENDIANESS | R | - | 向量表起始地址 |
在修改这个寄存器的时候有一定要求,必须先求出系统中共有多少个向量,再把这个数字
向上增大到是 2 的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有 32 个
中断,则共有 32+16(系统异常)=48 个向量,向上增大到 2 的整次幂后值为 64,因此地址
地址必须能被 64*4=256 整除,从而合法的起始地址可以是:0x0, 0x100, 0x200 等。
另外,因为ARM Cortex
系列MCU,寻址范围为4G,其中0x00000000
到0x1FFFFFFF
是CODE
区域, 0x20000000
到0x3FFFFFFF
是SRAM
区域,所以直接将偏移地址写入SCB_VTOR
也可以不用管第29位,因为在地址划分上已经保证了偏移地址所在的区域。
最后更新于 2018-12-07 02:59:27 并被添加「」标签,已有 9912 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。