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 | }
|