C - 代码在计时器中断后不会返回主

时间:2017-04-01 21:59:57

标签: c timer embedded stm32

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

虽然在完成设置true操作后定时器中断标志被清除,但代码不会返回主循环而且不会切换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语句,那么代码也会运行不稳定。

有没有人可以解释原因。

感谢。

1 个答案:

答案 0 :(得分:0)

1)Decalre任务为volatile。

2)关闭设置中的所有编译器优化。