¿Cuál es la menor cantidad de tiempo que puedo medir usando los temporizadores STM32F1x?

0

Estoy trabajando con STM32F107 en una placa personalizada, la placa tiene un cristal de 12MHz. Quiero medir 1 microsegundo con precisión, pero no puedo hacerlo. He usado STM32CubeMX para configurar el reloj central a 72MHz, que es su velocidad máxima. Intentando usar el temporizador 3 en el modo de conteo ascendente y alternando un GPIO en el ISR del temporizador. Estas son mis configuraciones

void MX_TIM3_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 72-1;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }

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

Obtengo un pulso de aproximadamente 2 microsegundos en el alcance. Intenté juguetear con los valores de preescalador y período, pero no puedo obtener un pulso de 1 microsegundo.

    
pregunta user10170

1 respuesta

1

Dado que su controlador está funcionando a 72 MHz, el retraso mínimo entre dos instrucciones consecutivas es de 1/72 µs. El flash interno no es lo suficientemente rápido para eso, debes ejecutar tu programa desde la RAM interna para lograr esto.

Para obtener un retraso de exactamente 1 µs, cree una secuencia de instrucciones de ensamblaje que demore 71 ciclos en completarse. Deshágase de HAL, es demasiado complicado y, por lo tanto, impredecible para este tipo de trabajo. El enfoque trivial sería una secuencia de 71% de instrucciones de%, pero eso es un poco inútil. Para construir un bucle en un ensamblaje en línea, debe consultar los recuentos de ciclos de instrucciones del procesador y modos de direccionamiento . Para ejecutarlo desde flash, tenga en cuenta la latencia del flash y el comportamiento del búfer de captación previa, como se describe en el capítulo 3.3.3 de manual de referencia .

    
respondido por el berendi

Lea otras preguntas en las etiquetas