Hallo
Ich mache gerade einige versuche mit dem STM32F4 Discovery. Mit dem
Timer 2 möchte ich mit einer definierten Frequenz einen Pin toggeln. Mit
der folgenden initialisierung messe ich am Pin eine Frequenz von 32Hz,
sollte doch aber 50hz sein ? SystemCoreClock ist 168mhz, die Frequenz
vom Timer2 sollte dementsprechend 42mhz sein ? was genau mache ich
falsch ?
Michael L. schrieb:> TIM_TimeBase_InitStructure.TIM_Period = 42000000/100;
Das TIMx_ARR Register ist aber nur 16 bit breit, so das das nicht
klappen kann. Siehe Abschnitt 18.4.12 im Reference Manual (RM0090).
Matthias S. schrieb:> Das TIMx_ARR Register ist aber nur 16 bit breit, so das das nicht> klappen kann. Siehe Abschnitt 18.4.12 im Reference Manual (RM0090).
TIM2 und TIM5 sind 32 bit Timer und haben dementsprechend 32 bit
Register.
Steht auch so im genannten Abschnitt: ARR[31:16] (depending on timers)
Michael L. schrieb:> SystemCoreClock ist 168mhz, die Frequenz> vom Timer2 sollte dementsprechend 42mhz sein ? was genau mache ich> falsch ?
Wenn du bis auf PLL_M und HSE_VALUE in der ST Library sonst nichts
verändert hast läut APB1 mit 42MHz.
Allerdings wird der Takt speziell für die Timer nochmal verdoppelt auf
84MHz weil der APB Prescaler ungleich 1 ist (Reference Manual am Ende
von Abschnitt 7.2).
Jedenfalls setzt du die Periode auf 420000, d.h. mit 84MHz müsste der
Interrupt alle 0,005 Sekunden auftreten.
Wenn im Interrupt nur ein Pin getoggelt wird sollten eigentlich 100Hz
herauskommen.
Wieso bei dir 32Hz herauskommen kann ich an deinem Code nicht erkennen
weil die Interrupt Routine fehlt.
irgendwie habe ich den verdacht, dass der System Takt falsch eingestellt
ist. Mit maximaler geschwindigkeit messe ich 336khz, kann irgendwie
nicht stimmen... ?!?
Michael L. schrieb:> hier in der systemdatei werden die Takte und prescaler eingestellt, ich> habe da jedoch nichts verstellt..
Dann ist ja klar.
Die Std. Peripheral Library ist Standardmäßig auf einen 25MHz Quarz
eingestellt.
Auf dem STM32F4 Discovery ist aber ein 8MHz Quarz verbaut.
Du musst in der system_stm32f4xx.c in Zeile 156
1
#define PLL_M 25
auf
1
#define PLL_M 8
ändern.
Dann noch in stm32f4xx.h in Zeile 92
1
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
in
1
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
aber mehr als 1mhz bekomme ich nicht hin, ist das normal ?
Im kommentar der system_stm32f4xx.c datei steht etwas von APB1 Prescaler
= 4, was hat es damit auf sich ? Geht da evtl noch mehr als 1Mhz ?
Aber läuft der Prozessor jetzt wirklich mit 168Mhz, oder doch nur mit
8mhz??
Wenn ich die Timer interrupt routine etwas "ausbremse" kommt der
Prozessor nicht mehr nach, habe dann nur noch 12khz, anstatt 100khz
1
voidTIM2_IRQHandler(void){
2
3
inti;
4
for(i=0;i<500;i++){
5
}
6
7
GPIO_ToggleBits(GPIOD,GPIO_Pin_15);
8
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
9
}
Für ein Prozessor mit 168mhz sollte dass doch kein Problem sein noch
kurz auf 500 zu zählen, oder täusche ich mich da ??
Christoph S. schrieb:> TIM2 und TIM5 sind 32 bit Timer und haben dementsprechend 32 bit> Register.
Oh ja, da habe ich was mit Timer 3 und 4 verwechselt.