2

我使用 SW4STM32 工具链,我想在溢出时使用 timer2 闪烁 LED,在 STM32103RET 中,这是我打开和关闭 LED 的功能。

void TurnOnLed(){
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);
}

void TurnOffLed()
{
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET);
}

stm32 cube mx设置了timer2初始化,但是不知道timer2溢出时调用哪个函数?

4

2 回答 2

7

您需要按功能启动计时器

HAL_TIM_Base_Start_IT(&htimX);

第一次实现你的回调函数,名为HAL_TIM_PeriodElapsedCallback

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIMx) {
    }
}

如果您对 HAL_Driver 一无所知,您可能会从以下位置找到很多信息:

  1. STM32F0xx HAL_Driver 说明或其他系列只需HAL Driver在 st.com 上搜索
  2. 您可以查看 HAL 驱动程序使用示例(因为您使用 CubeMX,所以您可以在C:/Users/%USERNAME%/STM32Cube/Repository/目录中找到它)
  3. 只需打开stm32f?xx_hal_tim.c并查看存在哪些功能,查看他们的评论以了解他们在做什么。并查看调用哪些函数HAL_TIM_IRQHandler以了解如何命名回调。
于 2016-07-01T09:13:50.697 回答
3

首先,您必须配置您的计时器:

/* TIM2 init function */
static void MX_TIM2_Init(void)
{

  TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

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

  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
  sSlaveConfig.InputTrigger = TIM_TS_ITR0;
  if (HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig) != HAL_OK)
  {
    Error_Handler();
  }

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

  }

其次使用这个函数来处理中断:

void TIM2_IRQHandler(void)
{
    HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_10);
     __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);            //clear interrupt flag
    //HAL_Delay(500);
}

不要忘记在 main() 函数中启用中断:

HAL_NVIC_SetPriority(TIM2_IRQn, 0, 1);
  HAL_NVIC_EnableIRQ(TIM2_IRQn);// Enable interrupt from TIM3 (NVIC level)
于 2016-10-13T15:54:21.340 回答