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:
Precargué el siguiente "TIM_Period" en el temporizador, de alguna manera solo será "efectivo" después de que se "dispare/actualice".
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.
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.
scott seidman
alex.forencich