Stm32F4 Timer Clockdivision vs Prescaler

Gast #3106139
Lesenswert?

Hi,

ich experimentiere gerade etwas mit Chan's FatFS Lib und einer MicroSD 
am SDIO Interface rum. Als Basiscode habe ich die hier genommen.
https://docs.google.com/file/d/0B7OY5pub_GfIcU1XTDFDRlptZDg/edit

Ich habe einen Speedtest gemacht, indem ich gucken wollte wie lange es 
dauert 1Mbyte in 512Byte Blöcken in ein File zu schreiben.
Dazu habe ich mir Timer2 eingestellt.
1
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
2

3
  TIM_TimeBaseInitTypeDef tim;
4
  tim.TIM_ClockDivision = TIM_CKD_DIV1;
5
  tim.TIM_CounterMode = TIM_CounterMode_Up;
6
  tim.TIM_Period = 0xFFFFFFFF-1;
7
  tim.TIM_Prescaler = 4;
8
  tim.TIM_RepetitionCounter = 0x00;
9
  TIM_TimeBaseInit(TIM2,&tim);
10
  TIM_ARRPreloadConfig(TIM2,ENABLE);
11

12
  TIM_Cmd(TIM2,ENABLE);
13
  TIM_SetCounter(TIM2,0);
14

15

16
  for(unsigned int i=0;i<2048;i++)
17
  {
18
    res = f_write(&fil,(void*)data,512,&lenght);
19
    if(res != FR_OK)
20
    {
21
      int a = 12;
22
      int b = 12;
23
      int c = a+b;
24
      while(1){;}
25
    }
26
  }
27

28
  unsigned int out_counter = TIM_GetCounter(TIM2);
29
  TIM_Cmd(TIM2,DISABLE);

Timer2 läuft mit 84Mhz, die auf 21Mhz geteilt werden. Der Counterwert 
wird am ende durch 21Mhz geteilt, dann erhält man die Sek. Anzahl.

Aber hier ist das Problem. Zuerst hatte ich den Timer mit der 
CLock_Division durch 4 geteilt und den Prescaler auf 1. Aber hier 
erhalte ich falsche Ergebnisse, und zwar genau den doppelten Wert.

Wenn ich Clock_Division auf 1 und Prescaler auf 4 setzte, wie oben, dann 
funktioniert alles richtig.

Dabei müsste es doch das gleiche sein, oder habe ich da einen 
Denkfehler?

MfG
GamerBoy
Gast #3106459
Lesenswert?

Moin,

ja stimmt, das hatte ich vergessen. Prescaler ist immer Wert-1. Aber mit 
Prescaler 0 und Divisor von 4 komme ich auf 30,5 Sek, bei eigentlich nur 
so ca 7sek.
1
  TIM_TimeBaseInitTypeDef tim;
2
  tim.TIM_ClockDivision = TIM_CKD_DIV4;
3
  tim.TIM_CounterMode = TIM_CounterMode_Up;
4
  tim.TIM_Period = 0xFFFFFFFF-1;
5
  tim.TIM_Prescaler = 0;
6
  tim.TIM_RepetitionCounter = 0x00;
7
  TIM_TimeBaseInit(TIM2,&tim);
8
  TIM_ARRPreloadConfig(TIM2,ENABLE);
Gast #3666235
Lesenswert?

Der Prescaler gibt an, wieviele Timer-Clock-Ticks gezählt werden sollen, 
bis TIMx->CNT eins weiter gezählt wird, dh bei Prescaler = 0 wird mit 
jedem Timer-Clock-Tick auch der Timercounter eins weitergezählt. Bei 
Prescaler = 5 wird der Counter nur mit jedem (Prescaler + 1, also 5 + 1) 
6. Timer-Clock-Tick eins weitergezählt. So hab ichs ausm Datenblatt 
gelesen.

Was Clockdivision angeht, siehe Datenblatt (TIM1&TIM8 control register 1 
(TIMx_CR1)):

Bits 9:8
CKD[1:0]: Clock division
This bit-field indicates the division ratio between the timer clock 
(CK_INT) frequency and the dead-time and sampling clock (tDTS)used by 
the dead-time generators and the digital filters (ETR, TIx),
00: tDTS=tCK_INT
01: tDTS=2*tCK_INT
10: tDTS=4*tCK_INT
11: Reserved, do not program this value

Clockdivision ist also eher uninteressant für die meisten Anwendungen :)

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