Timer config Stm32

Gast #3408085
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 ?
Gast #3408179
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
}
Gast #3409434
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
#3409453
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren