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


von Robert (Gast)


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)


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)


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)


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)


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)


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)


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)


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)


Lesenswert?


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


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:

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:

Lesenswert?

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

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.