Forum: Mikrocontroller und Digitale Elektronik STM32F4 EXTI Interrupt


von STM32 (Gast)


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?

von I Inte (Gast)


Lesenswert?

Pending Interrupt?

von Jim M. (turboj)


Lesenswert?

I Inte schrieb:
> Pending Interrupt?

Gute Idee. @OP: Zeig doch mal Deinen Code, dann müssten wir hier nicht 
wild rumraten.

von STM32 (Gast)


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

von STM32 (Gast)


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
}

von I Inte (Gast)


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.

von STM32 (Gast)


Lesenswert?

Das ist die Lösung. Danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.