Forum: Mikrocontroller und Digitale Elektronik STM32H743ZI - GPIO Interrupt mag nicht


von Dabidududuu (Gast)


Lesenswert?

Guten Morgen,

leider will mein GPIO auf eine steigende Flanke nicht reagieren obwohl 
(mit Oszi gemessen) ein klarer Takt mit ca. 500Hz am GPIO anliegt 
(zwischen 0 und 3.3V) - auch wenn ich mit einem Jumper Wire manuell 
einen Kontakt zu 3.3V herstelle wird der Interrupt nicht angesprungen.

Die Konfiguration sieht wie folgt aus:
1
  GPIO_InitTypeDef drdy_typedef;
2
  drdy_typedef.Pin = GPIO_PIN_15;
3
  drdy_typedef.Mode = GPIO_MODE_IT_FALLING;
4
  drdy_typedef.Pull = GPIO_NOPULL;
5
  HAL_GPIO_Init(GPIOD, &drdy_typedef);
6
7
  /* EXTI interrupt init*/
8
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
9
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

Das ist die Interrupt-Routine:
1
void EXTI15_10_IRQHandler(void) {
2
3
  std::cout << "Toggle\r\n";
4
  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
5
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
6
7
}

Hat jemand eine Idee, warum das nicht tut?

von Johannes S. (Gast)


Lesenswert?

wenn du dir den Luxus der C++ iostream leistest, dann vermute ich mal 
das ein "extern C" vor dem IRQ_Handler fehlt.

von Dabidududuu (Gast)


Lesenswert?

Wow...vielen Dank 😍

von Besorgter (Gast)


Lesenswert?

Johannes S. schrieb:
> wenn du dir den Luxus der C++ iostream leistest, dann vermute ich mal
> das ein "extern C" vor dem IRQ_Handler fehlt.

Mir kommt es schon mal vorsorglich sehr dümmlich vor eine
Zeichen- bzw. Stringausgabe in der Interrupt-Routine zu tätigen ...

von PittyJ (Gast)


Lesenswert?

Besorgter schrieb:
> Johannes S. schrieb:
>> wenn du dir den Luxus der C++ iostream leistest, dann vermute ich mal
>> das ein "extern C" vor dem IRQ_Handler fehlt.
>
> Mir kommt es schon mal vorsorglich sehr dümmlich vor eine
> Zeichen- bzw. Stringausgabe in der Interrupt-Routine zu tätigen ...

Mache ich beim Debuggen auch manchmal. Einfach nur um zu sehen, ob man 
bis dorthin kommt. Wenns geht, wird die Ausgabe sofort entfernt.

von Besorgter (Gast)


Lesenswert?

Dabidududuu schrieb:
> ein klarer Takt mit ca. 500Hz am GPIO anliegt

Dann wird das sowieso nichts mit der Zeichen- bzw. Stringausgabe.
Das wird das "Ausgabegerät" mit 500Hz vermutlich schnell in die
Knie gehen. Und damit der ganze Controller im Interrupt-Bedienen
festhängen.

Dabidududuu schrieb:
> auch wenn ich mit einem Jumper Wire manuell
> einen Kontakt zu 3.3V herstelle

Wenn man zufällig ein Eval-Board damit quält kommt es nur
allzu leicht vor dass man einen Pin erwischt der bereits eine
Verbindung zu einem Peripherie-Bauelement auf dem Board hat
und dieses externe Bauteil könnte dann auch mal Magic Smoke
entwickeln.

von Besorgter (Gast)


Lesenswert?

PittyJ schrieb:
> Mache ich beim Debuggen auch manchmal.

Dann ist das vielleicht bei dir auch sehr dümmlich. Zumal man
das mit einfachen Mitteln leicht anders machen kann.

von PittyJ (Gast)


Lesenswert?

Besorgter schrieb:
> PittyJ schrieb:
>> Mache ich beim Debuggen auch manchmal.
>
> Dann ist das vielleicht bei dir auch sehr dümmlich. Zumal man
> das mit einfachen Mitteln leicht anders machen kann.

Würde ich gerne wissen wie.

Meine Platine (wird später in eine Maschine eingebaut) ist Standalone 
aufgebaut, hat keinen Debugger-Anschluss oder ähnliches.
Ich kann Firmware aufspielen, und über TTY verfolgen, was sie tut.

Was empfiehlt mir also der Fachmann? Welche einfachen Mittel?

von Besorgter (Gast)


Lesenswert?

PittyJ schrieb:
> Würde ich gerne wissen wie.

- globales volatile Flag anlegen.
- in der ISR das Flag setzen wenn gebraucht
- in der Hauptschleife das Flag auswerten und danach handeln
- in der Hauptschleife das Flag löschen

von PittyJ (Gast)


Lesenswert?

Besorgter schrieb:
> PittyJ schrieb:
>> Würde ich gerne wissen wie.
>
> - globales volatile Flag anlegen.
> - in der ISR das Flag setzen wenn gebraucht
> - in der Hauptschleife das Flag auswerten und danach handeln
> - in der Hauptschleife das Flag löschen

So mache ich das für normale Sachen.

Aber für quick and dirty mal nachschauen, ob er überhaupt in den 
Interrupt kommt, dann pack ich auch kurzzeitig mal eine TTY Ausgabe in 
den Interrupt.
Geht schneller uns einfacher als über 3 Module noch Flags auszutauschen.

von Peter D. (peda)


Lesenswert?

PittyJ schrieb:
> Aber für quick and dirty mal nachschauen, ob er überhaupt in den
> Interrupt kommt

Ich gehe einfach mit der Maus an die Stelle und sage dem Debugger "Goto 
Cursor".
Es ist dann auch sehr schön zu sehen, wenn man nicht das richtige Flag 
löscht, wie er sofort wieder vom Ende zum Anfang des Handlers springt.
Ohne Debugger merkt man nur, daß die Mainloop nie mehr ausgeführt wird.

von Besorgter (Gast)


Lesenswert?

PittyJ schrieb:
> So mache ich das für normale Sachen.

Warum fragst du dann so dümmlich wenn du schon alles weisst?

PittyJ schrieb:
> Würde ich gerne wissen wie.

von PittyJ (Gast)


Lesenswert?

Besorgter schrieb:
> PittyJ schrieb:
>> So mache ich das für normale Sachen.
>
> Warum fragst du dann so dümmlich wenn du schon alles weisst?
>
> PittyJ schrieb:
>> Würde ich gerne wissen wie.

Weil ich wissen wollte, ob es auch für mein Debug-Problem ein bessere 
Lösung gibt.
Hier sind ja so viele Oberlehrer unterwegs, vielleicht gibt es ja auch 
welche mit etwas Hintergrund-Wissen?

von nein (Gast)


Lesenswert?

n.

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.