2017-06-06 2 views
0

J'ai rencontré un problème avec la configuration du temporisateur dans STM32F051. J'utilise StdPeriphLibrary, et je souhaite générer une interruption toutes les 1 ms (freq = 1kHz).Configuration du temporisateur STM32F051

C'est l'initialisation de la temporisation:

void TIMER_initHardware(void) 
{ 

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); 

    GPIO_InitTypeDef gpioInitStruct; 
    gpioInitStruct.GPIO_Mode = GPIO_Mode_OUT; 
    gpioInitStruct.GPIO_OType = GPIO_OType_PP; 
    gpioInitStruct.GPIO_Pin = GPIO_Pin_12; 
    gpioInitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; 
    gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_Init(GPIOA, &gpioInitStruct); 
    GPIO_ResetBits(GPIOA, GPIO_Pin_12); 

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
    TIM_OCInitTypeDef  TIM_OCInitStructure; 
    NVIC_InitTypeDef  NVIC_InitStructure; 

    NVIC_InitStructure.NVIC_IRQChannel     = TIM2_IRQn; 
    NVIC_InitStructure.NVIC_IRQChannelPriority   = 3; 
    NVIC_InitStructure.NVIC_IRQChannelCmd    = ENABLE; 
    NVIC_Init(&NVIC_InitStructure); 

    RCC_PCLKConfig(RCC_HCLK_Div1); 

    SystemCoreClockUpdate(); 

    TIM_TimeBaseStructure.TIM_Period  = 0xFFFF; //32767; 
    TIM_TimeBaseStructure.TIM_Prescaler  = (SystemCoreClock/1000000)-1; 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 

    TIM_OCInitStructure.TIM_OCMode  = TIM_OCMode_Timing; 
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    TIM_OCInitStructure.TIM_Pulse  = TIMER_TIM2_ADD_1MS; 
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 

    TIM_OC1Init(TIM2, &TIM_OCInitStructure); 
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); 

    TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); 

    TIM_Cmd(TIM2, ENABLE); 

} 

Et voici la routine d'interruption:

void TIM2_IRQHandler(void) 
{ 
    if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) 
    { 
     TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); 
     TIM_SetCompare1(TIM2, TIM_GetCapture1(TIM2) + TIMER_TIM2_ADD_1MS); 
     tick = 1; 
     if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_12)) 
     { 
      GPIO_ResetBits(GPIOA, GPIO_Pin_12); 
     } 
     else 
     { 
      GPIO_SetBits(GPIOA, GPIO_Pin_12); 
     } 

} 

Ce code génère une interruption toutes les 66 ms - vérifié sur oscilloscope.

Aucune autre interruption n'est utilisée dans l'application.

Répondre

0

Essayez de mettre à jour votre code d'initialisation avec:

... 
TIM_TimeBaseStructure.TIM_Period  = 999; 
... 
TIM_OCInitStructure.TIM_Pulse  = 0; 
... 

Vous avez réglé l'horloge de votre minuterie à 1MHz (prédiviseur), donc vous devez diviser cela en 1000 (période = 1000-1 = 999). Le pouls n'est pas utilisé ici.

également dans votre gestionnaire d'interruption, je ne suis pas sûr que vous devez faire cela et je pense qu'il peut être retiré:

TIM_SetCompare1(TIM2, TIM_GetCapture1(TIM2) + TIMER_TIM2_ADD_1MS);