Forum: Ausbildung, Studium & Beruf Output Compare für STM32


von hatge (Gast)


Lesenswert?

Hallo Leute, Ich brauche für dem STM32F2 eine Funktion mit der ich den 
Timer einstellen kann also von der Form :
void setTimer(int Value) , je nach Value läuft der Timer entsprechend 
schneller oder langsamer. Ich könnte jedes mal den Timer neu 
initallisieren um das gewünschte Ergebnis zu erhalten aber ich glaube 
das wäre ziemlich Aufwändig da die Funktion oft aufgerufen wird.
Ich wollte nun mit OutputCompare arbeiten und den Compare-Wert 
dementsprechend in der Funktion setTimer() anpassen.
1
void initTimer3(void)
2
{
3
    unsigned int t1=8000;
4
  
5
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
6
    NVIC_InitTypeDef NVIC_InitStructure;
7
    TIM_OCInitTypeDef TIM_OCInitStructure;
8
    
9
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);     
10
11
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;            
12
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
13
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        
14
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            
15
  NVIC_Init(&NVIC_InitStructure);                            
16
17
18
  TIM_TimeBaseStructure.TIM_Prescaler = 5000;                 
19
  TIM_TimeBaseStructure.TIM_Period = 10000;                   
20
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     
21
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
22
  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
23
  TIM_Cmd(TIM3, ENABLE);                                     
24
25
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;    
26
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   
27
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
28
  TIM_OCInitStructure.TIM_Pulse = 1000;
29
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);
30
  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
31
32
  TIM_ITConfig(TIM3,TIM_IT_CC1, ENABLE);              
33
34
  
35
  TIM_SetCompare1(TIM3, t1);
36
  //Oder :   TIM3->CCR1 = 8000;
37
38
  
39
}

Das Problem ist, egal wie ich TIM_SetCompare1 einstelle, der Interrupt 
wird alle 500 µs ausgelöst. Ich hoffe ihr könnt mir sagen was daran 
falsch ist.

von Walter Tarpan (Gast)


Lesenswert?

Naja, egal wann der Interrupt im Zyklus ausgelöst wird: Der Zyklus ist 
immer genau gleich lang.

Geändert werden muß für die Zykluslänge  TIM3->ARR , mir fällt nur 
momentan der CMSIS-Befehl dazu nicht ein.

von Walter Tarpan (Gast)


Lesenswert?

Edit: Achja, steht doch da:

TIM_TimeBaseStructure.TIM_Period

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.