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指针为新程序复位中断函数的地址
}

 

posted @ 2018-05-29 18:51  =没有编程天赋=  阅读(335)  评论(1)    收藏  举报