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则是表示捕获高电平或定时器溢出的次数。