我在我們的自定義設計板上使用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語句,也代碼工作不穩定。
有沒有人可以解釋這個原因。
謝謝。
我看不到任何你已經配置了定時器和中斷的代碼,我想知道這個代碼將如何產生中斷。 您是否檢查過ISR是否通過切換其中的另一個GPIO進行維修並在DSO上進行檢查? – Gaurav
請顯示[mcve]。特別說明你是如何聲明「任務」變量的。 – kaylum
變量'task'聲明爲volatile嗎? –