Forum: Mikrocontroller und Digitale Elektronik STM32 CaptureCompare - Verzweiflung


von Peter (Gast)


Lesenswert?

Hallo Community,

kämpfe seit Stunden mit einem STM32 (STM103F103RBT6 - Olimex Protoboard) 
und bringe es nicht zustande, einen Capture-Compare-Interrupt 
auszulösen.

Es handelt sich um den LED-Blink-Beispielcode von Olimex für die EWARM, 
der Code arbeitet mit dem Timer1-Update-Interrupt und ich wollte ihn auf 
CaptureCompare ummodeln.

Das Oszilloskop zeigt an, dass die CC-Interruptroutine angesprungen 
wird, aber erst bei einem Update Event (ca. alle 655 ms, also 
0xFFFF-Überlauf). Dass CC1F-Flag dürfte gesetzt werden, löst von alleine 
aber noch keinen Interrupt aus.

Ich initialisiere den Timer1:
1
   // Set timer period 0.1 sec
2
  TIM_TimeBaseInitStruct.TIM_Prescaler = 720;  // 10us resolution
3
  TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
4
  TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF;
5
  TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
6
  TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
7
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
8
9
  TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Timing;
10
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
11
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
12
  TIM_OCInitStructure.TIM_Pulse=10000;
13
  
14
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
15
  
16
  // Clear update interrupt bit
17
  TIM_ClearITPendingBit(TIM1, TIM_IT_CC1|TIM_IT_Update);
18
  // Enable update interrupt
19
  TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
20
21
  // Enable timer counting
22
  TIM_Cmd(TIM1, ENABLE);

 und den NVIC:
1
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel;
2
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;
3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
4
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
5
  NVIC_Init(&NVIC_InitStructure);

Die Interruptroutine:
1
void TIM1_CC_IRQHandler(void)
2
{
3
  if(TIM_GetITStatus(TIM1, TIM_IT_CC1)!=RESET)
4
  {
5
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
6
7
    state=1;
8
  }
9
}

(state löst dann in einer Main-while(1)-Schleife das Setzen des 
Port-Pins aus)

Alle anderen Einstellungen (Clock, APB2,...) hab ich direkt aus dem 
Original-Code übernommen und sollten funktionieren.

Bin ich zu blöd? Hab ich was übersehen? Habe schon alle Timer 
durchprobiert, das Problem tritt immer auf.

Ein für jeden Hinweis dankbarer
Peter

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.