CH32v003 PWM & Timer Probleme

#7448576
Lesenswert?

Hallo,

ich versuche mich gerade an dem ch32v003 Prozessor. Der läuft intern mit 8Mhz und die eigentliche Anwendung kommt aus einem AVR Projekt was hier aber noch nicht arbeitet. Da wird ein Sinus per PWM und Timer generiert.

Vielleicht kennt sich jemand damit aus und hat mal Zeit sich das anzusehen.

Dabei habe ich 2 Probleme.

  • (timer 1) PWM auf Port D3 kommt nicht raus

Irgentwas ist da falsch oder ich sehe es nur nicht.

1
   TIM_Cmd( TIM1, DISABLE );
2

3
   // Enable GPIOC, GPIOD and TIM1
4
   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD , ENABLE );
5
   RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );
6

7
   // PD3 T1CH4N
8
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
9
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
10
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11
   GPIO_Init( GPIOD, &GPIO_InitStructure );
12

13
   TIM_TimeBaseInitStructure.TIM_Period = 255;
14
   TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
15
   TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV2; 
16
   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
17
   TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);
18

19
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
20
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
21
   TIM_OCInitStructure.TIM_Pulse = 100; // Test wert!
22
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
23
   TIM_OC4Init( TIM1, &TIM_OCInitStructure );
24

25
   TIM_CtrlPWMOutputs(TIM1, ENABLE );
26
   TIM_OC4PreloadConfig( TIM1, TIM_OCPreload_Disable );
27
   TIM_ARRPreloadConfig( TIM1, ENABLE );
28

29
   TIM_Cmd( TIM1, ENABLE ); // Enable TIM1
  • (timer 2) Timer scheint nicht auf der gewünschten Frequenz zu laufen Ich kann im Debugger leider nicht erkennen was hier schiefläuft.
1
   TIM_Cmd( TIM2, DISABLE ); //  TIM2 Aus
2

3
   // Enable TIM2
4
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE );
5

6

7
   TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF; 
8
   TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
9
   TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV2;
10
   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
11
   TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStructure);
12

13
  // 0xe79e = 20 Hz auf dem AVR
14
   TIM_SetCounter (TIM2, 0xe79e); 
15
   TIM_SetAutoreload (TIM2, 0xe79e);
16

17

18
   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
19
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
20
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
21
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
22
   NVIC_Init(&NVIC_InitStructure);
23

24
   TIM2->INTFR = (uint16_t)~TIM_IT_Update;
25
   TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
26
   TIM_Cmd( TIM2, ENABLE ); // Enable TIM2
27

28

29

30
void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
31
void TIM2_IRQHandler(void)
32
{
33
   TIM2->INTFR = (uint16_t)~TIM_IT_Update;
34
   // PWM auf neuen Stuetspunkt setzen
35
   TIM1->CH4CVR = 100;
36
}
#7451688
Lesenswert?

Danke für das ansehen.

Muss aber zugeben das ich kurz vor deiner Antwort das selber gesehen hatte.

1
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM1, ENABLE); // D3 anschalten

Hat gefehlt um die 2. Alternatve funktion einzuschalten.

Und noch für die Nachwelt:

1
TIM_TimeBaseInitStructure.TIM_ClockDivision  = TIM_CKD_DIV2;

Teilt nicht den Vorteiler, das macht

1
TIM_Prescaler = 1; // /2

So jetzt bleibt nur noch das mit dem Timer 2 und hier kome ich einfach nicht weiter. Der Timer macht einfach kein Reload wenn der oben ankommt. Der Interrup kommt aber und das allerdings dann auch nicht mit der Geschwindigkeit wie ich erwarten würde. Im Debugger sehe ich im Counter Register Werte die nicht vorkommen sollten, weil sie unterhalb des Reload wertes liegen.

Vielleicht sieht ja jemand wo der Fehler ist.

#7452313
Lesenswert?

Ja der Code sieht nach der SPL von ST aus. Finde ich persönlich nicht mal schlecht.

Ich bin auf den Reload reingefallen. Mal heist es .TIM_Period und dann TIM_SetAutoreload(...), landet aber im selben register. Der Timer startet immer nach erreichen dieses Wertes von Null. Und startet nicht bei diesem Wert immer wieder neu, was ich bei Autoreload erwarten würde.

Wert invers einsetzten (0xFFFF- Wert) und die Sache läuft.

Da wird es sicherlich noch andere Methoden geben, aber jetzt geht es erstmal.

Tja, neuer Prozessor neue Fehler / Probleme!

Gast #7452316
Lesenswert?

Dirk E. schrieb:

Ja der Code sieht nach der SPL von ST aus. Finde ich persönlich nicht mal schlecht.

Der Code von ST darf nur auf Mikrocontrollern von ST verwendet werden.

"4. This software package or any part thereof, including modifications and/or derivative works of this software package, must be used and execute solely and exclusively on or in combination with a microcontroller or a microprocessor devices manufactured by or for STMicroelectronics."

https://www.st.com/resource/en/license/SLA0048_STM32CubeF1.pdf.

#7499187
Lesenswert?

Ich habe diesen Thread ein oder zwei Stunden vor dem Posten gefunden. Da meine Muttersprache Englisch ist, halte ich eine Latenzzeit von zwei Monaten für angemessen. Nur weil ich zu spät poste, heißt das nicht, dass meine Argumentation irgendwie falsch ist.

Es ist weltweit üblich, den vollständigen Quellcode zu veröffentlichen, wenn Sie dabei Hilfe benötigen.

Möglicherweise sehe ich Fehler im veröffentlichten Quellcode, aber woher soll ich das wissen, wenn ich nicht den gesamten Code habe? Fehlende Teile könnten durchaus alles verändern.

#7499197
Lesenswert?

Do not use the formal "Sie" to address others when posting on german-language internet forums. This is, though formally correct, in most cases considered rather rude and distanced.

Did you contribute anything useful? The thread's creator posted some excerpts of his source code, and had it not been sufficient for those who already answered, they would already have requested the full source code. They could discuss the subject at hand, apparently sufficient enough for the thread's creator not to ask further questions.

Had you contributed something to this thread, your "latency" would have been acceptable. But you didn't, and so it isn't.

You could have requested the full source code in a friendly manner, but no, you acted rather supercilious.

And for that you created a new user account?

#7779305
Lesenswert?

Nachtrag:

Ich hatte ganz schön Probleme gehabt, den PWM Output wie im obigen Beispiel auf Pin D3 auszugeben.

Es fehlte letztendlich die Anweisung, AFIO zu aktivieren:

1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE );

Hier ist ein vollständiges Beispiel:

1
    GPIO_InitTypeDef GPIO_InitStructure={0};
2
    TIM_OCInitTypeDef TIM_OCInitStructure={0};
3
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure={0};
4

5
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_TIM1 | RCC_APB2Periph_AFIO, ENABLE);
6

7
    GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM1, ENABLE);
8

9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
11
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_30MHz;
12
    GPIO_Init( GPIOD, &GPIO_InitStructure );
13

14
    TIM_TimeBaseInitStructure.TIM_Period = arr;
15
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
16
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
17
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
18
    TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);
19

20
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
21
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
22
    TIM_OCInitStructure.TIM_Pulse = ccp;
23
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
24
    TIM_OC4Init( TIM1, &TIM_OCInitStructure );
25

26
    TIM_CtrlPWMOutputs(TIM1, ENABLE );
27
    TIM_OC4PreloadConfig( TIM1, TIM_OCPreload_Disable );
28
    TIM_ARRPreloadConfig( TIM1, ENABLE );
29
    TIM_Cmd( TIM1, ENABLE );

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren