En STM32F4xx: ¿Puedo activar un temporizador por sí mismo para que pase por una lista de períodos actualizados desde una matriz?

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

Propongo lo siguiente:

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

  4. En ISR, incremento un índice a través de la matriz de valores: si existe un valor siguiente, lo precargo en "TIM_Period" para que TIM2 lo cargue la próxima vez. Si no hay un valor siguiente, apago el autodisparo. Se pueden hacer otras cosas en el ISR siempre que sean lo suficientemente breves como para finalizar antes del próximo disparo del temporizador.

Si esto funciona, ¿podría (en el ISR, según alguna lista) también configurar otros temporizadores para que sean activados por este temporizador principal?

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

Respuestas (2)

No estoy seguro de qué quiere decir exactamente con "dispararse solo", ¿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 se puede configurar para que se reinicie una vez que alcanza el valor ARR, y esto también establece un indicador de evento (bit UDE o UIE en TIMx_DIER). Puede dar servicio a esta bandera ya sea en un ISR o con un canal DMA, actualizando cada vez ARR desde una tabla de períodos. La "detención" se puede lograr con ARR = 0.

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

Bueno, hay un par de consideraciones aquí. Esta es sin duda una solución sensata. Sin embargo, la verdadera pregunta es ¿cuánta granularidad necesita en sus períodos de tiempo? 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 que se ejecuta a intervalos fijos de, digamos, 1 kHz. Entonces lo que puedes hacer es tener unos contadores en software que actualizas en el ISR. Cada vez que se ejecuta el ISR, pasa y disminuye los contadores. Si uno llega a cero, entonces realiza alguna tarea y establece el contador en un nuevo valor de retraso. Este nuevo valor podría ser constante o podría provenir de una matriz o de otro lugar. 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 de la moneda es que el tic del temporizador se convierte en el período del temporizador. Este método funcionaría bien para cosas simples que deben ocurrir 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.

¡Los temporizadores de hardware están lejos de ser un recurso escaso en un STM32F4! Como mínimo, hay 6 temporizadores de 16 bits y 2 temporizadores de 32 bits. El 407 tiene 12 de 16 bits y 2 de 32 bits. De hecho, debido a que dos de ellos son de 32 bits y debido a la flexibilidad involucrada en el indicador del temporizador, los encuentro mucho más fáciles de usar que en los PIC. No hay necesidad de hacer malabarismos entre cuánto tiempo pueden contar sin darse la vuelta y su precisión.
¿Qué sucede si necesito programar 100 tareas pequeñas diferentes? El chip más grande que mencionas solo tiene 14 temporizadores. Es trivial hacer una matriz de contadores de 100 elementos en el software y manejar eso en un ISR. Mientras no necesite ejecutar TODAS las 100 tareas en el mismo tictac del temporizador, está bien. Tal vez debería reemplazar ese 'son' con un 'puede ser'. A veces tiene sentido hacerlo en hardware, a veces tiene sentido hacerlo en software.