STM32F103 temporizador de cuenta regresiva simple (sin interrupciones)

3

Estoy intentando crear un temporizador de cuenta regresiva simple (sin usar interrupciones), para usarlo para verificar el tiempo de espera mientras se espera que ocurra un evento externo.

Idealmente, me gustaría precargar un contador de temporizador con un valor específico y hacer que descienda y se detenga una vez que llegue a cero, de modo que pueda sondear un valor de contador cero en mi bucle while.

Estoy luchando para que el temporizador funcione, y ninguno de los ejemplos que puedo ver en el manual de referencia es tan simple.

¿Alguien puede indicarme un ejemplo simple de implementación de un temporizador de cuenta regresiva de un solo disparo?

    
pregunta Jon Mills

2 respuestas

2

Después de algunas investigaciones, parece que no puedo tener un contador descendente que se detenga en cero sin utilizar interrupciones (hasta donde puedo descubrir). También parece que los contadores descendentes no son posibles a menos que esté funcionando en modo de alineación central o codificador.

Como resultado, he optado por la siguiente implementación, que utiliza un contador ascendente. Parece funcionar bien, aunque estoy un poco nervioso de que el contador tenga la posibilidad de recargarse automáticamente antes de que mi bucle while haya visto que se ha superado el umbral, pero siempre que mi valor de verificación esté muy por debajo del valor de recarga automática Debería estar bien.

Puede haber mejores formas de hacer esto.

/* Set timer prescaler (0 = no divide - clk = 8MHz) */
TIM2->PSC = 0;

/* Set reload register well above the longest time that we're interested in */
TIM2->ARR = 0xFFFF;

/* Enable the timer */
TIM2->CR1 |= TIM_CR1_CEN;

/* Wait for 1ms */
TIM2->CNT = 0u;
while (TIM2->CNT < 8000u) {}
    
respondido por el Jon Mills
1

Parece que el SysTick es ideal para tus propósitos.

SysTick es un temporizador que se carga con un valor personalizable. Cada instrucción, se decrementa en uno. Cuando el valor llega a 0, se restablece a su valor de carga y se inicia de nuevo. Además, se establece un indicador de estado. Puede sondear este indicador de estado en el software.

    
respondido por el Multisync

Lea otras preguntas en las etiquetas