NVIC的向量表偏移寄存器设置问题(已解决)

2019-07-20 23:51发布

void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset) 
{
   //检查参数合法性
 assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
 assert_param(IS_NVIC_OFFSET(Offset));   
 SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器
 //用于标识向量表是在CODE区还是在RAM区
}

问个问题,为什么(Offset & (u32)0x1FFFFF80)  为什么使用0x1FFFFF80,0x1FFFFF80是怎样得来的呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
38条回答
京剧娃娃
1楼-- · 2019-07-21 03:28
回复【11楼】正点原子:
---------------------------------
回复【9楼】kenluo:
---------------------------------
我觉得原子大哥的"&0X1FFF FE00"更确切一些。
原因如下:
在 "ARMv7-M Architecture Application Level Reference Manual(November 2010)" 的716页给出的VTOR定义为:
[31:7]——Bits [31:7] of the vector table address
[6:0]  ——Reserved.
(这里不是[29:7]的原因在 "Cortex-M3 Technical Reference Manual.r2p1" 的24页"The Vector Table Offset Register located at address 0xE000ED08 has been increased by two bits from 29:7 to 31:7",也就是r2p1版本升级扩展了两位,不过仍然向后兼容:"One or two of the high-order bits of the TBLOFF field can be implemented as 
RAZ/WI, reducing the supported address range. For example, if two bits are implemented as RAZ/WI, then TBLOFF[29:7] defines bits [29:7] of the address")

也就是说ARM官方r2p0的定义:[31:30]保留,[29]作为TBLBASE判别标准屏蔽,[6:0]保留,如此一来得到&0X1FFF_FF80;

而对于ST官方的定制而言,在"PM0056 rogramming manual Rev4"的134页 给出的定制为:
"[31:30] Reserved, must be kept cleared"
"TBLOFF[29:9]: Vector table base offset field"
"Bits 8:0Reserved, must be kept cleared"
也就是说ST把[8:7]也给保留了,原因就是楼上kenluo所说的。
这种情况下按ST官方的定制::[31:30]保留,[29]作为TBLBASE判别标准屏蔽,[8:0]保留,如此一来得到&0X1FFF_FE00,就是原子大哥的解释。

我学STM32的过程中觉得看手册一点很重要,就是区分各个官方手册的等级:
"ARMv7-M Architecture Application Level Reference Manual(November 2010)" (ARM官方发布) 这是理论框架,涵盖范围最广..........(I)
"Cortex-M3 Technical Reference Manual.r2p1" (ARM官方发布) 这是技术构架,涵盖范围次之.........................................................(II)
"PM0056 rogramming manual Rev4" & "Reference manual_Rev13"(ST官方发布)这是产品实现,范围最小,定位到特定系列产品.....(III)

以一个例子为例:
(I)中理论框架支持多大496个外部中断
(II)中技术构架240个外部中断
(III)中产品实现68个外部中断(互联型)
正点原子
2楼-- · 2019-07-21 09:19
     在<<权威指南>>第一百零四页,有这么一段话:
    NVIC 中有一个寄存器,称为“向量表偏移量寄存器”(在地址0xE000_ED08 处),通过修改它的值就能定位向量表。但必须注意的是:向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字向上增大到是2 的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有32 个中断,则共有32+16(系统异常)=48 个向量,向上增大到2 的整次幂后值为64,因此地址
地址必须能被64*4=256 整除,从而合法的起始地址可以是:0x0, 0x100, 0x200 等。
    向量表偏移量寄存器,也就是SCB->VTOR.它的第29位,用来标识向量表是在CODE区还是RAM区,从而0X1,就是最高3位不去动,这好理解.   但是低位,根据上面这段话的理解,STM32自己有60个中断,加上CM3的16个,总共有76个中断,扩大到2的整次幂,那就是128,然后再乘以4,得到512,也就是0X200.根据这样计算,合法的偏移地址应该是0X0,0X200,0X400,0X600... 因此,在此处应该&0X1FFF FE00.才对.
    以上是我的理解.实际上确是&0X1FFF FF80;这点,我也有疑问.
    

kenluo
3楼-- · 2019-07-21 13:16
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-07-21 13:19
回复【3楼】kenluo:
-------------------------------
没看到....你找到答案了,告诉我一下,呵呵.
kenluo
5楼-- · 2019-07-21 18:14
cortex-m3权威指南上介绍 bit 28-7为向量表的起始地址,位29决定向量表在code区还是在ram区
是不是和这个有关?
正点原子
6楼-- · 2019-07-21 21:17
 精彩回答 2  元偷偷看……

一周热门 更多>