Interrupción STM32 y entrada en el mismo pin

Pregunta bastante simple, pero no pude encontrar ninguna instrucción al respecto. Estoy usando un STM32G070

Estoy interactuando con un ADS1231 que usa DOUT / ~DRDY en el mismo pin, y me pregunto si también hay una manera de usar el pin de interrupción como entrada. Esencialmente lo que quiero hacer:

  1. Espere un flanco descendente en el pin DOUT/~DRDY (actualmente configurado como EXTI)

[Dentro de la ISR:]

  1. Deshabilitar interrupciones en el pin
  2. Usar el pin como entrada
  3. Envía las 24 señales de reloj, leyendo el pin DOUT/~DRDY después de cada flanco descendente del reloj.
  4. Convierte el pin de nuevo en una interrupción
  5. Salir y esperar de nuevo

Encontré una respuesta interesante en otro hilo, usando la misma parte ( https://electronics.stackexchange.com/a/339742/281491 )

Yo lo haría completamente de otra manera.

Configure el pin SPI2 MISO como entrada GPIO. Configure la interrupción EXTI (flanco descendente) en este pin

En la interrupción EXTI: deshabilite EXTI, cambie este pin a MISO AF e inicie la transacción DMA de 3 bytes (envíe 3 bytes ficticios según sea necesario para generar el reloj para el ADS).

En la transferencia DMA, cambie el pin de interrupción completa a la entrada GPIO. Habilitar EXTI

Los pasos 2 y 3 se repetirán automáticamente en cada conversión.

¿Alguien puede dar más detalles sobre cómo haría las partes en negrita o cualquier otra solución?

Gracias

Su estrategia suena bien. Es una técnica común para habilitar/deshabilitar interrupciones en un gpio. Otra técnica es no sondear o esperar a que se complete el adc, sino configurar un temporizador para activar la conversión y luego el siguiente tic del temporizador lee el resultado y comienza la siguiente conversión. Normalmente no necesita ejecutar el adc a toda velocidad, así que configure el temporizador en un valor mayor que el tiempo máximo de conversión.

Respuestas (2)

Hay tantas maneras de hacerlo como la gente puede pensar.

Su forma funcionará bien, aunque no es muy sofisticada ya que la MCU estará sentada en la interrupción esperando que se transfieran los bytes antes de salir de la interrupción. Si eso es todo lo que se necesita, es simple y efectivo.

La otra solución que encontraste es una de las soluciones más complejas, aunque las bibliotecas lo hacen fácil de hacer. Simplemente deshabilita la interrupción EXTI e inicia una transferencia impulsada por DMA e inmediatamente sale de la interrupción para volver a hacer lo que estaba haciendo. Los datos se transfieren en segundo plano y cuando se terminan los bytes, la interrupción de transferencia completa volverá a habilitar la interrupción EXTI.

Una solución entre estas podría iniciar una transferencia SPI impulsada por interrupción en EXTI y volver a habilitar EXTI cuando se transfieran bytes.

También hay muchas otras soluciones, solo elija una que se adapte al flujo de su programa y haga el trabajo sin agregar demasiada complejidad.

Su enfoque debería funcionar. El enfoque en el otro hilo es cuestionable, en mi humilde opinión. Con una velocidad de reloj de 5 MHz, usar DMA no tiene sentido, considerando que MCU es solo 64 MHz.

@Justme 4.8 us, no ms! A 64 MHz son solo 300 ciclos de MCU. Configurar y procesar DMA llevará más que eso, especialmente si se usa HAL
No veo que sea cuestionable, creo que es una idea extremadamente sofisticada, podría ser extremadamente exagerada para una situación simple. La transferencia de 24 bits a 5 MHz lleva 4,8 microsegundos, por lo que si el sistema puede manejar eso, la interrupción puede bloquearse durante la transferencia, entonces está bien. Por alguna razón, es posible que no desee eso, y la configuración de DMA será mucho más rápida que 300 ciclos de MCU. Entonces, SPI a través de interrupciones o DMA podría comenzar a tener sentido de repente. Todo depende de qué más tiene que hacer el sistema, cuánto es el tiempo de respuesta y si las operaciones asincrónicas basadas en eventos se adaptan mejor.