Forum: Mikrocontroller und Digitale Elektronik STM32F4 TIM2 nach HSE Umstellung anpassen


von Frank (Gast)


Lesenswert?

Hallo zusammen,

muss man beim Wechsel von HSI auf HSE-->PLL noch irgendetwas spezielles 
ändern ausser die Prescaler PLLM,*N,PLLP,AHB, APB1 sofern man TIM2 nutzt 
?

Ich habe das Problem, dass meine Timer-Zeit/en nicht mehr stimmen.
Mit den internen 16 MHz RC Oszi hatte ich alle 10 Milisekunden einen 
Interrupt. Jetzt plötzlich nur noch alle 120 Milisekunden.

HCLK ist 84 MHz und APB1 = 2 , also läuft der Timer mit 42 MHz (macht er 
aber wohl nicht)

Seltsam auch, dass das ARR Register angeblich nur 16 Bit groß ist. Laut 
Debugger ist es aber 32 Bit lang. Ist aber egal, ich habe es auch mit 
Prescaler ausprobiert. Timer Zeiten stimmen nicht.

Ich komme mitlerweile zu den Schluss, dass meine SystemClock nicht mit 
der Frequenz von 168 MHz läuft.

Ich bin mir sicher, das ich früher schonmal versucht habe die Clock 
umzustellen und dabei falsche Prescaler Werte benutzt habe. Besitzt der 
µC intern ein Schutz, wenn man den falsch einstellt ? Sonst könnte da ja 
auch etwas kaputt gegangen sein.

Ich weis nicht, was ich da noch ein/umstellen könnte.

•
1
void Timer2Init_()
2
{
3
  APB1_TIM2 |= 0x00000001U;                               
4
  RCC_APB1ENR |= 1;                                       
5
  NVIC_ISER |= 0x10000000;                               
6
  TIM2_CR1 |=0x0010;                                     
7
  TIM2_PSC = 0;                                          
8
  TIM2_ARR = 42000000;                                      
9
  TIM2_DIER |= 1;                                             
10
HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);                 
11
  TIM2_CR1 |= 1;                                        
12
}

von Frank (Gast)


Lesenswert?

TIM2_ARR ist übrigens 420 000.
Hatte da vorher eine Variable drinstehen, die aber zur Vereinfachung mal 
rausgenommen. Also 420 000 steht drin (oder 419 999) und IR ist alle 12 
Sekunden in etwa.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Frank schrieb:
> TIM2_ARR = 42000000;

Abgesehen davon, das du ruhig wenigstens die Definitionen benutzt 
hättest statt
1
TIM2->CR1 |= 0x0010; 
2
// besser
3
TIM2->CR1 |= TIM_CounterMode_Down;
hat das ARR Register nur 16 bit. (Abschnitt 18.4.2 im Reference Manual 
RM0090).
Du schreibst also viel zu hohe Werte da rein und verwendest besser den 
Prescaler.

Frank schrieb:
> Seltsam auch, dass das ARR Register angeblich nur 16 Bit groß ist.

Das ist es auch. Das Reference Manual hat recht und der Debugger nicht.

: Bearbeitet durch User
von Nico W. (nico_w)


Lesenswert?

ARR ist 32bit breit. Aber die oberen 16bit sind "reserviert".

von Bauform B. (bauformb)


Lesenswert?

Matthias S. schrieb:
> Das Reference Manual hat recht und der Debugger nicht.

Anscheinend ist euer Debugger ein wenig aktueller als euer RM0090. Davon 
gibt es inzwischen 17 Versionen.
1
RM0090 - Document revision history, Version 9, 16-Mar-2015
2
3
TIM2/5: Register format changed to 32 bits instead of 16 in
4
Section 18.4.10: TIMx counter (TIMx_CNT) and
5
Section 18.4.12: TIMx auto-reload register (TIMx_ARR).

Du könntest den internen PLL Clock oder SYSCLK am MCO2 Pin messen; siehe 
RCC clock configuration register, RCC_CFGR.

von Nico W. (nico_w)


Lesenswert?

Ah Check Tim2. Aber auch die 16bit Timer sind 32bit breit.

von Frank (Gast)


Lesenswert?

Besten Dank für eure Antworten.

So, der Chip war kaputt! Habe mich jetzt zwei ganze Tage mit den 
Registern rumgeschlagen, bevor ich mal einen anderen genommen habe.

Ich nehme mal an, dass das durch anfänglich falsche Konfiguarion der PLL 
passiert ist.

Jetzt geht's und wie oben erwähnt, auch die große Zahl ins 32Bit ARR 
TIM2 Register.

Was ich aber noch nicht verstehe ist folgendes:
Ich habe jetzt die PLL auf MCO1 gelegt und messe dort 21 MHZ mit einen 
Prescaler von 4, somit ist die PLL 84 MHz.
Alle Prescaler des PLL_Registers sind allerdings so eingestellt, dass 
die PLL 168 MHz sein müsste.

HSE = 8 MHz / 4 (PLLM) = 2 MHz
2 MHz * 168 (PLLN)     = 336 MHz
336 MHz / 2 (PLLP)     = 168 MHz

Wird die PLL für den MCO1 Ausgang nochmal durch 2 geteilt ?

von Christopher J. (christopher_j23)


Lesenswert?

Frank schrieb:
> Wird die PLL für den MCO1 Ausgang nochmal durch 2 geteilt ?

Es gibt zumindest für den F407 keinen anderen Prescaler für die MCO-Pins 
als den einen, den man im RCC_CFGR einstellen kann. Ich mutmaße aber 
mal, dass deine PLL tatsächlich nur mit 84MHz läuft, weil man den 
Prescaler nicht fälschlicherweise auf acht stellen kann. Zum testen 
kannst du ja auch einen normalen Timer als Ausgang nehmen. Die Timer an 
APB2 sollten ja mit PLLCLK laufen, also 168MHz wenn sie denn anliegen. 
Für den F407 wäre das z.B. TIM1 oder TIM8.

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.