STM32 HAL, spezifischer Interrupt im IRQHandler?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren