STM32 Timer läuft nicht richtig.

Gast #2337186
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);
#2337226
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren