Forum: Mikrocontroller und Digitale Elektronik stm32f103 Timer Interrupt


von Timer (Gast)


Lesenswert?

Hallo,

für meinen stm32f10x benötige ich einen Timer Interrupt der jede ms 
auslöst. ich weis aber nicht wie ich die werte Period und Prescaler 
wählen muss. ich benutze hierbei die std Library. mene initialisierung 
sieht wie folgt aus:

void timerInterrupt_Init(void)
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBase_InitStructure.TIM_Period = 1;
  TIM_TimeBase_InitStructure.TIM_Prescaler = 3999;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBase_InitStructure);

  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

  nvic_initialisierung(TIM2_IRQn);  // Interrupt einschalten

  TIM_Cmd(TIM2, ENABLE);
}

von Timer (Gast)


Lesenswert?

ich benutze den internen 8MHz RC Oszilator

von Uwe B. (derexponent)


Lesenswert?

Hi,

der Timer2 hängt am APB1-Clock
also müsstest du zuerst wissen
wie hoch dein HCLK ist und welcher Vorteiler
für APB1 eingestellt ist

dann berechnet sich die Timer-Frq mit :

[falls APB1_Vorteiler = 1]

TIM_CLK = APB1_CLK/(Period+1)/(Prescaler+1)


[falls APB1_Vorteiler > 1]

TIM_CLK = (APB1_CLK*2)/(Period+1)/(Prescaler+1)

Gruss Uwe

von Timer (Gast)


Lesenswert?

danke, aber die Periode und Prescaler sind ja zwei unbekannte, wie muss 
ich diese wählen?

HCLK ist 72MHz und der APB1 Vorteiler ist größer 1

von Uwe B. (derexponent)


Lesenswert?

>aber die Periode und Prescaler sind ja zwei unbekannte

ja, dann mach halt aus einer eine "Bekannte" :-)


nimm z.B. als Prescaler die Zahl 1 (warum siehst du später)
(und ich nehme mal an bei dir ist der APB1 Vorteiler = 2)

dann hast du ein ABP1_Clk von 36MHz

also :

TIM_CLK = (APB1_CLK*2)/(Period+1)/(Prescaler+1)

du wills einen 1ms Takt ... also f=1kHz


1kHz = (36MHz*2)/(x+1)/(1+1)

umgestellt auf x

(x+1) = (36MHz*2)/(1+1)/1kHz

x+1 = 72MHz/2/1kHz

x+1 =  36000

x = 35999

1
TIM_TimeBase_InitStructure.TIM_Prescaler = 1;
2
TIM_TimeBase_InitStructure.TIM_Period = 35999;

das müsste passen
(falls ich keinen Fehler drinn hab)

P.S. ein prescaler von 0 würde nicht funktionieren,
weil dann die Wert für die Periode > 16bit wäre

Gruss Uwe

von Timer (Gast)


Lesenswert?

Danke

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.