STM32F4 EXTI Interrupt

Gast #4806972
Lesenswert?

Ich verwende den ISR für EXTI_9_5.
Ich warte auf einen Interrupt von Pin 9 oder Pin 6.
Sobald einer der beiden Interrupts auftritt, lösche ich seinen Flag und 
sperre die beiden Interrupts. Jedoch wird anschließend mit einem 
Interrupt vom anderen Pin die ISR trotzdem ausgeführt.
Im Register sind aber beide Interrupts gesperrt.

Hat jemand eine Vermutung woran es liegen könnte?
Gast #4806994
Lesenswert?

Ist das möglich, dass diese dann trotz gesperrten Interrupt abgearbeitet 
werden?

Gibt es eine Möglichkeit das zu umgehen?

Es ist Applikationsbedingt nicht möglich das beide Pins gleichzeitig 
eine steigende Flanke zum auslösen des Interrupts haben. Dazwischen 
liegen mind. 300 us
Gast #4807004
Lesenswert?

1
void EXTI9_5_IQRHandler( void )
2
{
3
  // Rising Edge?
4
  if(EXTI->PR & EXTI_Line9)
5
  {
6

7
    // Flag löschen
8
    EXTI->PR = (EXTI_Line6 | EXTI_Line9)
9

10
    // Interrupt sperren
11
    EXTI->IMR &= ~(EXTI_Line6 | EXTI_Line9)
12

13
    // Interrupt an EXTI_Line9
14
    status |= 1;
15

16
  }
17

18
  // Rising Edge?
19
  if(EXTI->PR & EXTI_Line6)
20
  {
21
    // Flag löschen
22
    EXTI->PR = (EXTI_Line6 | EXTI_Line9)
23

24
    // Interrupt sperren
25
    EXTI->IMR &= ~(EXTI_Line6 | EXTI_Line9)
26

27
    // Interrupt an EXTI_Line6
28
    status |= 2;
29
  }
30
}
Gast #4807195
Lesenswert?

>    // Flag löschen
>    EXTI->PR = (EXTI_Line6 | EXTI_Line9)
>
>    // Interrupt sperren
>    EXTI->IMR &= ~(EXTI_Line6 | EXTI_Line9)


Ich würde die Reihenfolge umdrehen.
Sonst könnte zwischen Löschen und Sperren evtl. ein neuer Interrupt 
feuern.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren