STM32 NVIC se interrumpe después de un reinicio / encendido

2

Tengo algunas señales de bajo activo que quiero interrumpir. Durante la operación normal, las interrupciones funcionan bien. Sin embargo, al reiniciar / encender solo se detecta un flanco ascendente.

En otras palabras, en el inicio, se llama a mi rutina cuando la línea de interrupción está inactiva (levantada a VDD). Si la línea está activa (LOW), la función no se llama en el inicio.

Intenté deshabilitar el activador de flanco ascendente, pero eso no ayudó.

¿Es esto esperado o estoy haciendo algo mal? ¿Cuál sería la mejor manera de solucionar este problema?

TLDR: ¿Cómo puedo hacer que se llame a mis rutinas de interrupción cuando la señal de interrupción está en un estado LOW estable en el momento del encendido?

Aquí está mi código:

#include <stm32f2xx.h>
#include "DBG.h"

void EXTI3_IRQHandler(void)
{
    DBG("EXTI3\r\n");
    EXTI->PR |= EXTI_PR_PR3;
}

void EXTI4_IRQHandler(void)
{
    DBG("EXTI4\r\n");
    EXTI->PR |= EXTI_PR_PR4;
}

void DI_interrupt_setup(void)
{
    /* enable syscfg controller clock */
    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;

    /* unmask relevant interrupt lines */
    EXTI->IMR |= EXTI_IMR_MR3 | EXTI_IMR_MR4;

    /* enable falling edge triggers */
    EXTI->FTSR |= EXTI_FTSR_TR3 | EXTI_FTSR_TR4;

    /* enable rising edge triggers */
    EXTI->RTSR |= EXTI_RTSR_TR3 | EXTI_RTSR_TR4;

    SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI3_PD;
    SYSCFG->EXTICR[1] |= SYSCFG_EXTICR2_EXTI4_PD;

    NVIC_EnableIRQ(EXTI3_IRQn);
    NVIC_EnableIRQ(EXTI4_IRQn);
}
    
pregunta Armandas

1 respuesta

2

Parece que el sistema de interrupción STM32 solo puede disparar en los bordes de la señal externa. Para ver si una señal externa ya está activa al inicio, tendrá que encuestarla explícitamente como GPIO y luego llamar al controlador correspondiente como una subrutina si está en el estado activo.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas