mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 CaptureCompare - Verzweiflung


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
   // Set timer period 0.1 sec
  TIM_TimeBaseInitStruct.TIM_Prescaler = 720;  // 10us resolution
  TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF;
  TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);

  TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse=10000;
  
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  
  // Clear update interrupt bit
  TIM_ClearITPendingBit(TIM1, TIM_IT_CC1|TIM_IT_Update);
  // Enable update interrupt
  TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);

  // Enable timer counting
  TIM_Cmd(TIM1, ENABLE);

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

Die Interruptroutine:
void TIM1_CC_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM1, TIM_IT_CC1)!=RESET)
  {
    TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);

    state=1;
  }
}

(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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.