¿Cómo hacer que un temporizador se inicie sin interrupción?

0

Yo uso un STM32F103c8t6. Lo que quiero es medir el tiempo entre varias declaraciones. Descubrí que HAL_getTick no funciona porque la resolución es demasiado pequeña (1 ms).

Sin embargo, parece que no puedo inicializar el temporizador correctamente. Con CubeMX seleccioné:

TIM2: Modo esclavo: modo disparo Fuente de disparo: ITR0 Fuente del reloj: Reloj interno Descanso deshabilitado

Y se genera el siguiente código:

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

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

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

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

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

  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;
  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__);
  }

}

Mi propio código en el bucle main / while:

....
__HAL_RCC_TIM2_CLK_ENABLE();

Y luego obtengo el valor con

uint32_t value = __HAL_TIM_GET_COUNTER(&htim2);

Sin embargo, solo veo que 0 están regresando de esta función.

Me pregunto si el temporizador se inició (intenté hacerlo muy poco después de la inicialización del temporizador, pero no hice una diferencia). El temporizador siempre tiene el estado HAL_TIM_STATE_READY.

¿Cómo debo iniciar (y posiblemente reiniciar) el temporizador?

    
pregunta Michel Keijzers

1 respuesta

1

El código generado parece estar bien hasta ahora, sin embargo, no se incluye la llamada a la función de inicio del temporizador, por lo que el temporizador se inicializa pero no se inicia. Para iniciarlo en modo de no interrupción, use HAL_TIM_Base_Start(&htim2); después de la inicialización.

    
respondido por el user162889

Lea otras preguntas en las etiquetas