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.