前言:
首先我们知道,中断向量表是可以重定位的:由NVIC中VTOR寄存器控制。
而这个重定位的地址是有要求的,不能随便找个地址放中断向量表,这个地址对齐要求就叫“中断向量表的二次幂对齐”。
“中断向量表的二次幂对齐”指的是 中断向量表对 偏移量大小 的要求 ,在进行中断向量表偏移时,需要向上圆整,否则会出错。
偏移量大小 计算方法:
(内部异常+外部中断个数)×4 就是异常和中断所占的字节数,在字节数的上方 寻找离字节数最近的2的幂数。
计算过程:
以 STM32F411CEU6 为例,内部异常有16个,外部中断有87个,加一起103个,每个中断向量为 4 个字节,那么偏移量初步计算为 103 × 4= 412 ,在 412 之上,距离412 最近的 2 的幂数为 2 的 9次方 512,所以偏移量取 512.
512 转化为 16 进制 为 200,转化为地址就是 0x200。
得出结论:
在 STM32F411CEU6 中,如果中断向量表需要偏移到其他位置,那么这个位置必须是能够被 0x200 整除的。
补充:在STM32F411的平台上,中断向量表偏移地址,必须是512的倍数(The minimum alignment is 128 words),参考下图。同时,VTOR的低9位必须是0(bits[8:0] of the table offset are always zero)。