Compare Match Interrupt stm32

OP #2940600
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren