2017-03-02 5 views
0

Ich verwende Timer, um die LED alle 1 Sekunde ein-/auszuschalten (anstelle der Verzögerungsfunktion). Allerdings, wenn ich diesen Code auf IAR IDE ausführen, die LED an/aus bei ca. 2,5-3 Sekunden, nicht 1 Sekunde wie ich will. Ich frage mich, ob es einen Fehler im Code gibt, oder muss ich irgendwo für die korrekte Taktgeschwindigkeit ändern?Mein Timer in STM32F4 führt die Verzögerung nicht korrekt aus

Ich verwende Standard-Peripherie-Bibliothek, und die IDE, die ich verwende, ist IAR.

#include "stm32f4xx.h" 

GPIO_InitTypeDef GPIO_InitStructure; 
TIM_TimeBaseInitTypeDef TIM_BaseStruct; 

void GPIO_Configuration(void); 
void TIM_Configuration(void); 
void Delay(__IO uint32_t nCount); 

int main(void) 
{ 
    GPIO_Configuration(); 
    TIM_Configuration(); 
    while(1) 
    { 
    if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update) != RESET) 
    { 
     TIM_ClearFlag(TIM2,TIM_IT_Update); 
     GPIO_ToggleBits(GPIOD,GPIO_Pin_14); 
    } 
    } 
} 

void GPIO_Configuration(void) 
{ 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); 

    /* Configure PB0 PB1 in output pushpull mode */ 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 
    GPIO_Init(GPIOD, &GPIO_InitStructure); 
} 

void TIM_Configuration(void) 
{ 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); 

    TIM_BaseStruct.TIM_Prescaler = 42000-1; 
    TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up; 
    TIM_BaseStruct.TIM_Period = 2000-1; 
    TIM_BaseStruct.TIM_ClockDivision = 0; 
    TIM_BaseStruct.TIM_RepetitionCounter = 0; 

    TIM_TimeBaseInit(TIM2,&TIM_BaseStruct); 

    TIM_Cmd(TIM2,ENABLE); 
} 


void Delay(__IO uint32_t nCount) 
{ 
    while(nCount--) 
    { 
    } 
} 

#ifdef USE_FULL_ASSERT 
void assert_failed(uint8_t* file, uint32_t line) 
{ 
    /* User can add his own implementation to report the file name and line number, 
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ 

    /* Infinite loop */ 
    while (1) 
    { 
    } 
} 
#endif 
+1

Der Timer zählt nur Taktzyklen, die Bedeutung der Prescaler-/Periodenwerte hängt also vollständig von Ihrer Taktfrequenz ab, die Sie nicht angegeben haben. – jasonharper

+0

Könnten Sie bitte im Detail angeben, wo ich die Taktfrequenz in IAR sehen und ändern kann? (nicht in Keil C) –

+0

In Ihrem Code gibt es keinen Platz, an dem Sie die Taktfrequenz direkt angeben würden. Sie müssen dies nur bei der Auswahl der Timer-Parameter berücksichtigen. – jasonharper

Antwort

0

Ich gehe davon aus, dass Ihre Taktfrequenz 168Mhz ist. Mit Ihren aktuellen Prescaler- und Periodenwerten würde dies Ihren Timer auf 2s bringen.

(CLK_FREQ/(PRESCALER * PERIOD)) = (168MHZ/(42000 * 2000)) = 2 seconds 

Versuchen Sie, die Zeit zu 1000 Ändern, um es bei 1s laufen zu lassen. Dies setzt wiederum voraus, dass Ihre Taktfrequenz 168 MHz beträgt. Wenn Ihre Taktfrequenz anders ist, können Sie einfach die PRESCALER und PERIOD Werte (siehe oben) berechnen, um 1s zu erhalten.

Verwandte Themen