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

描述:

因为使用了操作系统,所有使用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);  // 

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
STM32中,IAP(In-Application Programming)是一种通过软件在应用程序中对MCU进行编程的方式。在IAP过程中,我们需要跳转APP的中断向量表,以便程序能够正确地运行。下面是一个简单的流程和示例代码: 1. 在APP的代码中定义中断向量表: ```c /* APP中断向量表 */ __attribute__((section(".isr_vector"))) const uint32_t app_vector_table[] = { /* Cortex-M3 core exceptions */ (uint32_t)&_estack, /* Stack pointer */ (uint32_t)&Reset_Handler,/* Reset handler */ (uint32_t)&NMI_Handler, /* NMI handler */ (uint32_t)&HardFault_Handler,/* Hard Fault handler */ ... /* Other interrupts */ (uint32_t)&TIMER1_IRQHandler,/* Timer1 interrupt handler */ (uint32_t)&TIMER2_IRQHandler,/* Timer2 interrupt handler */ ... } ``` 2. 在IAP的代码中定义跳转函数并加载APP中的中断向量表: ```c /* 跳转APP的函数 */ void jump_to_app(void) { uint32_t app_start_address = APP_START_ADDRESS; // APP起始地址 uint32_t *p_app_vector_table = (uint32_t *)app_start_address; /* 关闭所有中断 */ __disable_irq(); /* 更新中断向量表 */ SCB->VTOR = app_start_address; /* 跳转APP的Reset_Handler */ void (*p_app_reset_handler)(void) = (void (*)(void))(p_app_vector_table[1]); p_app_reset_handler(); } int main(void) { /* 判断是否需要跳转APP */ if (need_jump_to_app()) { jump_to_app(); } ... } ``` 需要注意的是,`APP_START_ADDRESS`是APP的起始地址,需要根据实际情况进行修改。`need_jump_to_app()`函数可以根据外部条件(如按键按下)判断是否需要跳转APP。 以上是一个简单的示例代码,实际应用中可能需要根据具体情况进行修改。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值