2017-04-01 18 views
1

我在我們的自定義設計板上使用stm32f103微型定位器。我使用了定時器中斷,每10ms將bool變量設置爲true。我在主循環中檢查bool變量的值,如果這個變量是真的,我每隔500ms切換一個led板。C代碼不會在定時器中斷後返回到主體

雖然定時器中斷標誌在完成設置真正的操作後被清除,但代碼不會返回到主循環,而且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; 
    } 
} 

當我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語句,也代碼工作不穩定。

有沒有人可以解釋這個原因。

謝謝。

+0

我看不到任何你已經配置了定時器和中斷的代碼,我想知道這個代碼將如何產生中斷。 您是否檢查過ISR是否通過切換其中的另一個GPIO進行維修並在DSO上進行檢查? – Gaurav

+0

請顯示[mcve]。特別說明你是如何聲明「任務」變量的。 – kaylum

+0

變量'task'聲明爲volatile嗎? –

回答

0

1)Decalre任務爲易失性。

2)關閉設置中的所有編譯器優化。

+0

關閉編譯器優化解決了這個問題。 –

+0

@Adwait Patil我認爲如果優化關閉,編譯器會正常處理volatile變量。所以,如果變量聲明爲volatile,那麼編譯器優化應該是ON,否則它會正常處理變量。 – Gaurav

相關問題