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

3

Recibo información conflictiva sobre si puedo usar interrupciones activadas por nivel (en lugar de activadas por el borde) con el microcontrolador STM32F1xx.

En las Bibliotecas Periféricas 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_Falling y EXTI_Trigger_Rising_Falling . (no se mencionan las interrupciones activadas por nivel)

De acuerdo con los foros de ayuda de ST aquí y También, el RM0008 de ST no hace mención al Manual de referencia de interrupciones activadas por nivel.

Por otro lado:

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

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

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

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 realmente. No me importa pasar por alto las bibliotecas periféricas estándar, pero no veo ningún registro apropiado para usar ...

Soy mi caso específico, me estoy conectando 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 desean una activación por flanco.

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

    
pregunta bitsmack

1 respuesta

2

Al usar un STM32F407 (que parece tener un enfoque EXTI similar), en el pasado he atacado un problema similar al usar una combinación de gestión de tareas RTOS e interrupciones activadas por el borde.

El núcleo fue una tarea de alta prioridad que se ejecuta con alta prioridad para el servicio de comunicaciones no solicitadas desde el SoC.

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

Si la línea de interrupción permanecía activada después de un paso de la rutina de servicio, entonces la verificación de nivel detectaría eso y la rutina de servicio se ejecutaría nuevamente.

    
respondido por el markt

Lea otras preguntas en las etiquetas