www.mikrocontroller.net

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


Autor: Stefan Z. (derdespot)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Stefan Z. (derdespot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Inwiefern da drüber nachdenken?

Das Flag muss man schon per Software löschen!

Autor: Gregor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.