今天调试的时候发现,当使用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"); }
串口调试输出: 继续阅读