STM32 CaptureCompare - Verzweiflung

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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.