void Jump2APP(uint32_t appxaddr) { /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */ if (((*(__IO uint32_t*)appxaddr) & 0x2FFE0000 ) == 0x20000000) //1.检查栈顶地址是否合法 { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (FLASH_APP_ADDR + 4); //2.用户代码区第二个字为程序开始地址(复位地址) Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application‘s Stack Pointer */ __set_MSP(*(__IO uint32_t*) FLASH_APP_ADDR); //设置进程MSR堆栈首地址 Jump_To_Application(); //设置PC指针指向复位地址,完成跳转 } }
变量appxaddr存放的是APP程序的首地址,即FLASH_APP_ADDR。*appxaddr就是取FLASH_APP_ADDR这个地址里面的数据,即APP代码堆栈的栈顶地址,它指向RAM,而RAM起始地址0x20000000。因此这句代码是:判断APP堆栈地址是否落在0x20000000~0x2001ffff(128K)区间内,
FLASH_APP_ADDR+4存放的是复位中断向量起始地址,这句代码是:将复位中断向量的起始地址存放在变量JumpAddress里。
跳转之前先使用__set_MSR()设置堆栈指针的首地址
设置PC指针指向复位地址。
原文:https://www.cnblogs.com/Mike2019/p/12491240.html