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条回答
Kinglkf2R
2019-07-25 10:47
正点原子 发表于 2015-4-29 23:16
回复【25楼】哈根斯坦:
---------------------------------
看《CM3权威指南》

在学习IAP编程时候对于APP程序执行中断时候有一点疑问
在图中的圈4步骤     APP程序发生中断时候调到原始中断表




点我在看M3权威指南时候有个关于建立新中断向量表的内容




我的理解是  对于一个APP程序  它的中断服务函数的入口地址在编译之后是固定的      不一样的是要将这个入口地址填入到中断向量表的对应位置   

既然是APP程序  那么它的中断向量表位置相对BootLoader程序有一个偏移地址    称之为新中断向量表    那么现在的问题就是将APP的中断服务函数入口地址填入的新中断向量表中  

这个时候  就需要更具中断向量表的偏移地址来计算      首先算出新表的起始地址    在计算新表中的第几项   确定之后将地址填入   

按照这个过程  APP程序发生中断时候要找中断向量只能去新表中找   而在旧表中是找不到的     所以图中的圈4应该直线灰 {MOD}的新中断表   


如果去旧表中去找  那移位着BootLoader程序的中断向量被APP程序覆盖    那么BootLoader程序只能执行一次   下册执行会出错

一周热门 更多>