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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.