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