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

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

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值