Temporizador básico que no funciona STM32L4

Estoy tratando de usar timer2 en STM32L475 pero no comienza a disparar la interrupción.

Me gustaría configurar el temporizador por un minuto.

void InitializeTimer()
{
    TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 10000;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 500;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
          _Error_Handler(__FILE__, __LINE__);
  }

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

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


if(HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)
{
  _Error_Handler(__FILE__, __LINE__);
}

}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2) {
          start_processing = true;

    }
}

void TIM2_IRQHandler()
{
    /* Clear interrupt flag first. It cannot be the last instruction in an interrupt handler. */
     __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);            //clear interrupt flag
    start_processing = true;
}

antes del bucle principal:

 MX_I2C3_Init();
  InitializeTimer();
  //MX_SPI3_Init();
  HAL_NVIC_SetPriority(TIM2_IRQn, 0, 1);
  HAL_NVIC_EnableIRQ(TIM2_IRQn);// Enable interrupt from TIM3 (NVIC level)
Algunas cosas para verificar: ¿Empieza a contar y llega al límite? ¿ Qué está haciendo el temporizador maestro ( TIM1?)? ¿Funciona sin la configuración maestro-esclavo? se start_processingdeclara como volatile? ¿Qué contienen los registros de control y estado?
@berendi sí start_processing declarado como volátil. ¿Puede mostrar una configuración básica sin maestro y esclavo?
@berendi HAL_TIM_PeriodElapsedCallback nunca se llama
El valor del período parece ser demasiado bajo para un minuto. ¿Funciona el controlador en algún modo de frecuencia reducida (baja potencia)?

Respuestas (1)

HAL_TIM_PeriodElapsedCallback()nunca se llama porque no hay código para llamarlo. Se supone que se llama desde TIM2_IRQHandler().

Aquí hay una configuración básica del temporizador con interrupciones cada minuto, asumiendo que el reloj APB1 es de 80 MHz.

volatile int start_processing;
void TIM2_IRQHandler(void) {
    if(TIM2->SR & TIM_SR_UIF) {    // check status
        start_processing = 1;
        TIM2->SR &= ~TIM_SR_UIF;   // clear status
    }
}

void InitializeTimer(void) {
    RCC->APB1ENR1 |= RCC_APB1ENR1_TIM2EN;
    RCC->APB1ENR1;
    TIM2->PSC = 9999;           // 80 MHz clock is prescaled to 8 kHz
    TIM2->EGR = TIM_EGR_UG;     // required to take over the ARR value
    TIM2->ARR = 479999;         // 8000 * 60 - 1
    TIM2->DIER = TIM_DIER_UIE;  // enable update (timer overflow) interrupt
    TIM2->CR1 = TIM_CR1_CEN;    // start timer
    NVIC_SetPriority(TIM2_IRQn, 0);
    NVIC_EnableIRQ(TIM2_IRQn);
}