Forum: Mikrocontroller und Digitale Elektronik STM32F4 Timer HAL


von Bert (Gast)


Lesenswert?

Hallo,

ich versuche auf dem STM32F4 gerade einen Timer zum laufen zu bekommen.
Das einzigste was er können muss ist die Zeit zwischen einem größeren 
Codeabschnitt zu messen die er braucht diesen auszuführen.

Habe bisher das ganze Projekt auf HAL gemacht, I2C, SPI läuft auch 
schon, nur das mit dem Timer will nicht so recht.


Das hier hat mir CubeMX Prodziert.
Ursprünglich wollte ich den TIM1 benutzen, da dieser aber nicht ging, 
bin ich dann auf TIM3 gewechselt. Geht aber immer noch nicht.
1
void MX_TIM1_Init(void)
2
{
3
4
  TIM_ClockConfigTypeDef sClockSourceConfig;
5
  TIM_MasterConfigTypeDef sMasterConfig;
6
7
  htim1.Instance = TIM3;
8
  htim1.Init.Prescaler = 2000;
9
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
10
  htim1.Init.Period = 9000;
11
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;
12
  htim1.Init.RepetitionCounter = 0;
13
  HAL_TIM_Base_Init(&htim1);
14
15
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
16
  HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);
17
18
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
19
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
20
  HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
21
22
23
24
}

Danach versuch ich den Timer hiermit zu starten
1
HAL_TIM_Base_Start(timerHandle0);

Und kurz bevor der Codeabschnitt kommt setze ich den Timer auf 0 zurück 
mit
1
timerHandle0->Instance->CNT = 0;

Und gebe anschließend den Counterwert zurück mit
1
UART_SendTimerValueDMA(timerHandle0->Instance->CNT);

Nun auf dem Uart gibt es mir zumindest immer eine 0 aus.

Was mache ich falsch?


Ja ich weiß es gibt viele Beispiele im Netz, aber die sind  für PWM 
Sachen und meistens im std-peripheral lib.

Ich will bei dem Projekt aber der Übersichtlichkeit halber bitte bei HAL 
bleiben ohne Workarounds soweit wie möglich (zumal es auch ne Vorgabe 
ist).

Danke.

von anonymous (Gast)


Lesenswert?

Ein Prescaler von 8000 und clockdiv 4 bedeutet wahrscheinlich, dass alle 
32000 Zyklen der Timer um eins erhöht wird. Kann es sein dass dein Code 
einfach weniger als 32000 Zyklen benötigt, bevor der Timer-Wert mit UART 
versendet wird?

von Bert (Gast)


Lesenswert?

Danke erstmal für die Antwort,

es scheint an der HAL_TIm_Base_Start funktion gelegen zu haben. Habe 
jetzt das CR1 Register das Enable Flag gesetzt und dann hats geklappt.

Komisch.

von Christian J. (Gast)


Lesenswert?

Kann mir mal jemand sagen was ein "Repetition Counter" ist?

htim1.Init.RepetitionCounter = 0;

Das habe ich bisher trotz AppNotes etc noch nicht klären können.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Schau mal in das .CHM File bzw. in die PDF Doku der HAL-Library. Oder 
noch einfacher in die Source- und Header-Files der entsprechenden 
Peripherie:

Specifies the repetition counter value. Each time the RCR downcounter 
reaches zero, an update event is generated and counting restarts from 
the RCR value (N). This means in PWM mode that (N+1) corresponds to:
•the number of PWM periods in edge-aligned mode
•the number of half PWM period in center-aligned mode This parameter 
must be a number between Min_Data = 0x00 and Max_Data = 0xFF. Note:This 
parameter is valid only for TIM1 and TIM8.


Um mal meine persönliche Meinung zu der HAL-Library in den Raum zu 
werfen:
Ich bin in meinem Projekt vor einiger Zeit auf die HAL-Library 
umgestiegen nur um dann nach etwa einem Monat wieder zurück zur SPL 
Library zu wechseln. Die HAL-Lib verkompliziert und verlangsamt meiner 
Meinung nach den kompletten Code. Ich kann inzwischen hier absolut keine 
Vorteile zur SPL bzw. zu direkten Registerzugriffen sehen. Ein ganz 
großes Problem ist die Reihenfolge der Library-Funktionen. Wenn man hier 
nicht aufpasst, verschwendet man wertvolle Zeit mit der Fehlersuche, 
warum etwas nicht so funktioniert wie gewollt. Nur um am Ende 
festzustellen, dass irgendeine Lib-Funktion irgendeinen Wert wieder 
resettet. Also ich für meinen Teil, verstehe den Sinn der HAL-Driver 
absolut nicht.

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.