Forum: Mikrocontroller und Digitale Elektronik STM32 TIM5 prescaler spezial


von dotm (Gast)


Lesenswert?

Hallo Forum!
Ich steh leider furchtbar am Schlauch, der Tag war lang und mein Hirn 
ist ein Knoten...
Ich möchte TIM5 so konfigurieren dass ich von den 32bit mindestens 14bit 
davon abgreifen kann die im Sekundentakt zählen.
Meine taktfrequenz ist 72 Mhz.
Irgendwie krieg ich da mit dem Prescaler keine geraden werte zusammen, 
Beispiel: bit17 zählt in Sekunden somit hab ich
72/65536 = 1098,632813 takte (geht natürlich nicht..) pro bit17 und dem 
Prescaler kann ich nur ganze Werte geben.
Ich hab das nämlich im Urin dass sich das sowieso mit dem 16bit 
prescaler nicht gerade ausgeht, nur weiss ich nicht wie ich das beweisen 
kann um mit diesem unsinnigen Experiment aufzuhören...
Danke fürs lesen
euer
Mikrocontrollerlehrbub.

von Uwe B. (derexponent)


Lesenswert?

beschreib mal näher was du machen willst,
mit einem 16bit Vorteiler kommst du nie auf gerade Sekunden-werte

aber der TIM5 hat ja zwei 16bit Vorteiler
(Prescaler und Periode)

warum stellst du nicht einfach mit denen ein gerades Verhältnis ein
1
z.B. für 1 Sek (72MHz / 36000 / 2000) = 1Hz
2
oder für 1 ms (72MHz / 720 / 100) = 1 kHz

und in der ISR inkrementierst du eine Globale uint32_t variable
die du dann für deine Auswertung nutzen kannst.

Uwe

von dotm (Gast)


Lesenswert?

Danke ich bn selbst drauf gekommen dass das nicht geht.
Mit dem 16bit Prescaler kann ich nicht soweit runter teilen dass ich 
miteinem 2^n prescaler (was ja bitpositionen sind) auf 1Hz komme.
Die 1Hz brauch ich ohne ISR als downcounter selbsttätig, deswegen kann 
ich das Event (Periode) nicht verwenden.
Meine Lösung (ohne APB prescaler) ist jetzt so und ist ganz einfach:
1
// Init
2
TIM_TimeBaseInitTypeDef TimerInitStructure;
3
4
  RCC_APB1PeriphClockCmd(MD_TIMER_APB, ENABLE);
5
6
  // prescaler fuer bit7= 25Hz
7
  TimerInitStructure.TIM_Prescaler = 45000; // fuer 72Mhz
8
  TimerInitStructure.TIM_CounterMode = TIM_CounterMode_Down;
9
  TimerInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
10
  TIM_TimeBaseInit(MD_TIMER_DEVICE, &TimerInitStructure);
11
12
  TIM_Cmd(MD_TIMER_DEVICE, DISABLE);
13
  TIM_InternalClockConfig(MD_TIMER_DEVICE);
14
  TIM_UpdateDisableConfig(MD_TIMER_DEVICE, DISABLE);
15
  TIM_GenerateEvent(MD_TIMER_DEVICE, TIM_EventSource_Update);
16
17
// Start
18
TIM_Cmd(MD_TIMER_DEVICE, DISABLE);
19
  TIM_ClearFlag(MD_TIMER_DEVICE, TIM_FLAG_Update);
20
  /*
21
   * weil bit 7 mit 25 Hz schaltet multipliziere ich
22
         * Die Sekunden mit 25 und schiebe sie auf bit 7
23
   */
24
  TIM_SetAutoreload(MD_TIMER_DEVICE, (((uint32_t) (25 * (measurement_interval))) << 6));
25
  TIM_SetCounter(MD_TIMER_DEVICE, 0); 
26
  TIM_Cmd(MD_TIMER_DEVICE, ENABLE);

von dotm (Gast)


Lesenswert?

Grund: der erste ganzzahlige adlib-Prescalerwert von dem aus man dann 
mittels 2^n prescaler auf 1Hz kommen würde wäre 140625 und das ist > 
2^16.

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.