STM32
直播中

王兰

12年用户 1600经验值
擅长:基础元器件
私信 关注
[问答]

STM32F7 IAP跳转后HAL_Delay没有执行的原因?

IAP程序参考ST官方例程,只是做了开发板的视频,app程序是一个非常简单的程序,只配置了uart作为调试信息输出。app main函数如下:
int main(void)
{
  __disable_irq();
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  printf("!!!!!!!!!inintt okrn");
  MX_tiM14_Init();
  HAL_Delay(5);
  printf("!!!!!!!!!dddrn");
  while(1)
{

}
}

IAP跳转部分代码为:
if (((*(__IO uint32_t*)APPLICATION_ADDRESS)   0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
                        //printf("JumpAddress:0x%x,msp:0x%xrn",JumpAddress,*(__IO uint32_t*) APPLICATION_ADDRESS);
      JumpToApplication = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
                        HAL_RCC_DeInit();
                        app_nvic_deinit();
                        __disable_irq();
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      JumpToApplication();
    }

现在跳转后出现的现象是:HAL_Delay前的打印信息能够正常输出,HAL_Delay后的则异常,从ST例程的readme.txt中有如下描述:
@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
      based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
      a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
      than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
      To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.

然后修改了中断优先级,以前优先级都为0,现在把systick以外的中断优先级修改为4,systick为0,修改后的优先级为:
HAL_NVIC_SetPriority(MemoryManagement_IRQn, 4, 0);
  HAL_NVIC_SetPriority(BusFault_IRQn, 4, 0);
  HAL_NVIC_SetPriority(UsageFault_IRQn, 4, 0);
  HAL_NVIC_SetPriority(SVCall_IRQn, 4, 0);
  HAL_NVIC_SetPriority(DebugMonitor_IRQn, 4, 0);
  HAL_NVIC_SetPriority(PendSV_IRQn, 4, 0);
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);     

用修改后的app程序测试,跳转后现象是一样的,都是HAL_Delay前的正常,HAL_Delay后没有执行。
问了ST FAE,回复是应用程序问题,但是应用没有其他代码了。只有注释掉HAL_Delay就正常。

回帖(1)

徐慧

2024-4-9 14:49:23
HAL_DELAY()对应systic的中断服务程序。 跳转到APP后,向量表重新映射,所以新的中断服务程序中也需要对应的函数内容才能运行。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分