IAP注意事项
1.option设置
app项目中设置如下。主程序加上SCB->VTOR = FLASH_BASE | 0x5000; /* Vector Table Relocation in Internal FLASH. */
FUCK!!!!
SystemInit();会把SCB->VTOR重新设置为0x8000000,注意他们的执行先后顺序,教训啊,搞 了整整一小时,回滚程序,最好不要调用SystemInit()了,因为他已经在main之前执行过了




BOOTLOADER设置如下。



bootloader跳转代码: #define ApplicationAddress ((uint32_t)0x08003000U) typedef void (*pFunction)(void); pFunction Jump_To_Application; uint32_t JumpAddress = 0; if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) //ApplicationAddress为新程序的起始地址,检查栈顶地址是否合法,即栈顶地址是否为0x2000xxxx(内置SRAM) { JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); //用户代码区第二个字存储为新程序起始地址(新程序复位向量指针) Jump_To_Application = (pFunction) JumpAddress; __set_MSP(*(__IO uint32_t*) ApplicationAddress); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址) Jump_To_Application(); //设置PC指针为新程序复位中断函数的地址 }

浙公网安备 33010602011771号