Forum: Mikrocontroller und Digitale Elektronik Stm32F4 Timer Clockdivision vs Prescaler


von GamerBoy (Gast)


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

von Moritz M. (moritz_m35)


Lesenswert?

Hallo,

ich weiß leider auch nicht mehr so genau wie das war. Aber ich glaube es 
gab da was, das Prescaler = (eigentliche Prescaler) - 1 oder so. Damit 
ist der Prescaler 0 eigentlich Prescaler 1 uns so. Versuch den Prescaler 
mal auf 0 zu setzen.

Moritz

von GamerBoy (Gast)


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);

von seb (Gast)


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 :)

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.