Timerflag richtig auslesen / zurücksetzen

Gast #2616667
Hallo,

ich hab ne Frage zu meinem Programmcode. In der Interrupt-Routine setze 
ich das Interruptflag und in der main while(1) Schleife frage ich ab, ob 
dieses Flag gesetzt wurde oder nicht und setz das Flag ggf. zurück auf 
Null.

Ist dieses Zurücksetzen so richtig, oder muss ich hierfür die Interrupts 
kurzzeitig ausschalten?
1
void TIM1_UP_IRQHandler (void) 
2
{
3
  unsigned int state = 0x00; 
4

5
  if ((TIM1->SR & 0x0001) != 0) 
6
  { // check interrupt source   
7

8
    state = GPIOE->IDR; 
9
    if(state & (1 << 13))  
10
    {
11
      interrupt = 1; //set interrupt-flag   
12

13
    }
14
    
15
     TIM1->SR &= ~(1<<0);  // clear UIF flag    
16
  }
17
}
18

19

20
unsigned char TIMR_GetInState(void)
21
{
22
  if(interrupt)
23
  {
24
    interrupt = 0; 
25
    return (1);
26
  }  
27
  return(0); 
28
}
29

30

31
int main(void)
32
{
33
        
34

35
        while(1)
36
  {
37
  
38
     if(TIMR_GetInState())
39
                {
40
                   //do something
41
                } 
42
  } 
43

44
}
Als Prozessor setze ich einen STM32F103ZE ein.


Gruß
Lars
Gast
Delta Oschi schrieb:
> Es gibt doch sicher irgendwo Beispielcode zu diesem Controller, zB eine
> Appnote des Herstellers, eine Webseite ? Was steht im Datenblatt ?

Der Code funktioniert so schon, aber es kann ja sein, dass man es etwas 
anders programmieren würde, weil man z.B. verhindern muss, dass auf das 
Flag gleichzeitig von der ISR und der main-Routine zugegriffen werden 
kann.
Gast
Eigentlich mache ich es auch nicht anders, der folgende ASM-Code
zeigt allerdings, daß der Professor 2 Befehle bemüht.
1
TimeDisplay = 0;
2
    2500        movs r5, #0
3
    601D        str r5, [r3]
Gast
Lars schrieb:
> muss ich hierfür die Interrupts
> kurzzeitig ausschalten?

Nein, das ist nicht notwendig. Egal an welcher Stelle die ISR das 
Hauptprogramm (und damit die Abfrage-Funktion) unterbricht kommt es 
nicht zu einer widersprüchlicher oder undefinierten Ablauffolge oder 
Zuweisungen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.