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?
I Inte schrieb: > Pending Interrupt? Gute Idee. @OP: Zeig doch mal Deinen Code, dann müssten wir hier nicht wild rumraten.
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
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 | }
|
> // 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.