STM32的IAP跳转到APP后卡死在HAL_Delay()延时函数问题分析与解决

程序在从IAP跳转到APP后,在MX_SDADC1_Init()中因HAL_Delay()卡死,原因是uwTick未计数。解决方法是在APP的HAL_Init()后开启中断,通过__ASM(CPSIEI)和__set_FAULTMASK(0)来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述:

因为使用了操作系统,所有使用TIM2做为HAL_Delay()延时函数的时基。当程序充IAP跳转到APP之后,程序卡死在MX_SDADC1_Init();中,因为该函数调用了HAL_Delay()延时函数;而uwTick一直没有计数导致。

解决方案:

在APP的程序中,调用HAL_Init();之后,开启中断即可解决该问题。

   __set_FAULTMASK(1); 
  
  /* set vector table*/
  SCB->VTOR = FLASH_BASE | 0x1F800; //
  /* USER CODE END 1 */ 

  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
  /* open interruption*/
  __ASM("CPSIE  I");   // 
  __set_FAULTMASK(0);  // 

STM32 IAP(In-Application Programming)跳转卡死HAL_Delay函数,通常是由于系统时钟配置或中断向量表配置正确导致的。以下是一些可能的原因和解决方法: 1. **系统时钟配置错误**: - 确保在跳转后重新配置系统时钟。IAP跳转后,系统时钟可能会恢复到默认状态,导致延时函数无法正常工作。 - 检查时钟配置代码,确保所有时钟设置正确。 2. **中断向量表配置错误**: - IAP跳转后,中断向量表需要重新指向新的应用程序地址。确保在跳转后更新中断向量表。 - 可以通过修改VTOR(Vector Table Offset Register)寄存器来重新指向中断向量表。 3. **堆栈指针未正确设置**: - 在跳转之前,确保新的应用程序的堆栈指针已正确设置。可以通过在新的应用程序的启动代码中设置堆栈指针。 4. **HAL库初始化问题**: - 确保在跳转后重新初始化HAL库。如果HAL库在IAP跳转前已经初始化,跳转后需要重新初始化。 以下是一个简单的示例代码,展示了如何在跳转后重新配置系统时钟和中断向量表: ```c #include "stm32f1xx_hal.h" typedef void (*pFunction)(void); uint32_t JumpAddress; pFunction JumpToApplication; uint32_t *VectorTable; int main(void) { // 初始化HALHAL_Init(); // 配置系统时钟 SystemClock_Config(); // 检查是否需要跳转 if (/* 条件满足 */) { // 获取应用程序的地址 JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); JumpToApplication = (pFunction) JumpAddress; // 重新配置中断向量表 __disable_irq(); VectorTable = (uint32_t *)APPLICATION_ADDRESS; SCB->VTOR = (uint32_t)VectorTable; __enable_irq(); // 跳转到应用程序 JumpToApplication(); } // 主应用程序代码 while (1) { // 主循环代码 } } void SystemClock_Config(void) { // 系统时钟配置代码 } ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值