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


von Holger K. (holgerkraehe)


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:
1
void sys_InitTimer(void)
2
{
3
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
4
  TIM_OCInitTypeDef  TIM_OCInitStructure;
5
6
  //Time base configuration
7
  TIM_TimeBaseStructure.TIM_Period = 128-1;
8
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
9
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
10
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
11
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
12
13
  /* Output Compare Timing Mode configuration: Channel1 */
14
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive;  //Bei Compare soll der Ausgang auf Low
15
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //Ausgang aktiviert
16
  TIM_OCInitStructure.TIM_Pulse = 0;  //Direkt bei Zählerstand 0
17
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Unsicher, was dies bewirkt
18
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //Vermutlich bei deaktiviertem Timer auf "1"
19
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);
20
21
  TIM_ITConfig(TIM1,TIM_IT_CC2, ENABLE);
22
23
  TIM_CtrlPWMOutputs(TIM1, ENABLE);
24
25
  //Externer CLK für den Timer
26
  TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x00);
27
28
  TIM_Cmd(TIM1, ENABLE);
29
}




Im Timer interrupt habe ich folgendes versucht:
1
void TIM1_CC_IRQHandler(void)
2
{
3
  TIM1->SR = (uint16_t)~TIM_IT_CC2;
4
5
  HW_OUT_A(1);
6
  HW_OUT_A(0);
7
8
  TIM_ForcedOC2Config(TIM1,TIM_ForcedAction_Active);
9
}

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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

von Holger K. (holgerkraehe)


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"

von Holger K. (holgerkraehe)


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:
1
//Erneute konfiguration des OC Modes
2
// Zuerst die drei Bits OC2M löschen und dann wieder setzen
3
  TIM1->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2M);
4
  TIM1->CCMR1 |= (uint16_t)(TIM_OCMode_Inactive << 8);

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.