STM32 CaptureCompare - Verzweiflung

Gast #1146876
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

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