一、概述
【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();
各个外设需要复位为初始化状态,实际可能只有个别函数起了作用,统一复位没有坏处。
推荐阅读
- STM32|基于STM32的小说阅读器
- 嵌入式|锂电池充电(TP4056A芯片)电路分享
- 嵌入式|Code Blocks运行官方demo报错说明
- quartus 中导入device的方法及遇到的问题
- stm32|C/C++ Qt 自定义Dialog对话框组件应用
- 单片机|cubemx STM32的FLASH内存读写
- W25Qxx|W25Qxx Flash存储
- STM32|W25QXX使用教程
- stm32|【STM32】HAL库开发教程(九)—W25qxx使用