Forum: Mikrocontroller und Digitale Elektronik STM32 CubeMX HAL IRQHandler Channel 1-4


von Jk M. (h4l9000)


Lesenswert?

Hi,

ich habe eine Frage bzgl. Interrupts im Zusammenhang mit der HAL Lib 
(CubeMX).

Mein Timer2 hat 4 Channels. Jeder einzelne Channel soll durch "Capture 
Compare" ein Interrupt auslösen und einen entsprechenden Code ausführen.

Ich aktiviere den globalen Interrupt Handler, welcher so aussieht:
1
void TIM2_IRQHandler(void)
2
{
3
  /* USER CODE BEGIN TIM2_IRQn 0 */
4
5
  /* USER CODE END TIM2_IRQn 0 */
6
  HAL_TIM_IRQHandler(&htim2);
7
  /* USER CODE BEGIN TIM2_IRQn 1 */
8
9
  /* USER CODE END TIM2_IRQn 1 */
10
}

Mit welcher Funktion kann ich jetzt im globalen Interrupt Handler die 
einzelnen ChannelX Compares aufrufen? Sprich wenn Channel 2 einen 
Interrupt auslöst soll auch nur der entsprechende Code im globalen 
Interrupt ausgeführt werden, welcher zum Channel 2 gehört.

Ich hoffe, das ist einigermaßen verständlich.

von Harry L. (mysth)


Lesenswert?

Schau dir die HAL_TIM_xxxCallback.Funktionen an!
Im HAL-Manual für die F1xx um Seite 6871.

von Sebastian Kaulitz (Gast)


Angehängte Dateien:

Lesenswert?

Jk M. schrieb:
> Hi,
>
> ich habe eine Frage bzgl. Interrupts im Zusammenhang mit der HAL Lib

> }
>
> Mit welcher Funktion kann ich jetzt im globalen Interrupt Handler die
> einzelnen ChannelX Compares aufrufen? Sprich wenn Channel 2 einen
> Interrupt auslöst soll auch nur der entsprechende Code im globalen
> Interrupt ausgeführt werden, welcher zum Channel 2 gehört.
>
> Ich hoffe, das ist einigermaßen verständlich.

Schau mal hier im Bild siehst du, dass du die Interrupts je nach Channel 
stets aktivieren musst, indem du das Bit CC1IE für den Kanal 1 setzt. In 
der Interrupt Routine selbst dann musst du nur überprüfen ob das CC1IF 
(Flag) für den Kanal 1 aktiv ist. Du musst dieses Flag dann im Interrupt 
beim Ausführen deines Codes für den Kanal 1 auch wieder löschen. Aber 
das kannst du ja im Datenblatt deines Controllers nachlesen.

von PaSi (Gast)


Lesenswert?

Moin,

die Callback-Funktionen sind der richtige Hinweis. Wenn ich das richtig 
im Kopf habe musst du dann in der Funktion nur noch nach der 
Interrupt-Quelle unterscheiden.

Gruß

von Harry L. (mysth)


Lesenswert?

PaSi schrieb:
> Wenn ich das richtig
> im Kopf habe musst du dann in der Funktion nur noch nach der
> Interrupt-Quelle unterscheiden.

Genau so!

von Dr. Sommer (Gast)


Lesenswert?

Sebastian Kaulitz schrieb:
> Du musst dieses Flag dann im Interrupt
> beim Ausführen deines Codes für den Kanal 1 auch wieder löschen.

Achtung: Das muss so früh wie möglich in der ISR passieren, sonst kann 
der Interrupt direkt wieder ausgelöst werden...

Sebastian Kaulitz schrieb:
> In
> der Interrupt Routine selbst dann musst du nur überprüfen ob das CC1IF
> (Flag) für den Kanal 1 aktiv ist.

Es kann dabei passieren, dass mehrere Flags gleichzeitig gesetzt werden; 
die sollte man dann alle nacheinander abfragen.

von Sebastian Kaulitz (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Sebastian Kaulitz schrieb:
>> Du musst dieses Flag dann im Interrupt
>> beim Ausführen deines Codes für den Kanal 1 auch wieder löschen.
>
> Achtung: Das muss so früh wie möglich in der ISR passieren, sonst kann
> der Interrupt direkt wieder ausgelöst werden...
>
> Sebastian Kaulitz schrieb:
>> In
>> der Interrupt Routine selbst dann musst du nur überprüfen ob das CC1IF
>> (Flag) für den Kanal 1 aktiv ist.
>
> Es kann dabei passieren, dass mehrere Flags gleichzeitig gesetzt werden;
> die sollte man dann alle nacheinander abfragen.

Danke für den Hinweis

von Jk M. (h4l9000)


Lesenswert?

Vielen Dank!

ich werde es wie oben beschrieben versuchen zu implementieren.

Ich generiere mit den Compare-Interrupts ein relativ "komplexes" bzw. 
variables Output Signal. Nun benötige ich das selbe Signal nur um 180° 
Phasenverschoben auf einem weiteren Output.
Dabei habe ich nun an Channel 1 & 2 von TIM2 gedacht und dabei eben den 
globalen Interrupt(von TIM2) doppelt so oft aufzurufen.
Oder gibt es speziell für die 180° eine andere, elegantere Lösung?

Um das entsprechende Signal zu erzeugen benötige ich den 32bit Timer 
(=TIM2). Einen weiteren Timer(1,3,4,5...+globenInterrupt) mit 16bit zu 
starten ist eher ungeschickt.

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.