求助原子哥关于IAP代码的问题

2019-07-20 11:09发布

官方的IAP跳转如下
else
  {
    /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
    if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      Jump_To_Application();
    }
  }


原子哥的如下
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
                        {         
                                iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
                        }

求助大家红体部分 0x2FFE0000 ) == 0x20000000)    0xFF000000)==0x08000000)
这有什么区别,还有APP地址后面+4是为了向量表吗?谢谢


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
lzq12
1楼-- · 2019-07-21 04:37
zhanminlove 发表于 2017-10-30 09:40
请问一下:
原子哥的代码里
#define FLASH_APP1_ADDR                0x08010000          //第一个应用程序起始地址(存放在FL ...

你这个是要跳转到FLASH里面去的,要改成==0x08000000,因为程序存放在FLASH里面,地址是从0x08000000开始的,如果你的程序是存放在RAM里面,那就是要判断==0x20000000
zhanminlove
2楼-- · 2019-07-21 05:43
lzq12 发表于 2017-11-3 10:47
你这个是要跳转到FLASH里面去的,要改成==0x08000000,因为程序存放在FLASH里面,地址是从0x08000000开始 ...

谢谢回复!
后面我重新理解下 ,觉得可能是没问题的,if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.   ,我把(*(vu32*)appxaddr))这个值 打印出来 发现就是堆栈SP的值0x20000EB8, 就像原子哥的注释里写的判断栈顶地址是否合法, &0x2FFE0000 是因为SRAM大小为64k,
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.   这里FLASH_APP1_ADDR+4 是复位中断向量的地址(*(vu32*)(FLASH_APP1_ADDR+4)) 打印出来是PC指针的值0x0800578C  &0xFF000000==0x08000000,应该就是你说的程序存放在FLASH里面  

一周热门 更多>