Forum: Mikrocontroller und Digitale Elektronik STM32, Interrupt Flag löschen ohne Abfrage?


von Stefan Z. (derdespot)


Lesenswert?

Hallo STM32 Freunde,
ich habe eine grundsätzliche Frage zum Thema ISR. In vielen Beispielen 
von ST wird in der ISR noch abgefragt, ob das entsprechende Interrupt 
Flag (z.B. beim Überlauf eines Timers) überhaupt gesetzt ist, anstatt es 
einfach gleich zu löschen. Ist dies nicht unnötig, da ohne Überlauf und 
ohne gesetztes Überlauf Flag die ISR erst gar nicht aufgerufen worden 
wär?

Hier ein Beispiel:

void TIM2_IRQHandler(void){
  if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    if(key_state == FALSE && GPIO_ReadInputDataBit(GPIOX, GPIO_Pin_X) == 
FALSE){
      if(press_flag == FALSE){
        press_flag = TRUE;
        // Aktion bei Tastendruck
      }
    }
    else{
      press_flag = FALSE;
    }
    key_state = GPIO_ReadInputDataBit(GPIOX, GPIO_Pin_X);
  }
}

Ist die Abfrage: " if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){ " 
nicht eigentlich unnötig?

Freu mich auf eure Antworten.

Grüße Stefan

von holger (Gast)


Lesenswert?

>Ist die Abfrage: " if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){ "
>nicht eigentlich unnötig?

Vieleicht auch mal da drüber nachdenken?

>    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

von Stefan Z. (derdespot)


Lesenswert?

Inwiefern da drüber nachdenken?

Das Flag muss man schon per Software löschen!

von Gregor (Gast)


Lesenswert?

So sind sie halt, die eingebildeten User (nicht alle) von 
mikrocontroller.net. Können sich einfach nicht vorstellen, dass es auch 
Menschen gibt, die weniger wissen als sie selbst und geben dann nur 
dumme Antworten, anstatt zu helfen.

Ja mir ist bewusst dass der Beitrag älter als 6 Monate ist, aber da 
außer dem TE vielleicht auch noch andere über diese Frage stolpern, gebe 
ich hier mal die Antwort:

In jedem IRQHandler werden mehrere Interruptquellen zusammengefasst. Um 
nun auf die richtige Interruptquelle zu reagieren, wird in der ISR als 
erstes abgefragt, um welche von den viele Interruptquellen es sich 
handelt. Dann wird der Code abgearbeitet, der für den jeweiligen 
Interrupt interessant ist.

Bsp:

void TIM2_IRQHandler(void){
  if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){
    //mach was
  }
  if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET){
    //mach was anderes
  }
}

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.