stm32单片机中断向量偏移地址设置时的对齐要求

来源:互联网 发布:淘宝上的壮阳药 编辑:程序博客网 时间:2024/06/05 15:26
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是怎样得来的呢?

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<<权威指南>>第一百零四页,有这么一段话:
    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;这点,我也有疑问.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

按上面的算法,好像也挺对的,Offset&0X1FFF FF80 
Offset:是偏移量的计算 
也就是说STM32自己有60个中断,加上CM3的16个,总共有76个中断,扩大到2的整次幂,那就是128,然后再乘以4,得到512,也就是0X200.根据这样计算,合法的偏移地址应该是0X0,0X200,0X400,0X600,0x800...... 
29 TBLBASE R/W 0 Table base in Code (0) or RAM (1)  
28:7 TBLOFF R/W 0 Table offset value from Code region or RAM region  

屏蔽前七位0x1FFFFF80和后三位+Offset + VECTTOR就是开始地址

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我觉得原子大哥的"&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 Programming 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 Programming manual Rev4" & "Reference manual_Rev13"(ST官方发布)这是产品实现,范围最小,定位到特定系列产品.....(III) 

以一个例子为例: 
(I)中理论框架支持多大496个外部中断 
(II)中技术构架240个外部中断 
(III)中产品实现68个外部中断(互联型)

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

转自:http://www.openedv.com/posts/list/392.htm


0 0
原创粉丝点击