STM32 HAL, spezifischer Interrupt im IRQHandler?

Gast #4895171
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.
Gast
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.
Gast
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.
Gast
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.
Gast
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 :/
(Firma: keine)
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.