Ich habe ein STM32F4Discovery Board und schaffe es einfach nicht ein genaues us (Mikrosekunden) Delay zu finden. Das Delay sollte von 1-3000us Delay bieten. Variante 1 For: for(i=0;i<someValue;i++) {} --> Leider ungenau wegen integer Sprung Variante 2 Timer: void delay_init( void ) { /* Enable timer clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* Time base configuration */ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t) ((SystemCoreClock /2) / 28000000) - 1; TIM_TimeBaseStructure.TIM_Period = 665; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /* Enable counter */ TIM_Cmd(TIM3, ENABLE); } void delay_us( uint16_t uSecs ) { uint16_t start = TIM3->CNT; /* use 16 bit count wrap around */ while((uint16_t)(TIM3->CNT - start) <= uSecs); } Hier kann ich Prescale als auch Period setzen wie ich möchte, es ändert sich nicht viel. Leider Wäre schön wenn mir jemand helfen könnte. Das STM32F4Discovery lauft bei 168MHz und hat einen 8MHz Quarz.
Ich bin auf diesen Beitrag gestossen, habe die Delay_us Funktion getestet. Leider ergibt ein Delay_us(1) ein Delay von 6us. Wenn ich Delay_us(2) setze, erhalte ich in Wahrheit 9.4us. Jemand eine Idee dazu?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.