mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 Timer funktioniert nicht wie gewollt


Autor: Holger K. (holgerkraehe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich versuche folgendes zu erreichen:

Timer1 soll bei Zählerstand 0 einen Ausgang auf low schalten.
Dies generiert mir einen Interrupt. Innerhalb dieses Interrupts,
möchte ich den Ausgang beliebig ändern können.

Sobald der Timer1 wieder bei 0 angelangt ist, soll er diesen wieder auf 
low schalten.

Dazu habe ich folgenden Code:
void sys_InitTimer(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;

  //Time base configuration
  TIM_TimeBaseStructure.TIM_Period = 128-1;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  /* Output Compare Timing Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive;  //Bei Compare soll der Ausgang auf Low
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //Ausgang aktiviert
  TIM_OCInitStructure.TIM_Pulse = 0;  //Direkt bei Zählerstand 0
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Unsicher, was dies bewirkt
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //Vermutlich bei deaktiviertem Timer auf "1"
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);

  TIM_ITConfig(TIM1,TIM_IT_CC2, ENABLE);

  TIM_CtrlPWMOutputs(TIM1, ENABLE);

  //Externer CLK für den Timer
  TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x00);

  TIM_Cmd(TIM1, ENABLE);
}




Im Timer interrupt habe ich folgendes versucht:
void TIM1_CC_IRQHandler(void)
{
  TIM1->SR = (uint16_t)~TIM_IT_CC2;

  HW_OUT_A(1);
  HW_OUT_A(0);

  TIM_ForcedOC2Config(TIM1,TIM_ForcedAction_Active);
}

Leider bleibt damit der Ausgang immer auf high. Wenn ich das Force 
entferne, bleibt er immer auf low.

Wenn ich den OC in den Toggle mode schalte, wird immer schön 
umgeschaltet.
Der Ausgang scheint also grundsätzlich zu funktionieren.

Hat jemand eine Idee?
Danke

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Holger K. schrieb:
> Hat jemand eine Idee?
Ich vermisse die Konfiguration des NVIC. Ohne die wartest du bis 
Pflaumenpfingsten auf einen IRQ.

Autor: Holger K. (holgerkraehe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias S. schrieb:
> Holger K. schrieb:
>> Hat jemand eine Idee?
> Ich vermisse die Konfiguration des NVIC. Ohne die wartest du bis
> Pflaumenpfingsten auf einen IRQ.

Der NVIC ist konfiguriert.
Der Interrupt tritt mit einem 128igstel der eingangsfrequenz auf. Dies 
prüfe ich mittels eines regulär geschalteten GPIOs (HW_OUT_A)

Der Output des Timers bleibt jedoch konstant auf "1"

Autor: Holger K. (holgerkraehe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gefunden.

Die Funktion ForcedOC2... ändert den OCMode.
Dies sieht man nicht direkt, wenn man nicht in die Funktion 
hineinschaut.

Langsam merke ich, dass die ST-Lib nicht über alle Zwifel erhaben ist 
und es durchaus sinn macht, mit dem CMSIS zu arbeiten.

Dies muss noch in die Interrupt Routine hineinkopiert werden:
//Erneute konfiguration des OC Modes
// Zuerst die drei Bits OC2M löschen und dann wieder setzen
  TIM1->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2M);
  TIM1->CCMR1 |= (uint16_t)(TIM_OCMode_Inactive << 8);

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.