sw4stm32中如何使能中断功能

How to enable interrupt function in sw4stm32

我使用 SW4STM32 工具链,我想在 STM32103RET 中溢出时使用定时器 2 点亮 LED, 这是我打开和关闭 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溢出时调用了哪个函数?

您需要通过函数启动定时器

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 description 或其他家庭只需在 st.com
  2. 上搜索 HAL Driver
  3. 您可以查看 HAL 驱动程序使用示例(因为您使用的是 CubeMX,所以您可以在 C:/Users/%USERNAME%/STM32Cube/Repository/ 目录中找到它)
  4. 只需打开 stm32f?xx_hal_tim.c 并查看有哪些功能,查看他们的评论以了解他们在做什么。并查看从 HAL_TIM_IRQHandler 调用了哪些函数以了解命名回调的方式。

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

/* 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)