STM32, Interrupt Flag löschen ohne Abfrage?

OP #1815973
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
Gast #3769453
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
  }
}

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