Forum: Mikrocontroller und Digitale Elektronik STM32F4 Delay mit Timer


von Hannes (Gast)


Lesenswert?

Hallo,
momentan versuche ich mit dem STM32F4 einen Delay (ms) mit Hilfe eines 
Timers zu realisieren. Der Takt am APB1 beträgt 50MHz. Mit einem 
Prescaler von 49999 ergibt sich eine Zählfrequenz von 1kHz.
Hier der Code soweit:
1
void initDelay()
2
{
3
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
4
  // Clock enable
5
6
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
7
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
8
  // Timer init
9
  TIM_TimeBaseStructure.TIM_Period =  0;
10
  TIM_TimeBaseStructure.TIM_Prescaler = 49999;
11
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
12
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
13
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
14
}
15
16
void Delayms(uint32_t ms)
17
{
18
    TIM_Cmd(TIM2, DISABLE);
19
    TIM2->ARR = ms;
20
    TIM_Cmd(TIM2, ENABLE);
21
    while(!TIM_GetFlagStatus(TIM2,TIM_FLAG_Update) != RESET);
22
    TIM_ClearFlag(TIM2,TIM_IT_Update);
23
}
24
25
int main(void)
26
{
27
    SystemInit();
28
    InitGPIO();
29
    initDelay();
30
    while (1)
31
    {
32
        GPIO_WriteBit(GPIOD, 0x2000, SET);
33
        Delayms(1);
34
        GPIO_WriteBit(GPIOD, 0x2000,RESET);
35
        Delayms(3);
36
    }
37
}
Übergibt man als Parameter eine 1, so erhält man ein Delay von 1ms. Um 
jedoch ein Delay von 2ms zu erhalten ist eine 3 zu übergeben. Für 3ms 
eine 5. Dies lässt sich zumindest mit einem Oszi nachmessen.
Kann mir jemand erklären wie das Zustande kommt?
Viele Grüße
Hannes

von STM Apprentice (Gast)


Lesenswert?

Sorry, diesen Kommentar willst du nicht hören, aber mit
solch einem Mechanismus macht man kein Delay. Viel zu
umständlich und "verschwendet" einen Timer.

Da auf den STM Controllern sowieso meist ein System Tick
Counter läuft benutzt man diesen auch dazu um solche
Delays zu erzeugen. Sehr einfach und Beispiele dazu gibt
es genug im Netz.

von STM Apprentice (Gast)


Lesenswert?

STM Apprentice schrieb:
> Beispiele dazu gibt es genug im Netz.

Auch hier ganz in der Nähe:

Beitrag "STM32 - relativ praezises Delay ohne Timer"

Sehr leicht umsetzbares Beispiel von unserem Stefan:

Beitrag "Re: STM32 - relativ praezises Delay ohne Timer"
(im zweiten Teil des Beitrages)

von Hannes (Gast)


Lesenswert?

Vielen Dank.
In der StdPeriph lib war auch ein Beispiel dazu drin, habs soweit 
umgesetzt. Jedoch würde mich trotzdem noch interessieren, wieso das mit 
dem Timer nicht so wie gedacht funktioniert.

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.