[C] 纯文本查看 复制代码 void JumpToApp(uint32_t AppAddr)
{
void (*AppJump)(void); /* 声明一个函数指针 */
/* 关闭全局中断 */
DISABLE_INT();
/* 设置所有时钟到默认状态,使用HSI时钟 */
HAL_RCC_DeInit();
/* 关闭滴答定时器,复位到默认值 */
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/* 关闭所有中断,清除所有中断挂起标志 */
for (int i = 0; i < 8; i++)
{
NVIC->ICER[i]=0xFFFFFFFF;
NVIC->ICPR[i]=0xFFFFFFFF;
}
// 不关闭暂时没发现问题
SCB_DisableICache(); // 关闭ICache
SCB_DisableDCache(); // 关闭Dcache
ENABLE_INT(); /* 使能全局中断 Must Add here!! */
/* 跳转到应用程序,首地址是MSP,地址+4是复位中断服务程序地址 */
AppJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4)));
/* 设置主堆栈指针 */
__set_MSP(*(uint32_t *)AppAddr);
/* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
__set_CONTROL(0);
AppJump();
Onboard_Led_ON();
//Debug_info("Jump to APP [%08x] fail!!!",AppAddr);
}
|