Forum: Mikrocontroller und Digitale Elektronik STM32 HAL, spezifischer Interrupt im IRQHandler?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Robert (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Guten Morgen,
ich würde gerne mal komplett verstehen wie ich mit Interrupts arbeite im 
Zusammenhang mit der HAL-Lib und CubeMX.

Sei es SPI oder ein Timer, in CubeMX kann ich im Reiter NVIC Settings 
immer nur einen Globalen Interrupt Handler aktivieren der z.B. dann so 
aussieht:
1
/**
2
 * @brief This function handles TIM3 global interrupt.
3
 */
4
void TIM3_IRQHandler(void) {
5
  /* USER CODE BEGIN TIM3_IRQn 0 */
6
7
  /* USER CODE END TIM3_IRQn 0 */
8
  HAL_TIM_IRQHandler(&htim3);
9
  /* USER CODE BEGIN TIM3_IRQn 1 */
10
11
  /* USER CODE END TIM3_IRQn 1 */
12
}

Dieser wird auch aufgerufen. Allerdings, wenn ich es richtig verstanden 
habe, bei jedem möglichen Interrupt. Was aber wenn ich zum Beispiel nur 
bei einem Timer Überlauf etc. handeln möchte? Wie Frage ich ab um 
welchen Interrupt es sich überhaupt handelt?

MfG.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Anhang:

Auch öfters gefragt habe ich mich wo denn mein Code hinkommt in dieser 
Funktion.

Vor- oder nach dem Funktionsaufruf:
1
HAL_TIM_IRQHandler(&htim3);

MfG.

von hp-freund (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

Robert schrieb:
> Wie Frage ich ab um
> welchen Interrupt es sich überhaupt handelt?

gar nicht, wenn Du nicht willst. Das ist das Gute an HAL.
Wenn Du z.B. die Funktion "HAL_TIM_IRQHandler" in ihrer Definition in 
der
"stm32XXxx_hal_tim.c" betrachtest, wird diese in diverse Callback 
Funktionen aufgeteilt. Diese kannst Du einfach wo anders z.B. in der 
"main.c" definieren, da sie als "weak" vorgegeben sind.
Siehe die diversen Beispiele in den HAL Libs.

Robert schrieb:
> Auch öfters gefragt habe ich mich wo denn mein Code hinkommt in dieser
> Funktion.

Daraus ergibt sich das Du in die Funktion in der "stm32XXxx_it.c" 
schreiben kannst, aber nicht musst.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
die Callbacks sind eine schöne Sache aber doch unvollständig?

Z.B, in der HAL Dokumentation sind unter Timer folgende Callbacks 
genannt:
1
HAL_TIM_PeriodElapsedCallback()
2
HAL_TIM_OC_DelayElapsedCallback()
3
HAL_TIM_IC_CaptureCallback()
4
HAL_TIM_PWM_PulseFinishedCallback()
5
HAL_TIM_TriggerCallback()
6
HAL_TIM_ErrorCallback()

Momentan nutze ich einen Timer im Input Capture Direct Mode und möchte 
ein einziges Interrupt nach einer Anzahl an gezählten Impulsen 
ausführen.

IC Mode also...
1
HAL_TIM_IC_CaptureCallback()
Dieses wird aber soweit festgestellt nach jedem Impuls getriggert. Und 
nicht erst nach Anzahl X.

Wo sind die Callbacks für z.B. einen Timer Überlauf^^?

Sorry für Dummheit.
MfG.

von hp-freund (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Robert schrieb:
> Dieses wird aber soweit festgestellt nach jedem Impuls getriggert. Und
> nicht erst nach Anzahl X.

Dann inc/dec in dieser eine Variable und werte sie aus.
So legst Du ganz einfach die Anzahl fest.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Hilfe :)

Das ist die Art und Weise wie ich es momentan mache. Ich hätte mir 
gewünscht das ganze etwas "schöner" umzusetzen um den Prozessor nicht 
jeden Puls zu blockieren. Sondern nur einmal nach x-Pulsen.

In diesem Thread sagte man mir es ginge mit einem zweiten Timer.
Beitrag "STM32 HAL, n-Anzahl an PWM Pulsen?"

Mit freundlichen Grüßen,
Robert

von C. W. (chefkoch)


Bewertung
0 lesenswert
nicht lesenswert
Wenn Du nur eine definierte Anzahl an Pulsen zählen möchtest könntest Du 
diese als Clock nehmen und über die Vorgabe der Periods bei erreichen 
dieser den HAL_TIM_PeriodElapsedCallback feuern.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Tut mir leid aber ich finde einfach keine Informationen in den Dokus.

Leider wird das:
HAL_TIM_PeriodElapsedCallback

Von meinem Timer im Input Capture Mode nicht getriggert :(

Und ich kann in CubeMX bei meinen Timern leider überall nur "internal 
clock" auswählen und habe keine Vorstellung wie ich meinen PWM-Ausgang 
von TIM2 auf einen anderen Timer als CLK schalte.

MfG :/

von hp-freund (Gast)


Bewertung
0 lesenswert
nicht lesenswert

von Ruediger A. (Firma: keine) (rac)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ein "Rundum Sorglos Paket" zur Interruptbehandlung wirste nicht kriegen, 
auch wenn es manche Vertriebler gerne so darstellen möchten... bei 
manchen Peripherien wird ein Interrupt aus verschiedenen Gründen 
ausgelöst, und Du musst erst durch Rumstochern in Registern 
herausfinden, welche Quelle ausgelöst hat. Manchmal wird dabei auch dann 
der anstehende Interrupt dieser Quelle zurückgesetzt, manchmal nicht. 
Zuweilen verhalten sich auch PODs derselben Grundfamilie da radikal 
anders.

Das könnte zwar ein Hersteller in seiner HAL wegabstrahieren, allerdings 
gibt es auch dann noch Fälle, in denen Du per Hand eingreifen musst. 
Standardbeispiel: Wenn der Tx Interrupt eines UARTs schon auslöst, wenn 
das letzte Zeichen in das Barrel Shift Register gestopft wird, kannst Du 
den Interrupt NICHT dazu verwenden, die Datenrichtung in HD RS485 PHYs 
umzuschalten, weil dann das letzte Zeichen abgeschnitten wird*. In 
soclhen Fällen helfen die HAL Abstraktionen nichts.

Sorry...

* Klar gibt es dann irgendwelche Genies, die das Problem durch das 
Senden eines Dummyzeichens am Ende des Datenstromes meinen lösen zu 
können, aber ja, man kann auch Fusspilz durch Amputation kurieren.

von hp-freund (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe Timer1 als 1kHz PWM mit 150µs Puls konfiguriert.
Timer 2 als "gated Slave" mit 100kHz PWM und 2µs Puls.
Das läuft über internen TRG0.

von hp-freund (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Noch einmal im Detail.
Ohne Interrupts, alles in CubeMX einstellbar.
Lediglich die beiden PWM in der "main.c" gestarted.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.