STM32 TIM5 prescaler spezial

Gast #3768996
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.
#3769741
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
Gast #3769882
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);

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