¿Cómo usar interrupciones activadas por nivel con STM32F1xx?

Recibo información contradictoria sobre si puedo usar interrupciones activadas por nivel (a diferencia de las activadas por borde) con el microcontrolador STM32F1xx.

En las bibliotecas de periféricos estándar compatibles con CMSIS de ST, las opciones de activación se definen en enum EXTITrigger_TypeDef, que solo incluye EXTI_Trigger_Rising, EXTI_Trigger_Fallingy EXTI_Trigger_Rising_Falling. (sin mención de interrupciones activadas por nivel)

De acuerdo con los foros de ayuda de ST aquí y aquí , un usuario conocido dice que ST solo realiza interrupciones activadas por borde.

Además, el Manual de referencia RM0008 de ST no menciona las interrupciones activadas por nivel.

Por otro lado:

El Manual de programación PM0056 de ST , Sección 4.3, establece que:

The NVIC supports (...) Level and pulse detection of interrupt signals

El mismo documento, Sección 4.3.9, brinda más detalles sobre las interrupciones activadas por nivel y por flanco.

Y la documentación oficial de ARM, Sección 4.2.9 dice:

A Cortex-M3 device can support both level-sensitive and pulse interrupts.
Pulse interrupts are also described as edge-triggered interrupts.
(...) A level-sensitive interrupt is held asserted until the peripheral
deasserts the interrupt signal.

Sin embargo, no puedo encontrar ninguna manera de configurar esto. No me importa pasar por alto las bibliotecas periféricas estándar, pero ni siquiera veo ningún registro apropiado para usar...

Soy mi caso específico, estoy interactuando con otro IC a través de SPI. Es un SOC complejo e impulsa un pin de salida para indicar que necesita atención. Se comunica con su "controlador", que está alojado en el STM32. El SOC y el controlador quieren activación de borde.

¿Cómo puedo configurar el STM32F1xx para usar interrupciones activadas por nivel?

¿Puedes proporcionar un poco más de contexto? ¿Qué fuente de interrupción quieres usar?
@markt Listo, gracias. Agregué información al final de la pregunta.
Entonces, si (el SoC) todavía quiere atención después de que se haya atendido la interrupción, ¿deja la línea de interrupción afirmada?
@markt Sí, así es. El conductor quiere permanecer dentro de su ISR, sin saltar y volver a entrar.

Respuestas (1)

Usando un STM32F407 (que parece tener un enfoque EXTI similar), en el pasado ataqué un problema similar usando una combinación de administración de tareas RTOS e interrupciones activadas por borde.

El núcleo de esto era una tarea de alta prioridad que se ejecutaba con alta prioridad para dar servicio a las comunicaciones no solicitadas del SoC.

La tarea pasó la mayor parte de su tiempo bloqueada, esperando una señal generada por una interrupción activada por borde. También caducaba periódicamente para verificar si había pasado por alto un borde de interrupción al verificar el nivel de la línea de interrupción y luego se bloqueaba nuevamente.

Si la línea de interrupción permaneciera afirmada después de pasar la rutina de servicio, la verificación de nivel la detectaría y la rutina de servicio se ejecutaría nuevamente.

Gracias Markt, eso podría ser una buena solución para mí. Todavía espero usar las interrupciones activadas por nivel de Cortex M3 :)
@bitsmack Creo que las interrupciones activadas por nivel son una opción que ofrece ARM, por lo que no necesariamente es algo que deba implementarse en cada M3/4. Tal vez husmee en otras ofertas de Cortex-M para encontrar una que implemente explícitamente la opción.