Forum: Mikrocontroller und Digitale Elektronik STM8L151F2 TIM2 PWM Probleme


von Kim F. (microme)


Lesenswert?

Hallo Zusammen,

ich nutze den STM8L151 und möchte mir mit dem TIM2 einen PWM mit 50% 
duty cycle generieren (Frequenz 50-100kHz, aber im Beispiel erstmal 
egal).
Leider sitze ich nun seit 2 Tage dran und bekomme das Teil trotz 
verschiedener Foren/Forenbeiträge, Tutorials und Examples von ST nicht 
zum Laufen.
Wahrscheinlich liegt es an irgendeinem kleinen Register, das ich 
vergessen habe. Wäre jemand so nett und würde da mal bitte kurz drüber 
schauen?

Code (alles TIM2 betreffende zusammenkopiert, IAR Workbench, sorry für 
den direkten Registerzugriff, da nix ging, habe ich anstatt mit der lib 
alles direkt gemacht):
1
void SetupTIM2()
2
{
3
  // Setup TIM2 as PWM Timer on PB0
4
    TIM2->PSCR = 0x00;                  //  Prescaler = 0.
5
    TIM2->ARRH = 0x00;                  //  High byte of 000.
6
    TIM2->ARRL = 0xFF;                  //  Low byte of 160. = 100kHz
7
    TIM2->CCR1H = 0x00;                 //  High byte of 000.
8
    TIM2->CCR1L = 0x7D;                 //  Low byte of 160. = 100kHz
9
    TIM2->CCER1 |= TIM_CCER1_CC1P;      // Active High
10
    TIM2->CCER1 |= TIM_CCER1_CC1E;      // Enable Capture Compare
11
    TIM2->CCMR1 |= TIM_CCMR_OCM;        // PWM Mode2
12
    TIM2->CR1 |= TIM_CR1_CEN;           //  Enable the timer.
13
14
}
15
16
void main(void)
17
{
18
19
  CLK_HSICmd(ENABLE); 
20
  CLK->CKDIVR = 0x00;
21
  //Enable TIM2 CLK
22
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE); 
23
  
24
/* Init GPIO Port B PB0 output push-pull up to 10MHz PWM*/
25
  GPIOB->DDR |= GPIO_Pin_0;
26
  // Push pull
27
  GPIOB->CR1 |= GPIO_Pin_0;
28
  // up to 10MHz
29
  GPIOB->CR2 |= GPIO_Pin_0;
30
  
31
  // TIM2 INIT FOR PWM an PB0
32
  TIM2_DeInit();
33
  SetupTIM2();
34
 
35
  while (1){  }
36
37
}

Beim Debuggen bin ich alle Register durchgegangen, sie werden 
entsprechend gesetzt, wie sie es (meiner Meinung nach) sollen.
Der Counter läuft, bei CCR1L = 0x7D wird das entsprechende Interrupt 
Flag CC1IF im SR1 Register gesetzt (komischerweise irgendwann auch das 
CC2IF?! und der Update Interrupt ebenfalls, alles wird nie mehr 
rückgesetzt?!).
Der Auto Reload klappt ebenfalls, beim Erreichen von 0xFF wird 
automatisch auf 0x00 zurückgesetzt und wieder von vorne gezählt. Nur an 
meinem PB0 kommt leider nix raus. Auch Remap von TIM2_CH1 ist nicht 
aktiv.

Wenn ich den Timer mit normalem Update Interrupt betreibe und das 
Toggeln von PB0 in der ISR machen, funktioniert alles. Bei der Frequenz 
blockiert mir das nur abartig mein System.

Jemand eine Idee?

Danke und Grüße,
Kim

: Bearbeitet durch User
von Kim F. (microme)


Lesenswert?

Keiner eine Idee?

von Kim F. (microme)


Lesenswert?

In keinem Beispiel wurde dieses Bit verwendet. Auch im Reference Manual 
wird über das MOE nur in Zusammenhang mit einer Motorsteuerung/Break 
Function gesprochen.

Falls jemand auch darüber stolpert, das hier hilft:
1
 
2
3
TIM2->BKR |= TIM_BKR_MOE;

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Ohne den prozessor zu kennen: evtl. muss der timer noch 
gestartet/enabled werden?

von Olaf (Gast)


Lesenswert?

> Keiner eine Idee?

Klar. In der Aufzaehlung deiner Grosstaten fehlt noch: "Lesen des 
Datenblatts" und zwar an erster Stelle.

Olaf

von Kim F. (microme)


Lesenswert?

Danke Olaf, das Datenblatt hilft bei ST leider nicht weiter, aber dass 
das Reference Manual das erste ist wo man nach sieht, wenn was nicht 
funktioniert versteht sich für mich von selbst.
Wie oben geschrieben wird das MOE in der RefMan nur in Verbindung mit 
der break function beschrieben.

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.