C - 代码在定时器中断后不会 return 到 main

C - Code does not return to main after timer interrurpt

我在我们的定制设计板上使用 stm32f103 微处理器。我使用定时器中断每 10 毫秒将一个 bool 变量设置为 true。我在主循环中检查 bool 变量的值,如果这个变量为真,我每 500 毫秒切换一次板上的 LED。

虽然定时器中断标志在完成设置 true 操作后清除,但代码不会 return 到主循环并且 led 不会切换。定时器初始化、中断和主循环如下。

static void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 7199;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 99;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
      /* Initialization Error */
      Error_Handler();
  }

  /*##-2- Start the TIM Base generation in interrupt mode ####################*/
  /* Start Channel1 */
  if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)
  {
      Error_Handler();
  }
}

void TIM2_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&htim2);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    task = true;
}

主循环

while (1)
{
    if(task == true)
    {
        task_timer++;

        if(task_timer % 50 == 0)
        {
            HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_15);
        }
        task = false;
    }
}

当我在主循环中使用 else if 语句时,代码按预期处理。

while (1)
{
    if(task == true)
    {
        task_timer++;

        if(task_timer % 50 == 0)
        {
            HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_15);
        }
        task = false;
    }
    else if(task == false)
    {
       ...
    }
}

有趣的是,如果我只使用 else 语句,代码也会不稳定。

有谁能解释一下这是什么原因。

谢谢。

在设置中关闭所有编译器优化。