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