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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.