Forum: Mikrocontroller und Digitale Elektronik STM32 Timer läuft nicht richtig.


von Dominik (Gast)


Lesenswert?

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);

von Peter D. (peda)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

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.