最近用GD32F103芯片做了一个boot跳转APP的程序,发给客户的设备发现会有部分(1%)在运行几天或几个月后 ,重启设备boot无法跳转到APP,主程序服务启动起来。boot跳转代码参考的网上很多资料:
/*--------------------绝对地址跳转--------------------*/
void AppJump(INT32U entry_addr)
{
if (((*(volatile INT32U*)entry_addr)& 0x2FFE0000LU)==0x20000000LU)/*STM32堆栈指针SP*/
{
CPU_PTR boot_entry_func;
INT32U boot_jump_addr=*(__IO INT32U*)(entry_addr+4);
INT8U i=0;
boot_entry_func=(CPU_PTR)(boot_jump_addr);
// 关闭所有外设中断
__disable_irq(); //关闭总中断, 在 app 处必须开启
//关闭滴答定时器,恢复到默认值
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
//设置所有时钟到默认状态,使用HSI时钟
RCC_DeInit();
//关闭所有中断,清除所有中断挂起状态
for(i=0;i<8;i++)
{
NVIC->ICER[i]=0xFFFFFFFF;
NVIC->ICPR[i]=0xFFFFFFFF;
}
NVIC_DisableIRQ(USART1_IRQn);
// __set_PSP(*(volatile uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
__set_MSP(*(__IO INT32U*)entry_addr);
boot_entry_func();
}
}
主程序运行后,开启中断,再进行初始化。
由于在公司很难复现,客户出现此问题,需要刷一个不同版本的主程序(即重新编译的)才可以恢复。
目前只是初步判断可能是主程序需要初始化中断向量表以后才能开启中断,不知大家是否有遇到过同样的问题,请各位大佬不吝赐教。
|