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是怎样得来的呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
向量表偏移量寄存器,也就是SCB->VTOR:31位,30位保留,它的第29位,用来标识向量表是在CODE区还是RAM区,从而0X1,就是最高3位不去动,0-6位为保留位需要清零,所以要同0x1FFFFF80(0001 1111 1111 1111 1111 1111 1000 0000)与(&),保证最高3位,和低7位为0;中间7-28位是地址偏移,这个地址有个要求:(必须先求出系统中共有多少个向量,再把这个数字向上增大到是2 的整次幂,而起始地址必须对齐到后者的边界上。如:STM32自己有60个中断,加上CM3的16个,总共有76个中断,扩大到2的整次幂,那就是128,然后再乘以4,得到512,也就是0X200.根据这样计算,合法的偏移地址应该是0X0,0X200,0X400,0X600... )。
PS:
1.地址偏移的要求是用户在设定时需要另外考虑的(比如上例中,设定的地址需要是0X200的倍数),跟&0x1FFFFF80没有关系;
2.关于为什么乘以4,应该是每个32位的地址占四个字节吧。
3.要保证整除0x200就要去掉小于0x200的余数,所以&0X1FFF FE00后就能保证得出的数可以整除0x200。
楼主帮忙看看你们要表达的是不是这个意思。
一周热门 更多>