月度归档:2019年04月

STM32中TIM定时器中断的一个细节问题记录

今天调试的时候发现,当使用TIM定时器作为计时器使用的时候,TIM定时器的中断服务函数第一次执行,是在TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );语句后就开始执行的,而不是到达第一个计数周期的时候。

这对仅利用一次定时器的程序有一定影响。

 

void TIM4_Int_Init(u16 period,void (*__TIM4_IRQHandler_Inside__)(void))
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    RCC_ClocksTypeDef RCC_ClocksStatus;
    uint16_t prescaler;         
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); 
    RCC_GetClocksFreq(&RCC_ClocksStatus);
    prescaler = RCC_ClocksStatus.SYSCLK_Frequency / 1000000 ;       
    TIM_TimeBaseStructure.TIM_Period = period-1;                                    //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ     ¼ÆÊýµ½5000Ϊ5000ms
    TIM_TimeBaseStructure.TIM_Prescaler =(prescaler*1000)-1;            //ÏÖÔÚÿ´Î+1ÊÇ1ms 32000·ÖƵ  32000000/32000=1000 ÿÃëÖÓ¸üÐÂ1000´Î£¬Ã¿´Î¸üÐÂÊÇ1ms
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                    //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);                             //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»
print_d("1\n");
    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); 
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&NVIC_InitStructure);  
print_d("2\n");
    TIM4_IRQHandler_Inside=__TIM4_IRQHandler_Inside__;
    TIM_Cmd(TIM4, ENABLE); 
print_d("3\n");
    EXTIstatus.Tim4IsUsing=1;
    print_d("TIM4 init finished\n");
}

串口调试输出: 继续阅读