Forum: Mikrocontroller und Digitale Elektronik STM32: OC Timer - Problem


von DraconiX (Gast)


Lesenswert?

Ich bin gerade ein bissle am Verzweifeln mit meinem OC Timer auf meinem 
STM32F103. Ich bekomme einfach kein Compare hin.

Der µC läuft mit dem internen Quarz (8Mhz HSI, PLL, Multi 16) auf 64Mhz. 
APB1 Perhiph auf 32Mhz und die APB1 Timer auf 64Mhz.

Ich geb mal die ClockInit:
1
void SystemClock(void)
2
{
3
4
  RCC_OscInitTypeDef RCC_OscInitStruct;
5
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
6
7
  // Initializes the CPU, AHB and APB busses clocks
8
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
9
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
10
  RCC_OscInitStruct.HSICalibrationValue = 16;
11
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
12
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
13
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
14
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
15
16
  // Initializes the CPU, AHB and APB busses clocks 
17
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
18
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
19
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
20
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
21
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
22
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
23
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
24
25
  // Configure the Systick interrupt time
26
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
27
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
28
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
29
}


Den Timer Initialisiere ich wie folgt:

1
void Timer_Init(void)
2
{
3
4
TIM_MasterConfigTypeDef sMasterConfig;
5
TIM_OC_InitTypeDef sConfigOC;
6
GPIO_InitTypeDef GPIO_InitStruct;
7
8
__HAL_RCC_GPIOA_CLK_ENABLE();
9
GPIO_InitStruct.Pin = GPIO_PIN_0;
10
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
11
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
12
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
13
14
GPIO_InitStruct.Pin = GPIO_PIN_5;
15
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
16
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
17
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
18
19
__HAL_RCC_TIM2_CLK_ENABLE();
20
htim2.Instance = TIM2;
21
htim2.Init.Prescaler = 0;
22
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
23
htim2.Init.Period = 80;
24
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
25
HAL_TIM_OC_Init(&htim2);
26
27
sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1;
28
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
29
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
30
31
sConfigOC.OCMode = TIM_OCMODE_TIMING;
32
sConfigOC.Pulse = 40;
33
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
34
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
35
HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
36
37
// Config NVIC
38
HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0);
39
HAL_NVIC_EnableIRQ(TIM2_IRQn);
40
}

Hier noch der Interrupt und die Main:
1
void TIM2_IRQHandler(void)
2
{
3
4
  HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
5
  HAL_TIM_IRQHandler(&htim2);
6
7
}
8
9
10
11
int main(void)
12
{
13
  SystemClock();
14
  Timer_Init();
15
16
  __HAL_RCC_TIM2_CLK_ENABLE();
17
18
  HAL_TIM_OC_Start(&htim2,TIM_CHANNEL_2);
19
  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,SET);
20
21
  while (1)
22
  {
23
24
25
  }
26
}

Wie gesagt, kein Compare, ich bekomme das Ding einfach nicht zum laufen 
- hach waren da die AVR Zeiten noch schön, da lief sowas in 2 Minuten. 
:-(

Ich danke für eine Hilfen.

von pegel (Gast)


Lesenswert?

DraconiX schrieb:
> HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);

DraconiX schrieb:
> HAL_TIM_OC_Start(&htim2,TIM_CHANNEL_2);

???


Übrigens gibt es immer noch AVR wenn auch unter falschem Namen ;)

von DraconiX (Gast)


Lesenswert?

pegel schrieb:
> DraconiX schrieb:
>> HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
>
> DraconiX schrieb:
>> HAL_TIM_OC_Start(&htim2,TIM_CHANNEL_2);
>
> ???
>
> Übrigens gibt es immer noch AVR wenn auch unter falschem Namen ;)

Ahhh... danke! Aber das war es leider auch nicht, auch das Umstellen des 
Channel auf 1 beim Start bringt weder den Interrupt raus noch den Pin 
zum wackeln :-/


