STM32 CubeMX HAL IRQHandler Channel 1-4

OP #5508805
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.
Gast #5508845
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.
Angehängte Dateien:
Gast #5508875
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.
Gast #5509037
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
OP #5509345
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.

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