STM32F207启动跳转IAP
实现IAP跳转需要的设置内容
IAP程序的设置
1 中断向量表
2 MSP
3 PC
APP程序的设置
1 中断向量表
2 ROM地址
IAP代码
3种C的跳转方式
//#1
typedef struct APP_INFO{
void (*Application)(void);
}APP_INFO;
APP_INFO app_info;
//#2
typedef void (*Application)(void) ;
Application pApplication;
//#3
void (*Application2)(void) ;
跳转代码
void Jump_To_App(uint32_t addr){
uint32_t* appAddr;
appAddr = addr;
if(((*appAddr)& 0x2FFE0000 ) == 0x20000000){//good 0X20000000 - 0X2001FFFF
SCB->VTOR = addr;//设置中断向量表地址
__set_MSP(*appAddr);//设置MSP
//IAP跳转#1
// app_info.Application = *(appAddr+1);
// app_info.Application();
//IAP跳转#2
pApplication = *(appAddr+1);//设置跳转地址
pApplication();//设置PC跳转
//IAP跳转#3
// Application2 = *(appAddr+1);
// Application2();
}
}
注意的问题:函数内声明的变量的赋值在改变MSP后赋值改变。所以要么声明为全局变量,要么在改变MSP后再赋值。
APP程序的设置
1 中断向量表 system_stm32f2xx.c
#define VECT_TAB_OFFSET 0x00 //设置为烧写ROM的地址偏移量
void SystemInit(void)
{
.....
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
.....
}
2 ROM地址(注意擦写sector的分配)