Forum: Mikrocontroller und Digitale Elektronik STM32 timer Synchronisierung: TIM1 als Takterzeuger für TIM2


von Hans W. (hans_wurst)


Angehängte Dateien:

Lesenswert?

Hallo,

ich verwende den STM32F105 von STMicroelectronics. Die IDE ist CoIDE und 
die verwendeten librarys sind die von STMicroelectronics.

Ich nutze den timer TIM1, der mir im up-count-mode ein 500kHz-Signal 
erzeugt, dieses am Pin ausgibt und auch erfolgreich gemessen werden 
kann. Bei jedem counter-Überlauf wird hier der Ausgang getoggelt.

Nun möchte ich zugleich den counter-Überlauf verwenden um bei einem 
anderen timer (TIM2) jeweils um einen Takt höher zu zählen. Ich möchte 
also zählen, wie viele Flankenwechsel es am Ausgang gegeben hat.
Im Datenblatt sind dafür unter Kapitel "Timer synchronization" 
nachfolgende Punkte beschrieben, um den Takt für TIM2 aus TIM1 
generieren zu lassen:
1
To do this:
2
● Configure Timer 1 in master mode so that it outputs a periodic trigger signal on each 
3
update event UEV. If you write MMS=010 in the TIM1_CR2 register, a rising edge is 
4
output on TRGO1 each time an update event is generated.
5
● To connect the TRGO1 output of Timer 1 to Timer 2, Timer 2 must be configured in 
6
slave mode using ITR1 as internal trigger. You select this through the TS bits in the 
7
TIM2_SMCR register (writing TS=000).
8
● Then you put the slave mode controller in external clock mode 1 (write SMS=111 in the 
9
TIM2_SMCR register). This causes Timer 2 to be clocked by the rising edge of the 
10
periodic Timer 1 trigger signal (which correspond to the timer 1 counter overflow).
11
● Finally both timers must be enabled by setting their respective CEN bits (TIMx_CR1 
12
register).

An sich klingt das recht einfach. Und wenn ich mir die Register per 
Debugger ansehe, sollten alle Werte stimmen. Aber trotzdem steht im 
counter-Register vom TIM2 immer ein anderer Wert, als tatsächlich am 
Ausgang mit dem Logikanalyser gemessen werden können. In meinem Fall 
zählt er bis 33, obwohl am Ausgang 51 Flankenwechsel zu sehen sind. Wenn 
ich die Periodendauer vom TIM1 ändere, ändert das (richtiger Weise) 
nichts an der 33. Gibt es mehr als 51 Flankenwechsel/counter-Überläufe, 
steigt auch (richtiger Weise) der Wert im TIM2.

Hat jemand eine Idee, warum hier ein paar counter-Überläufe vom TIM1 
nicht mitgezählt werden?

Das hier ist mein code um TIM1 als master zu schalten und für TIM2 als 
Taktgeber zu dienen:
1
{
2
  /* TIM DISABLE counter */
3
  TIM_Cmd(TIM2, DISABLE);
4
5
  /* TIM2 clock enable */
6
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
7
8
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);
9
10
  TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
11
12
  TIM_ETRClockMode1Config(TIM2, TIM_ExtTRGPSC_OFF, \
13
    TIM_ExtTRGPolarity_NonInverted, 0x00);
14
15
  TIM_SelectInputTrigger (TIM2, TIM_TS_ITR0);
16
17
  /* TIM enable counter */
18
  TIM_Cmd(TIM2, ENABLE);
19
}

: Bearbeitet durch User
von Hans W. (hans_wurst)


Lesenswert?

Keiner hier, der die zwei Timer schon mal synchronisiert hat?

von hp-freund (Gast)


Lesenswert?

33 hex = 51 dez ??

von Hans W. (hans_wurst)


Lesenswert?

Verdammte Sch... wie blöd muss ich denn Wohl sein?!?!?!
Genau das scheint wohl mein Problem gewesen zu sein und ich habe es 
einfach nicht geschnallt. Total ärgerlich und peinlich zugleich.... 
hmmm...

Ich danke dir für den Tipp.

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.