Forum: Mikrocontroller und Digitale Elektronik Compare Match Interrupt stm32


von Jasson J. (jasson)


Lesenswert?

Hallo Forum,

da meine Suche erfolglos geblieben ist und ich die nötige Information 
nicht aus den diversen Manuals herausfiltern kann meine Frage:

Wie muss ich einen Timmer auf einer stm32f30x einstellen, um einen 
Interrupt bei CompareMatch zu bekommen?

Ich benutzte das DiscoveryF3 Board und hangele mich durch die 
zugehörigen Beispiele der standard Peripheral Library und versuche Stück 
für Stück dinge zu kombinieren.
Im Moment eben das blinken einer LED in der ISR zu realisieren. Durch 
pures Delay und pollen des Timerstandes habe ich es hinbekommen.

Mit folgenden Inits tut sich zwar was, aber es ist ganz sicher kein 
Compare Match, da der Wert den ich TIM_PULSE schreibe keinen Einfluss 
hat. Überhaupt ist es kein Unterschied, ob ich den dazugehörigen Block 
auskommentiere oder nicht:
1
  /* TIM3 clock enable */
2
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
3
4
  /* Enable the TIM3 gloabal Interrupt */
5
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
6
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
7
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
8
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
9
  NVIC_Init(&NVIC_InitStructure);
10
  
11
  /* Time base configuration */
12
  TIM_TimeBaseStructure.TIM_Period = 65535;
13
  TIM_TimeBaseStructure.TIM_Prescaler = 50;
14
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
15
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
16
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
17
 
18
19
  /* Output Compare Timing Mode configuration: Channel1 */
20
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
21
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
22
  TIM_OCInitStructure.TIM_Pulse = 15000;
23
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
24
25
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);
26
27
  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);
28
  TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
29
  TIM_Cmd(TIM3, ENABLE);

und die ISR
1
void TIM3_IRQHandler(void)
2
{
3
  
4
  tmp++;
5
//   if(tmp == 10)
6
//   {
7
//     GPIOE->BSRR = BSRR_VAL1;
8
//   }
9
//   if(tmp == 100)
10
//   {
11
//     GPIOE->BSRR = BSRR_VAL2;
12
//     GPIOE->BRR = BSRR_VAL1;
13
//     tmp = 0;
14
//   }
15
  if(tmp == 10)
16
  {
17
    GPIOE->BSRR = BSRR_VAL1;
18
  }
19
  if(tmp == 20)
20
  {
21
    GPIOE->BRR = BSRR_VAL1;
22
    tmp = 0;
23
  }
24
  TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
25
}

Sieht jemand den Fehler?

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.