Problema del temporizador en STM32F7 - comportamiento errático

3

Primero que nada, soy un n00b completo y recién estoy comenzando con STM32. Me estoy encontrando con un comportamiento extraño al configurar TIM1 y también utilizando la interrupción externa EXTI3. Estoy tratando de medir una frecuencia de entrada baja en la interrupción externa y uso TIM1 para incrementar un contador de 1 MHz, por lo que puedo medir en microsegundos. Estoy haciendo esto porque parece que SysTick no es lo suficientemente rápido (1 ms) para darme una medición precisa.

El reloj central es de 16 MHz, y TIM1 está configurado de la siguiente manera:

htim1.Instance = TIM1;
htim1.Init.Prescaler = 16; // 16 MHz / 16 = 1 MHz
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 1; // 1Mhz no sub-dividing
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
...
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
...
void TIM1_UP_TIM10_IRQHandler(void)
{
    timerTicks++;
    HAL_TIM_IRQHandler(&htim1);
}
...
void EXTI1_IRQHandler(void)
{
    previousTimerTicks = currentTimerTicks;
    currentTimerTicks = timerTicks;
}
...
// Start the timer as interrupt
HAL_TIM_Base_Start_IT(&htim1);
...
while(1){
    // Blink a light so we know the program is running
    HAL_GPIO_TogglePin(GPIOB, Led_Green_Pin);
    HAL_Delay(100);
}

Sin embargo, el programa prácticamente se bloquea y el ciclo de ejecución while () no parece ejecutarse. Sin embargo, puedo ver que el contador TIM1 está aumentando. Si ralentizo el Periodo para decir, 100, el bucle principal de la aplicación parece funcionar bien.

¿Se trata de un problema con TIM1 y EXTI3 en conflicto a esa velocidad, o algo más está sucediendo aquí? Me imagino que el dispositivo no debería tener problemas al proporcionar un contador de 1 MHz, pero tal vez esté haciendo todo mal.

    
pregunta Michael Brown

1 respuesta

3

Estás yendo todo esto mal.
No es posible que pueda ejecutar su controlador de interrupción de temporizador en tan solo 16 ciclos de reloj. No se preocupe por su (1) bucle.

Lo que debes hacer es dejar que el temporizador se ejecute libre y solo manejar las interrupciones cuando se desborda. Volveremos a esto pronto.

A continuación, configure un controlador de interrupción para su EXTI y en él, capture el valor del temporizador & guárdalo.
En la siguiente interrupción, calcule la diferencia entre los 2 valores, y ahí está, el tiempo entre 2 eventos EXTI sucesivos en múltiplos de su período del temporizador (1uSec si lo mantiene configurado igual).

Pero, ¿qué pasa si el temporizador se desplaza? Bueno, es por eso que queremos manejar las interrupciones del temporizador en la reinversión.
Aquí puede establecer una marca para indicar a su controlador EXTI que el temporizador se ha volcado y debe tenerlo en cuenta al realizar el cálculo.

    
respondido por el brhans

Lea otras preguntas en las etiquetas