【记录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();

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

你可能感兴趣的:(stm32,嵌入式硬件)