Forum: Mikrocontroller und Digitale Elektronik Timer config Stm32


von Sase (Gast)


Lesenswert?

Hallo bin mir nicht sicher aber könnt ihr mir schreiben ob hier was 
falsch ist ?

Ich will einen 1 ms Timer haben, mein System_clk ist 72 Mhz aber 
irgendwie kommt nicht so das wie erwartet.



  TIM_TimeBaseStructure->TIM_Prescaler = 360 - 1; // 72 MHz / 360 = 200 
khz
  TIM_TimeBaseStructure->TIM_Period = 200 - 1;    // (1/200khz) * 200 = 
1 ms;

Kann man mit Hterm das erfassen ?

von Nils P. (ert)


Lesenswert?

Wie groß sind deine APB2 prescaler und APB prescaler?

von Sase (Gast)


Lesenswert?

/2, 4 ,8, 16

was hat es damit auf sich ?

von Pete K. (pete77)


Lesenswert?

Ich verlinke mal das hier:
http://diller-technologies.de/stm32.html

von Sase (Gast)


Lesenswert?

mhh interessant , wenn ich TIM2_Tick >= 1000 so lasse ,dann blinkt meine 
LED so schnell das ich sie nicht erfassen kann aber eigentlich 
1ms*1000=1s sollte sie ja jede Sekunde blinken .

Wenn ich TIM2_Tick >= 1000000 mache dann blinkt die LED in 34 Sek 30 
mal....irgendwas ist faul.....

1
void TIM2_IRQHandler(void)
2
{
3
  static int TIM2_Tick = 0;  
4
5
        TIM2_Tick++;
6
 
7
        if (TIM2_Tick >= 1000) // 1 Second
8
        {
9
          if(check == 0)
10
          {
11
            STM_EVAL_LEDOn(LED1);
12
            check=1;
13
          }
14
          else
15
          {
16
            STM_EVAL_LEDOff(LED1);
17
            check =0;
18
          }
19
          
20
          TIM2_Tick = 0;
21
        }
22
  
23
}

von Lutz H. (luhe)


Lesenswert?

Sase schrieb:
> if(check == 0)

wo wird check gesetzt, davon ist das an, aus abhängig.

von Sase (Gast)


Lesenswert?

in der main

check=0;

von Karl H. (kbuchegg)


Lesenswert?

Zeig mal den möglichst vollständigen Code.

von Sase (Gast)


Lesenswert?

1
void Config_Timer(TIM_TimeBaseInitTypeDef *TIM_TimeBaseStructure, NVIC_InitTypeDef *NVIC_InitStructure)
2
{
3
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
4
    
5
 /* Enable the Timer2 Interrupt */
6
  NVIC_InitStructure->NVIC_IRQChannel = TIM2_IRQn;                          //  configure the Timer2 interrupts
7
  NVIC_InitStructure->NVIC_IRQChannelPreemptionPriority = 0;   //  sets the priority group of the TIMER2 interrupts
8
  NVIC_InitStructure->NVIC_IRQChannelSubPriority = 1;                    //  set the subpriority inside the group
9
  NVIC_InitStructure->NVIC_IRQChannelCmd = ENABLE;                            //  TIMER2 interrupts are globally enabled
10
  NVIC_Init(NVIC_InitStructure);        
11
    
12
    /* Configure Timer which is every 1 ms active*/
13
  TIM_DeInit(TIM2);
14
  TIM_TimeBaseStructInit(TIM_TimeBaseStructure);
15
 
16
  /* Time base configuration */
17
  TIM_TimeBaseStructure->TIM_Prescaler = 360 - 1; // 72 MHz / 360 = 200 khz
18
  TIM_TimeBaseStructure->TIM_Period = 200 - 1;    // (1/200khz) * 200 = 1 ms;
19
  TIM_TimeBaseStructure->TIM_ClockDivision = 0;
20
  TIM_TimeBaseStructure->TIM_CounterMode = TIM_CounterMode_Up;
21
  TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure);
22
    
23
 
24
    
25
  /* Enable TIM2 Update Interrupt */
26
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
27
 
28
  /* Enable TIM2 */
29
  TIM_Cmd(TIM2,ENABLE);
30
         
31
}
32
33
34
35
void TIM2_IRQHandler(void)
36
{
37
    static int TIM2_Tick = 0; 
38
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
39
  
40
     TIM2_Tick++;
41
42
        if (TIM2_Tick >= 1000) // 1 Second
43
                {
44
                    if(check == 0)
45
                    {
46
                        STM_EVAL_LEDOn(LED1);
47
                        check=1;
48
                    }
49
                    else
50
                    {
51
                        STM_EVAL_LEDOff(LED1);
52
                        check =0;
53
                    }
54
                    
55
                    TIM2_Tick = 0;
56
        }
57
}

Hab gemerkt das ich den Interrupt zurücksetzen muss und habe noch meinen 
Handler mit TIM_ClearITPendingBit(TIM2, TIM_IT_Update); ergänzt aber 
dennoch bekomme ich 10 Ticks bei 19 Sekunden

von A. B. (funky)


Lesenswert?

Da fehlt noch die Konfiguration deiner Clocks.
Es gibt von ST ein Excel Sheet mit dem man das sehr übersichtlich 
einstellen kann.
Der Timer2 Takt hängt vom APB1 Prescaler ab, und ich vermute mal, dein 
Timer läuft nicht mit 72MHz sondern mit 36MHz(falls der Controller 
selbst denn wirklich mit 72MHz läuft)

: Bearbeitet durch User
von Sase (Gast)


Angehängte Dateien:

Lesenswert?

Also ich habe mal meinen SystemCoreClock ausgegeben und de Betrug 72Mhz

allerdings könntest was dran sein, was du sagst.

Beim TIM2 Eingang ist 36Mhz beim Ausgang aber 72Mhz....nun was ist da 
richtig ?

von A. B. (funky)


Lesenswert?

Das ist ja nur ein Beispiel und hat nix mit dem zu tun was tatsächlich 
bei dir Konfiguriert ist.

von Sase (Gast)


Lesenswert?

für die STM32F1XX gibts leider kein clock config Excel

von A. B. (funky)


Lesenswert?

Oh, stimmt ja. Ich war irgendwie beim F2 da ich mehr mit dem zu tun 
habe.

Dann wie von Pete K. schon vorgeschlagen:
http://diller-technologies.de/stm32.html#takt

Und wenn man mal von den Standardeinstellung ausgeht, dann scheint der 
Timer wirklich mit 36MHz zu laufen, aber da musste mal schauen was bei 
dir eingestellt ist.

von Lukas (Gast)


Lesenswert?

Wie kann ich das am besten feststellen ?

Einfach nen LED Blinker machen ?

von Nils P. (ert)


Lesenswert?

Debugger dran? Dann schau in die Register. Wenn nicht, LED dran, 10Sek 
einstellen & Uhr daneben, sei ein bisl kreativ :-)

von A. B. (funky)


Lesenswert?

Benutzt du ein Discovery Board? Dann wär der Debugger dabei.

Oder womit entwickelst du?

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.