// 当边沿触发器检测到边沿时,进入定时器中断程序 void TIM5_IRQHandler() // 定时器5输入捕获中断函数 { if((TIM5CH1_CAPTURE_STA&0X80)==0) // 还未成功捕获一次完整的高电平(上升沿+下降沿) { if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) // 判断是否为更新中断 { if(TIM5CH1_CAPTURE_STA&0X40) // 第6位为1:已经捕获到高电平了(上升沿) { if((TIM5CH1_CAPTURE_STA&0x3f)==0x3f) // 低5位全为1:高电平太长了 { TIM5CH1_CAPTURE_STA|=0x80; // 强制标记成功捕获了一次完整的高电平 TIM5CH1_CAPTURE_VAL=0xffff; } else { TIM5CH1_CAPTURE_STA++; // 否则让溢出次数加1 } } } } if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) // 捕获1发生捕获事件 { if(TIM5CH1_CAPTURE_STA&0X40) // 捕获到一个下降沿 { TIM5CH1_CAPTURE_STA|=0X80; // 标记成功捕获到一次上升沿(本次捕获完毕) TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); // 获得TIM5输入捕获1的值 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); // 设置为上升沿捕获 } else { TIM5CH1_CAPTURE_STA=0; // 清空 TIM5CH1_CAPTURE_VAL=0; TIM_SetCounter(TIM5,0); TIM5CH1_CAPTURE_STA|=0X40; // 标记捕获到了上升沿 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); // 设置为下降沿捕获 } } TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); // 清除中断标志位 }