Forum: Mikrocontroller und Digitale Elektronik Timerflag richtig auslesen / zurücksetzen


von Lars (Gast)


Lesenswert?

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

von Purzel H. (hacky)


Lesenswert?

Es gibt doch sicher irgendwo Beispielcode zu diesem Controller, zB eine 
Appnote des Herstellers, eine Webseite ? Was steht im Datenblatt ?

von Lars (Gast)


Lesenswert?

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.

von Pappnase (Gast)


Lesenswert?

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]

von ISR (Gast)


Lesenswert?

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.

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.