官方的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是为了向量表吗?谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你这个是要跳转到FLASH里面去的,要改成==0x08000000,因为程序存放在FLASH里面,地址是从0x08000000开始的,如果你的程序是存放在RAM里面,那就是要判断==0x20000000
谢谢回复!
后面我重新理解下 ,觉得可能是没问题的,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里面
一周热门 更多>