stm32|【记录STM32H7 IAP跳转失败】

一、概述
【stm32|【记录STM32H7 IAP跳转失败】】STM32系列在IAP模式进行升级时,有一步跳转处理,如下:

__disable_irq(); /* 栈顶空间监测,实际栈顶为0x200269F8,最大栈为0x30000 */ if(((*(__IO uint32_t*)FLASH_APP_START_ADDRESS)&0x2FFC0000)==0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (FLASH_APP_START_ADDRESS + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) FLASH_APP_START_ADDRESS); Jump_To_Application(); /* do nothing */ while(1); }


在STM32F4、L4系列中,直接跳转无问题,但是在STM32H743调试过程中,发现跳转后APP无法运行。
二、问题查询过程
1)将此跳转语句放在IAP程序的第一行,发现跳转成功。说明APP部分程序无问题。
2)将语句放在HAL_Init后面,发现跳转后无法运行。
3)增加HAL_DeInit(),跳转正常,如下:
HAL_DeInit(); __disable_irq(); /* 栈顶空间监测,实际栈顶为0x200269F8,最大栈为0x30000 */if(((*(__IO uint32_t*)FLASH_APP_START_ADDRESS)&0x2FFC0000)==0x20000000){/* Jump to user application */JumpAddress = *(__IO uint32_t*) (FLASH_APP_START_ADDRESS + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */__set_MSP(*(__IO uint32_t*) FLASH_APP_START_ADDRESS); Jump_To_Application(); /* do nothing */ while(1); }

4)查看HAL_DeInit函数,如下:
_HAL_RCC_AHB3_FORCE_RESET(); __HAL_RCC_AHB3_RELEASE_RESET(); __HAL_RCC_AHB1_FORCE_RESET(); __HAL_RCC_AHB1_RELEASE_RESET(); __HAL_RCC_AHB2_FORCE_RESET(); __HAL_RCC_AHB2_RELEASE_RESET(); __HAL_RCC_AHB4_FORCE_RESET(); __HAL_RCC_AHB4_RELEASE_RESET(); __HAL_RCC_APB3_FORCE_RESET(); __HAL_RCC_APB3_RELEASE_RESET(); __HAL_RCC_APB1L_FORCE_RESET(); __HAL_RCC_APB1L_RELEASE_RESET(); __HAL_RCC_APB1H_FORCE_RESET(); __HAL_RCC_APB1H_RELEASE_RESET(); __HAL_RCC_APB2_FORCE_RESET(); __HAL_RCC_APB2_RELEASE_RESET(); __HAL_RCC_APB4_FORCE_RESET(); __HAL_RCC_APB4_RELEASE_RESET();

各个外设需要复位为初始化状态,实际可能只有个别函数起了作用,统一复位没有坏处。

    推荐阅读