- /* 开关全局中断的宏 */
- #define ENABLE_INT() __set_PRIMASK(0) /* 使能全局中断 */
- #define DISABLE_INT() __set_PRIMASK(1) /* 禁止全局中断 */
- #define APP_ADDR 0x1FFFF000 /* 系统bootloader地址 */
- /*
- *********************************************************************************************************
- * 函 数 名: JumpToApp
- * 功能说明: 跳转到APP
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void JumpToApp(void)
- {
- void (*SysMemBootJump)(void); /* 声明一个函数指针 */
- __IO uint32_t AppAddr = APP_ADDR; /* 跳转地址 */
-
- /* 如果初始化了外设,需要反向初始化外设 */
-
- /* 设置所有时钟到默认状态,使用HSI时钟 */
- HAL_RCC_DeInit();
- /* 关闭滴答定时器,复位到默认值 */
- SysTick->CTRL = 0;
- SysTick->LOAD = 0;
- SysTick->VAL = 0;
- /* 关闭全局中断 */
- DISABLE_INT();
-
- /* 关闭所有中断,清除所有中断挂起标志 */
- for (uint32_t i = 0; i < 8; i++)
- {
- NVIC->ICER[i]=0xFFFFFFFF;
- NVIC->ICPR[i]=0xFFFFFFFF;
- }
- /* 使能全局中断 */
- ENABLE_INT();
- /* 设置SysMemBootJump为中断服务函数入口地址,首地址是MSP,地址+4是复位中断服务程序地址 */
- SysMemBootJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4)));
- /* 设置主堆栈指针 */
- __set_MSP(*(uint32_t *)AppAddr);
- /* 在RTOS工程,这条语句很重要,设置为特权级模式,SP使用MSP指针 */
- __set_CONTROL(0);
- /* 进行跳转 也就是将SysMemBootJump 赋值给PC */
- SysMemBootJump();
- /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
- while (1)
- {
- }
- }
|