¿Cómo puede aumentar la velocidad de una interrupción GPIO externa en stm32f4?

Estoy tratando de medir la velocidad de un motor de CC usando un sensor IR. Mi motor tenía un disco adjunto con solo 1/4 parte reflejada. Quería habilitar la interrupción tanto en el borde descendente como en el ascendente para que la rutina de interrupción se llame dos veces en esa región reflectante de 1/4 cuya distancia ya conozco.

Mi ISR ​​activará el temporizador la primera vez y lo desactivará la próxima vez que se llame a la interrupción. El problema (que encontré al estudiar el comportamiento de una variable) es que cuando hago que el sensor reaccione rápidamente, mi interrupción se genera solo una vez y no cuando desaparece la superficie reflectante. Pero, cuando muevo algo lentamente frente a él, ambos ocurren perfectamente.

Entonces, mi conclusión es que mi interrupción no está reaccionando lo suficientemente rápido. ¿Cuál crees que es el problema?

Primero debe ver la forma de onda de la señal de entrada antes de culpar a la velocidad de la rutina de interrupción. Luego, debe verificar la velocidad de la interrupción aplicando una buena entrada conocida, y configurar otro GPIO desde dentro de su rutina de procesamiento de interrupciones, y observar la sincronización de los bordes de la señal. ¿Qué modelo de osciloscopio usa al depurar su código?

Respuestas (1)

Mi ISR ​​activará el temporizador la primera vez y lo desactivará la próxima vez que se llame a la interrupción.

Este no es el método correcto para medir señales de tiempo rápidas. El microcontrolador tiene temporizadores, y estos temporizadores tienen modo de captura.
En el modo de captura, un flanco ascendente/descendente de la entrada hace que el valor real del temporizador se almacene en el registro de captura. Tendrá hasta el próximo borde para leer la marca de tiempo del borde.
Cuando tiene dos marcas de tiempo, puede calcular el tiempo entre ellas.

De esta forma, no depende de la latencia de interrupción ni de la fluctuación de fase.

El problema (que encontré al estudiar el comportamiento de una variable) es que cuando hago que el sensor reaccione rápidamente, mi interrupción se genera solo una vez y no cuando desaparece la superficie reflectante.

Es posible que tenga un problema eléctrico aquí. Verifique si los bordes son correctos y no hay rebotes.
Podría eliminar algunos problemas eléctricos con los filtros básicos de entrada digital en los temporizadores de ST. Pero es mejor tener un filtro en primer lugar.

También hay otro problema. Apuesto a que usa HAL y la latencia de interrupción no es el problema (a menos que los desencadenantes de interrupción vengan en una fracción de nosotros). El uso de las funciones de la biblioteca HAL agrega cientos (a veces miles) de ciclos de reloj encima.
@PeterJ_01 Sí, cualquier cosa que construyas con lego será torpe.
Pero veo muchas preguntas como: cambio de pin muy lento.