2016-04-01 6 views
3

Wie ich 2 Interrupts mit einem Handler durch diesen Code unten haben könnte:STM32 Interrupt Handeling wenn Bedingung

SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PB | SYSCFG_EXTICR1_EXTI1_PC; 
EXTI->IMR = EXTI_IMR_MR0 | EXTI_IMR_MR1; 
EXTI->RTSR = EXTI_RTSR_TR0| EXTI_RTSR_TR1; 
/* Configure NVIC for External Interrupt */ 
/* (6) Enable Interrupt on EXTI0_1 */ 
/* (7) Set priority for EXTI0_1 */ 
NVIC_EnableIRQ(EXTI0_1_IRQn); /* (6) */ 
NVIC_SetPriority(EXTI0_1_IRQn,0); /* (7) */ 

Dies ist der Code, der Handler excecute:

void EXTI0_1_IRQHandler(void) 
{ 
    if ((EXTI->PR & EXTI_PR_PR1) == EXTI_PR_PR1) /* Check line 1 has triggered the IT */ 
    { 
    EXTI->PR = EXTI_PR_PR1; /* Clear the pending bit */ 
    GPIOC->ODR |= 1<<0; 
    } 
    if ((EXTI->PR & EXTI_PR_PR0) == EXTI_PR_PR0) /* Check line 0 has triggered the IT */ 
    { 
    EXTI->PR = EXTI_PR_PR0; /* Clear the pending bit */ 
    GPIOC->ODR &= ~(1<<0); 
} 
} 

Der Code funktioniert gut, wenn Ich klicke auf die Taste, die an PC1 angeschlossen ist, die LED leuchtet auf und wenn ich auf die Taste klicke, die an PB0 angeschlossen ist, erlischt die LED. In meinen if-Strukturen überprüfe ich, welche Leitung aktiv ist, aber ich möchte auch, dass die LED nur durch Klicken auf PC1 und nicht durch einen Klick auf einen anderen Pin auf Leitung 1, gleich für Leitung 0, aber ich weiß nicht, wie ich kann ändere die Bedingungen für die if-Strukturen.

Der Mikrocontroller ist ein STM32F091.

+0

So sagen Sie, dass Sie auf LED mit dieser Linie drehen GPIOC-> ODR & = ~ (1 << 0); ? –

+0

Ich bin misstrauisch gegenüber diesem && (GPIOB-> IDR & GPIO_IDR_0). –

+0

Ja sorry, das war etwas, das ich ausprobiert habe, aber ich entferne diesen Teil des Codes, gibt es irgendwelche Vorschläge, die ich verwenden kann? Ich bearbeite den Code in meiner Frage;) – Sandeerius

Antwort

0
  1. Erstens: Sie können nicht mehr als einen Pin (A..Fx) pro EXTIx-Leitung anschließen (siehe RM0091 Seite 177). Also EXTI Zeile 0 IRQ entspricht genau einem Pin: C0 in Ihrem Code.
  2. Zweitens: Verwenden Sie keine IRQs für Serving-Schaltflächen. Sie müssen den Bounce-Filter implementieren, und die beste Idee dafür ist der Pin-Status der Check-Taste nach Timer. Menschliche Reaktion ist ungefähr 200ms, wirklich gedrückter Knopf produziert Impuls mit der Dauer 100-200ms. Sie müssen also mit 12-24ms Timer und zwei Bytes im RAM für jede Taste ... Codebeispiel Siehe unten:

    uint8_t btn_state = (uint8_t)0x0, btn_mask = (uint8_t)0x1; 
    void some_tim_irq_handler(void) 
    { 
        if (GPIOC->IDR & (uint16_t)0x1) { // PC0 up 
         btn_state |= btn_mask; 
        } else {       // PC0 down 
         btn_state &= (uint8_t)~btn_mask; 
        } 
        btn_mask <<= (uint8_t)0x1;  // mask cycle 
        if (btn_state == (uint8_t)0x0) { 
         // One state 
         return; 
        } 
        if (btn_state == (uint8_t)0xFF) { 
         // Second state 
        } 
    }