一、概述
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();
各个外设需要复位为初始化状态,实际可能只有个别函数起了作用,统一复位没有坏处。