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_Falling
y 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?
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.
mercado
bitsmack
mercado
bitsmack