Gast
#6965725
Hallo, mein EXIT0 auf PA0 wird stets doppelt ausgeführt. Woran kann das liegen?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
|
Anzeige
|
EXTI wird doppelt ausgeführt
Gast
#6965725
Hallo, mein EXIT0 auf PA0 wird stets doppelt ausgeführt. Woran kann das liegen?
Gast
#6965729
Spock der Vulkanier schrieb: > Woran kann das liegen? Kontaktprellen. Oder du verlässt die ISR zu schnell nach "pending löschen". Das ist möglich, weil die CPU schneller rennt, als der Interrupt Controller. Spock der Vulkanier schrieb: > Woran kann das liegen? Was ist die Interruptquelle? Wie sieht das reale Signal am Interrupteingang aus?
Gast
#6965748
Ich habe mich getäuscht. Nach dem initialisieren wird der immer einmal ausgelöst. Warum ist das so? Der Interrupt bin ist Input, mit Pullup, EXTI0, PA0 und mit einem anderen Pin verbunden, Output und vor dem initialisieren des EXTI auf HIGH gesetzt. Der EXTI wird dann auf fallende Flanke konfiguriert.
Beitrag #6965756 wurde von einem Moderator gelöscht.
Gast
#6965761
Ich vermute, dass deine ISR sofort nach dem Freigeben in EXTI->IMR
aufgerufen wird, noch bevor du das Pending-Flag löschst. Und das
passiert wohl, weil der Pin vorher mal kurz auf LOW war, nämlich bevor
der Pullup aktiviert wurde.
Tausche mal die Reihenfolge:
> EXTI->IMR |= EXTI_IMR_MR0; //Interrupt
Ist wie gesagt nur eine Vermutung.
Gast
#6965789
Stefan ⛄ F. schrieb: > Das sollte zum Schluss kommen, nachdem alle anderen Parameter > konfiguriert sind. Das ändert leider nichts. Direkt nach > EXTI->IMR |= EXTI_IMR_MR0; wird in PR das Flag gesetzt und der Interrupt ausgelöst, obwohl das Signal High ist. Spock der Vulkanier schrieb: > Direkt nach >> EXTI->IMR |= EXTI_IMR_MR0; > wird in PR das Flag gesetzt und der Interrupt ausgelöst Das Init sollte natürlich unter Interruptsperre erfolgen.
Gast
#6965822
Stefan ⛄ F. schrieb: > Tausche mal die Reihenfolge: > EXTI->IMR |= EXTI_IMR_MR0; //Interrupt Das fehlte der Rest des Satzes: Tausche mal die Reihenfolge: EXTI->IMR |= EXTI_IMR_MR0; //Interrupt soll zum Schluss kommen. Ich nehme an, dass hast du bereits so verstanden. Peter D. schrieb: > Das Init sollte natürlich unter Interruptsperre erfolgen. Hilft das? Er hat den EXTI0_IRQn im NVIC ja schon erst nach dem Löschen des Pending Flags freigegeben. Spock der Vulkanier schrieb: > if (gpfIsr) { > gpfIsr(); > } Sowas sollte eine Warnung ergeben. Kann denn eine Funktion überhaupt auf Adresse 0 gelinkt werden?
Gast
#6965855
Das Problem ist nicht gravierend, aber ich habe schon etliche Reihenfolgen probiert, es ändert sich nichts. Ich forsche mal weiter. PA0 ist mit PA8 verbunden.
Gast
#6965856
Spock der Vulkanier schrieb: > Ich forsche mal weiter. Ja, halte uns auf dem Laufenden, wenn du die Erklärung oder Lösung findest. Jetzt hast Du alles recht planlos umgewürfelt. Wie gesagt, das globale Interrupt enable darf erst nach dem Init erfolgen und das pending clear als letztes vom Init. Kann sein, daß das pending clear etwas Zeit braucht, also vor dem global enable noch mal einige NOPs probieren. Bei den 32Bittern ist das Interrupthandling ja sehr komplex, da braucht es lange Laufzeiten für die Signale zum Synchronisieren. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|