En STM32F4xx: ¿Puedo desencadenar un temporizador solo para que pase por una lista de periodos actualizados desde una matriz?

2

Necesito que las cosas sucedan en períodos de tiempo precisos (hasta el reloj, ~ 5.5ns a 180MHz) basados en una lista; digamos 5 periodos de 444444, 555555, 666666, 777777 y 888888 relojes temporizadores (obviamente un reloj temporizador de 32 bits).

Propongo lo siguiente:

  1. Establecí TIM2 "TIM_Period" con el primer período. Puse el reloj en el reloj del sistema. Lo puse para activarse (¿es eso posible?). También configuré un ISR para ser despedido al mismo tiempo
  2. Comienzo TIM2.
  3. Precargo el siguiente "TIM_Periodo" en el temporizador, de alguna manera eso solo será "efectivo" después de que "se encienda / actualice".

  4. En ISR incremento un índice a través de la matriz de valores: si existe un próximo valor, lo pre-cargo en "TIM_Period" para que TIM2 lo cargue la próxima vez. Si no hay un valor siguiente, desactivo el autoencendido. Se pueden hacer otras cosas en el ISR siempre que sean lo suficientemente cortas para finalizar antes del encendido del próximo temporizador.

Si esto funciona, ¿podría yo (en el ISR, según alguna lista) configurar también otros temporizadores que se activarán con este temporizador principal?

Gracias por las respuestas hasta ahora, pero los temporizadores blandos están fuera de discusión. Además, no necesito muchos; Necesito 3-4. Preferiría las respuestas difíciles de alguien que realmente disparó un temporizador de otro.

    
pregunta user2161971

2 respuestas

0

No estoy seguro de qué quiere decir exactamente con "activarse", ¿quiere decir contar hacia arriba o hacia abajo, desde un reloj fijo?

No lo he hecho yo mismo, pero si entiendo su pregunta correctamente, entonces está buscando el registro de recarga automática (ARR). El contador puede configurarse para restablecerse una vez que alcance el valor ARR, y esto también establece un indicador de evento (UDE o bit UIE en TIMx_DIER). Puede dar servicio a este indicador ya sea en un ISR o con un canal DMA, cada vez que actualice ARR desde una tabla de períodos. La "detención" se puede lograr con ARR = 0.

También vea la nota AN4013 de ST sobre los temporizadores STM32, que incluye configuraciones de ejemplo para algunos casos de uso comunes.

    
respondido por el Christoph
-1

Bueno, hay un par de consideraciones aquí. Esta es ciertamente una solución sensata. Sin embargo, la pregunta real es ¿cuánta granularidad necesita en sus períodos de temporizador? Los temporizadores de hardware son un recurso escaso, por lo que podría valer la pena considerar la creación de temporizadores virtuales en el software. Una técnica muy común es crear 'tareas programadas' con un ISR ejecutándose a intervalos fijos de, por ejemplo, 1 kHz. Entonces, lo que puede hacer es tener algunos contadores en el software que actualiza en el ISR. Cada vez que se ejecuta el ISR, recorres y decrementas los contadores. Si uno llega a cero, entonces realiza alguna tarea y ajusta el contador a un nuevo valor de retardo. Este nuevo valor podría ser constante, o podría provenir de una matriz o de otra parte. Esta técnica significa que no tiene que actualizar el período del temporizador todo el tiempo, y puede realizar un seguimiento de una gran cantidad de tareas programadas. Sin embargo, la otra cara es que el tick del temporizador se convierte en el período del temporizador. Este método funcionaría bien para cosas simples que deben realizarse alrededor de 100 veces por segundo o menos.

Si alguna vez has usado un Arduino; esta es la técnica utilizada por la biblioteca estándar para proporcionar milis y ejecutar todos los retrasos con precisión.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas