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);
}