STM32 timer Synchronisierung: TIM1 als Takterzeuger für TIM2

OP #3539012
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
}
Angehängte Dateien:

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.