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条回答
京剧娃娃
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个外部中断(互联型)

一周热门 更多>