STM32 Timer läuft nicht richtig.

Gast #2337186
Morgen,

ich benötige einen µs-Delay und wollte dafür einen Timer dafür nutzen. 
Leider läuft dieser nicht so genau und hoffe ihr könnt mir weiterhelfen. 
Ich vermute zurzeit einen Fehler bei der Timer Clock bin mir aber keiner 
Prüfmöglichkeit bewusst wie ich testen kann ob diese richtig taktet. Es 
handelt sich um einen STM32f103RBT6. Vielleicht fällt euch aber auch ein 
Fehler in meinem Code auf:
1
  /* Time base configuration */
2
  TIM_DeInit(TIM3);
3
  TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / 1000000) - 1;
4
  TIM_TimeBaseStructure.TIM_Period = usValue-1;
5
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
6
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
7
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
8
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
9
  
10
  /* Clear the update interrput flag and finally start the timer */
11
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);
12
  TIM_Cmd(TIM3, ENABLE);
13
 
14
  /* Wait for Tim3 expiring, stop timer and clear update flag. Generate the desired delay. */  
15
  while(TIM_GetFlagStatus(TIM3, TIM_FLAG_Update) == RESET);
16

17
  TIM_Cmd(TIM3, DISABLE);
18
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);
#2337196
Dominik schrieb:
> Leider läuft dieser nicht so genau und hoffe ihr könnt mir weiterhelfen.

Definiere "genau" mal genauer.

Eine µs sind bei 50MHz nur 50 CPU-Zyklen und die sind bei nem RISC 
schnell verbraten.
Du mußt also die Befehlsausführungszeiten mit berücksichtigen. Schau dir 
mal das Assemblerlisting an.


Peter
#2337226
Wenn du erwartest, dass dieser gesamte Code bei Delays im unteren 
Mikrosekundenbereich ziemlich genau ist, dann unterschätzt du den durch 
Initialisierung und Library entstehenden Aufwand.

Wenn sowas einigermassen genau werden soll, dann sollte der Timer 
bereits vorher zu unkritischer Zeit initialisiert werden, so dass in der 
zeitrelevanten Phase nur noch Start und Abfrage erforderlich sind, die 
dann nicht als Lib-Aufrufe sondern über die entsprechenden Register 
erfolgen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 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.