STM32 Timer steht still

OP #4180981
Lesenswert?

Folgendes Problem:
Ich habe mit STM32CubeMX Init-Code für PWM Ausgabe mit TIM3 generiert. 
Danach die PWM Ausgabe mit "HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);" 
aktiviert. Der Ausgang ist aber dauernd HIGH. Wenn ich im TIM3 -> CNT 
Register von Hand Werte grösser/kleiner als CCR4 einsetze, wird der Pin 
ein- oder ausgeschaltet. Der Wert von CNT ändert sich aber nicht von 
selber. Was mache ich falsch?

Timer Initialisierung:
1
void MX_TIM3_Init(void)
2
{
3

4
  TIM_ClockConfigTypeDef sClockSourceConfig;
5
  TIM_MasterConfigTypeDef sMasterConfig;
6
  TIM_OC_InitTypeDef sConfigOC;
7

8
  htim3.Instance = TIM3;
9
  htim3.Init.Prescaler = 13;
10
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
11
  htim3.Init.Period = 0;
12
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
13
  HAL_TIM_Base_Init(&htim3);
14

15
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
16
  HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);
17

18
  HAL_TIM_PWM_Init(&htim3);
19

20
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
21
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
22
  HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);
23

24
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
25
  sConfigOC.Pulse = 10000;
26
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
27
  sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
28
  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2);
29

30
  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4);
31

32
}

Und das Main:
1
int main(void)
2
{
3

4
  /* USER CODE BEGIN 1 */
5

6
  /* USER CODE END 1 */
7

8
  /* MCU Configuration----------------------------------------------------------*/
9

10
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
11
  HAL_Init();
12

13
  /* Configure the system clock */
14
  SystemClock_Config();
15

16
  /* Initialize all configured peripherals */
17
  MX_GPIO_Init();
18
  MX_TIM3_Init();
19
  //HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
20
  
21
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);
22

23
  /* USER CODE BEGIN 2 */
24

25
  /* USER CODE END 2 */
26

27
  /* Infinite loop */
28
  /* USER CODE BEGIN WHILE */
29
  while (1)
30
  {
31
  /* USER CODE END WHILE */
32

33
  /* USER CODE BEGIN 3 */
34

35
  }
36
  /* USER CODE END 3 */
37

38
}

Angehängt noch das gesamte CrossWorks Projekt.

Besten Dank, Sean
Angehängte Dateien:
Gast #4181137
Lesenswert?

Was mir noch aufgefallen ist,anders als das Listing der main.c oben ist 
in deinem angehängten Projekt in der main.c das zu finden:
1
  while (1)
2
  {
3
      TIM3 -> CNT = 10;
4
      TIM3 -> CNT = 20000;
5
      int x = HAL_TIM_PWM_GetState(&htim3);
6
  }
OP #4181300
Lesenswert?

Robert B. schrieb:
> Period = 0??????

Ne, habe schon viele verschiedene probiert - ohne Erfolg

hp-freund schrieb:
> Was mir noch aufgefallen ist,anders als das Listing der main.c
> oben ist
> in deinem angehängten Projekt in der main.c das zu finden:  while (1)
>   {
>       TIM3 -> CNT = 10;
>       TIM3 -> CNT = 20000;
>       int x = HAL_TIM_PWM_GetState(&htim3);
>   }

Ja, da habe ich getestet, was passiert, wenn ich das CNT Register 
manuell setze. Dann schaltet der Pin! Aber eigentlich sollte der Timer 
ja selber zählen...
Gast #4181463
Lesenswert?

Ich habe das jetzt mal ausprobiert.
Meine erste Vermutung war schon richtig.
Wenn das Pin nicht als Ausgang konfiguriert ist kommt auch nichts raus!

Ich wäre auch nie auf die Idee gekommen die Konfiguration einfach 
wegzulassen, deshalb meine Zweifel.

Beim Nucleo F030 liegt TIM3 PWM Ch4 an PB1, also braucht es:
1
  /*Configure GPIO pin : PB1 */
2
  GPIO_InitStruct.Pin = GPIO_PIN_1;
3
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
4
  GPIO_InitStruct.Pull = GPIO_NOPULL;
5
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
6
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
in der MX_GPIO_Init. Dann läuft es...
OP #4181538
Lesenswert?

hp-freund schrieb:
> Ich habe das jetzt mal ausprobiert.
> Meine erste Vermutung war schon richtig.
> Wenn das Pin nicht als Ausgang konfiguriert ist kommt auch nichts raus!
>
> Ich wäre auch nie auf die Idee gekommen die Konfiguration einfach
> wegzulassen, deshalb meine Zweifel.
>
> Beim Nucleo F030 liegt TIM3 PWM Ch4 an PB1, also braucht es:
>
>
1
>   /*Configure GPIO pin : PB1 */
2
>   GPIO_InitStruct.Pin = GPIO_PIN_1;
3
>   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
4
>   GPIO_InitStruct.Pull = GPIO_NOPULL;
5
>   GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
6
>   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
7
> 
8
>
> in der MX_GPIO_Init. Dann läuft es...

Vielen Dank, aber das war es nicht! In hal_msp.c ist diese 
Initialisierung nämlich drinnen! Das eigentliche Problem war viel 
einfacher:
Die Zeile
htim3.Init.Period = 0;
macht NICHT, dass der Timer jedes mal mit 0 Startet, sondern dass er von 
0 bis 0 zählt... Mit dem richtigen Wert dort funktioniert es!

@Robert heul! Wie konnte ich deine Antwort übersehen? Erst nachdem ich 
das geschrieben habe ist sie mir aufgefallen!

Danke euch!
LG, Sean
Gast #4182120
Lesenswert?

Sean G. schrieb:
> @Robert heul! Wie konnte ich deine Antwort übersehen? Erst nachdem ich
> das geschrieben habe ist sie mir aufgefallen!

Häh? Du hast Robert sogar eine Antwort geschickt:
> Robert B. schrieb:
>> Period = 0??????
>
> Ne, habe schon viele verschiedene probiert - ohne Erfolg
Gast #4182164
Lesenswert?

Alle Timer stehen still, when we don't register fill.

TimHandle.Init.Period = 0

Macht keinen Sinn. Es sei denn beim steuern einer Rampe für einen Motor 
geht die Puls runter auf Null. Auf dem Oszi kann man das Phasengeschiebe 
übrigens gut beobachten.

TimHandle.Init.Period füllt das Auto-Reload Register (gut möglich, daß 
der Selbstladevorgang vom 8051 abgespickelt wurde).
sConfigTIM_OC.Pulse = TimHandle.Init.Period/2
erzeugt zB. eine Pulsweite von 50%.

Übrichens: sConfigTIM_OC.Pulse muß immer kleiner sein als
TimHandle.Init.Period, sonst gibt'S kein Signal am Pin.
OP #4182227
Lesenswert?

Eric schrieb:
> Sean G. schrieb:
>> @Robert heul! Wie konnte ich deine Antwort übersehen? Erst nachdem ich
>> das geschrieben habe ist sie mir aufgefallen!
>
> Häh? Du hast Robert sogar eine Antwort geschickt:
>> Robert B. schrieb:
>>> Period = 0??????
>>
>> Ne, habe schon viele verschiedene probiert - ohne Erfolg

Ah stimmt. Jetzt ists mir eingefallen: Ich dachte Period = Duty Cycle!

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