Jaja, der AVR ist auch immernoch mein Hauptarbeitspferd :-D

von pegel (Gast)


Lesenswert?

Kannst noch versuchen Period und Pulse zu vergrössern. Mal 10 oder so, 
vielleicht kommen die Int zu schnell.

Sonst mein üblicher Rat, CubeMX.

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


Lesenswert?

Bin leider kein HAL Spezi, aber unter SPL muss man den Timer dann auch 
noch starten:
1
TIM_Cmd(TIM2, ENABLE);

von DraconiX (Gast)


Lesenswert?

pegel schrieb:
> Kannst noch versuchen Period und Pulse zu vergrössern. Mal 10 oder
> so,
> vielleicht kommen die Int zu schnell.
>
> Sonst mein üblicher Rat, CubeMX.

Ja das Zeugs ist ja von CubeMX "zusammengestellt" - leider gibt Cube ja 
keine Startzuweisungen. Bzw, darf man die sich dann aus der HAL-Lib 
zusammensuchen.

Matthias S. schrieb:
> Bin leider kein HAL Spezi, aber unter SPL muss man den Timer dann
> auch
> noch starten:TIM_Cmd(TIM2, ENABLE);

Ja unter SPL wäre das deutlich einfacher :-D Aber ich sehe das man sich 
dabei viel zu sehr auf die Libs verlässt, die Ref-Manual und das 
Datenblatt hält sich da eh schon arg bedeckt wie die Interrupts 
angesprochen werden, zumindest konnte ich in den drei verschiedenen 
Blättern nichts finden.

Ich hab nun das Problem lösen können, um den Timmer mit Interrupt zu 
starten braucht es:
1
HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_1);
2
// Man beachte:--^^
3
4
// Und um dann noch den Pin zu nutzen braucht man extra:
5
HAL_TIM_OC_Start(&htim2,TIM_CHANNEL_1);

Das ist alles irgendwie ein bissle verkompliziert gemacht.

von C. W. (chefkoch)


Lesenswert?

Der Timer bekommt kein Clocksource

von pegel (Gast)


Lesenswert?

Aber dafür sind in der HAL Lib so ziemlich für jede HW Beispiele 
enthalten.
Ein Blick in die jeweilige main.c hat mir bis jetzt eigentlich immer 
Erleuchtung gebracht.

von DraconiX (Gast)


Lesenswert?

C. W. schrieb:
> Der Timer bekommt kein Clocksource

Ja doch, hier - Die Source ist beim F103 ja der APB1, die clock muss nur 
zugeschaltet werden, mach ich ja vor der Initilisierung, sonst würde sie 
ja nicht mal die Register übernehmen - Wie gesagt, der Interrupt und der 
Outpin gehen ja nun.

DraconiX schrieb:
> __HAL_RCC_TIM2_CLK_ENABLE();

pegel schrieb:
> Aber dafür sind in der HAL Lib so ziemlich für jede HW Beispiele
> enthalten.
> Ein Blick in die jeweilige main.c hat mir bis jetzt eigentlich immer
> Erleuchtung gebracht.

Wo findest du die HW Beispiele?!

von pegel (Gast)


Lesenswert?

Für den F103 z.B. hier

SW4STM32/firmwares/STM32Cube_FW_F1_V1.4.0/Projects/STM32F103RB-Nucleo/Ex 
amples/TIM/TIM_TimeBase/Src/main.c

und andere.

von DraconiX (Gast)


Lesenswert?

pegel schrieb:
> Für den F103 z.B. hier
>
> SW4STM32/firmwares/STM32Cube_FW_F1_V1.4.0/Projects/STM32F103RB-Nucleo/Ex
> amples/TIM/TIM_TimeBase/Src/main.c
>
> und andere.

Oh Danke! Da schaue ich mal!

von pegel (Gast)


Lesenswert?

Da findest du auch die offizielle Auswertung des Interrupt durch

HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

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.