如何在sw4stm32中启用中断功能

时间:2016-06-29 11:51:29

标签: timer interrupt stm32 isr

我使用SW4STM32工具链,我想在溢出时使用timer2进行bliking,在STM32103RET中, 这是我转向领导的功能。

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

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

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

2 个答案:

答案 0 :(得分:5)

您需要按功能启动计时器

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上搜索HAL Driver
  2. 您可以看到HAL驱动程序使用的示例(当您使用CubeMX时,您可以在C:/Users/%USERNAME%/STM32Cube/Repository/目录中找到它)
  3. 只需打开stm32f?xx_hal_tim.c并查看有哪些功能,请参阅他们的评论以了解您正在做什么。并查看从HAL_TIM_IRQHandler调用哪些函数以了解如何命名回调。

答案 1 :(得分:2)

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

while(cout << "Enter a positive integer: " &&
        (!(cin >> anInteger) || anInteger < 0))
{
    cout << "Enter a positive integer.\n";
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

while(cout << "Read or write (r/w): " &&
        (!(cin >> rw) || (rw != 'r' && rw != 'w')))
{
    cout << "Enter r or w.\n";
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

第二次使用此函数来处理中断:

/* 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();
  }

  }

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

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);
}