STM32F4 Timer HAL

Gast #4504713
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.
Gast #4505126
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?
Gast #4505626
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.
Gast #4505750
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.
(Firma: HEGRO GmbH) #4506047
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.