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是怎样得来的呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
在学习IAP编程时候对于APP程序执行中断时候有一点疑问
在图中的圈4步骤 APP程序发生中断时候调到原始中断表
点我在看M3权威指南时候有个关于建立新中断向量表的内容
我的理解是 对于一个APP程序 它的中断服务函数的入口地址在编译之后是固定的 不一样的是要将这个入口地址填入到中断向量表的对应位置
既然是APP程序 那么它的中断向量表位置相对BootLoader程序有一个偏移地址 称之为新中断向量表 那么现在的问题就是将APP的中断服务函数入口地址填入的新中断向量表中
这个时候 就需要更具中断向量表的偏移地址来计算 首先算出新表的起始地址 在计算新表中的第几项 确定之后将地址填入
按照这个过程 APP程序发生中断时候要找中断向量只能去新表中找 而在旧表中是找不到的 所以图中的圈4应该直线灰 {MOD}的新中断表
如果去旧表中去找 那移位着BootLoader程序的中断向量被APP程序覆盖 那么BootLoader程序只能执行一次 下册执行会出错
一周热门 更多>