初级会员

- 积分
- 93
- 金钱
- 93
- 注册时间
- 2017-5-5
- 在线时间
- 49 小时
|
按照网上的说明BOOTLoader中关闭了中断,APP中修改了向量,但是还是无法跳转,然后直接将修改向量后的APP下载能直接运行,这样对吗?
BOOTLoader程序
#define FLASH_APP1_ADDR 0x08020000
void DisableAllNVIC(void)
{
int i=0;
for( i=19; i < 59; i++)
{
NVIC->ICER[i >> 0x05] =(unsigned int )0x01 << (i & (unsigned char)0x1F);
}
}
void DisableAllGPIO(void)
{
GPIO_InitTypeDef gpio_init;
gpio_init.GPIO_Pin = 0xffff;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &gpio_init);
GPIO_Init(GPIOB, &gpio_init);
GPIO_Init(GPIOC, &gpio_init);
GPIO_Init(GPIOD, &gpio_init);
GPIO_Init(GPIOE, &gpio_init);
GPIO_Init(GPIOF, &gpio_init);
GPIO_Init(GPIOG, &gpio_init);
}
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
DisableAllNVIC();
DisableAllGPIO();
__ASM("CPSID I");
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{
// Display_String(2,1,"执行新系统");
// __asm("CPSID I");
// GPIO_DeInit(GPIOA);GPIO_DeInit(GPIOB);GPIO_DeInit(GPIOC);GPIO_DeInit(GPIOD);GPIO_DeInit(GPIOE);GPIO_DeInit(GPIOF);GPIO_DeInit(GPIOG);
// __disable_irq();
__set_FAULTMASK(1);
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}
APP程序
SCB->VTOR = FLASH_BASE | 0x20000; /* Vector Table Relocation in Internal FLASH. */
// NVIC_Configuration();
__asm("CPSIE I");
__enable_irq();
// __set_FAULTMASK(0);
system1_init();
BOOTloader程序能正常进入,但是跳转到APP中无任何响应。急求
|
-
|