Forum: Mikrocontroller und Digitale Elektronik Timer auf Null setzen


von har (Gast)


Lesenswert?

Hallo,

ich verwende den STM32F303 und habe ein kleines Problem mit dem Timer. 
Ich starte Timer2 mittels der Funktion void start_timer(). Der Timer 
selber funktioniert grundsätzlich.
Sobald ein bestimmtes Ereignis auftritt schalte ich den Timer mittels 
der Funktion void stop_timer() aus. Funktioniert auch noch...
Aber: wenn ich ein weiteres Mal den Timer starte, habe ich mittels Oszi 
festgestellt, dass der Timer2 scheinbar wieder da anfängt, wo er beim 
unterbrechen aufgehört hat. Offensichtlich muss ich den Wert wieder 
reseten (was beim Ausschalten des Timers scheinbar nicht automatisch 
passiert).
Aber meine Frage ist: Wie mache ich das? Wie lautet der fehlende Code 
dafür?
Danke für eure Hilfe!

1
void Timer2_Configuration(void)
2
{
3
    TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
4
5
    TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;            // CKD - Clock division: TDTS = Tck_tim
6
    TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
7
    TIM_TimeBase_InitStructure.TIM_Period = 279;                            // Theoretisch: 281250Hz / 281 = ~1KHz -> 1ms;   besser TIM_Period=279 (mit Oszi gemessen)
8
    TIM_TimeBase_InitStructure.TIM_Prescaler = 256;                         // 72MHz / 256 = 281250Hz
9
    TIM_TimeBaseInit(TIM2, &TIM_TimeBase_InitStructure);
10
11
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
12
    NVIC_EnableIRQ(TIM2_IRQn);
13
    TIM_Cmd(TIM2, DISABLE);
14
15
16
} // Timer2_Configuration
17
18
19
void TIM2_IRQHandler(void)
20
{
21
  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
22
  Timeout = 0;
23
} // void TIM2_IRQHandler
24
25
26
27
void start_timer(void)
28
{
29
    Timeout = 1;
30
    TIM_Cmd(TIM2, ENABLE);                  // Timer starten
31
}
32
33
34
35
void stop_timer(void)
36
{
37
    Timeout = 1;
38
    TIM_Cmd(TIM2, DISABLE);                  // Timer stoppen
39
}

von Waldemar Z. (waldemar_z)


Lesenswert?


von aSma>> (Gast)


Lesenswert?

Irgendsowas wie hier:
1
TIM2->CNT = 0;

von Peter D. (peda)


Lesenswert?

har schrieb:
> schalte ich den Timer mittels
> der Funktion void stop_timer() aus.

Der Name suggeriert aber nur, daß diese Funktion den Timer anhält und 
das macht sie auch, mehr nicht.
Das Timerregister ist direkt zugreifbar, man kann es jederzeit lesen 
oder setzen, also auch auf 0 setzen.

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.