1 u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态 2 u16 TIM5CH1_CAPTURE_VAL; //输入捕获值 3 4 //定时器5中断服务程序 5 void TIM5_IRQHandler(void) 6 { 7 8 if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获 9 { 10 if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) 11 12 { 13 if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了 14 { 15 if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了 16 { 17 TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次 18 TIM5CH1_CAPTURE_VAL=0XFFFF; 19 }else TIM5CH1_CAPTURE_STA++; 20 } 21 } 22 if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件 23 { 24 if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿 25 { 26 TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽 27 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); 28 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获 29 }else //还未开始,第一次捕获上升沿 30 { 31 TIM5CH1_CAPTURE_STA=0; //清空 32 TIM5CH1_CAPTURE_VAL=0; 33 TIM_SetCounter(TIM5,0); 34 TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿 35 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获 36 } 37 } 38 } 39 40 TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位 41 42 }
因此上面代码写的0x80就指的是捕获完成标志,0x40指的是捕获到高电平标志,0x00~0x3f则是表示捕获高电平或定时器溢出的次数。