出現的是捕獲高電平的時間
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
delay_us(30);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
if(TIM_ICUserValueStructure.Capture_FinishFlag == 1)
{
// 計算高電平時間的計數器的值
time = TIM_ICUserValueStructure.Capture_Period * (0xffff+1) +
(TIM_ICUserValueStructure.Capture_CcrValue+1);
// 打印高電平脈寬時間
printf ( "\r\n測得高電平脈寬時間:%d.%d s\r\n",time/TIM_PscCLK,time%TIM_PscCLK );
TIM_ICUserValueStructure.Capture_FinishFlag = 0;
}
void TIM4_IRQHandler(void)
{
// 當要被捕獲的信號的周期大于定時器的最長定時時,定時器就會溢出,產生更新中斷
// 這個時候我們需要把這個最長的定時周期加到捕獲信號的時間里面去
if ( TIM_GetITStatus ( GENERAL_TIM, TIM_IT_Update) != RESET )
{
TIM_ICUserValueStructure.Capture_Period ++;
TIM_ClearITPendingBit ( GENERAL_TIM, TIM_FLAG_Update );
}
// 上升沿捕獲中斷
if ( TIM_GetITStatus (GENERAL_TIM, GENERAL_TIM_IT_CCx ) != RESET)
{
// 第一次捕獲
if ( TIM_ICUserValueStructure.Capture_StartFlag == 0 )
{
// 計數器清0
TIM_SetCounter ( GENERAL_TIM, 0 );
// 自動重裝載寄存器更新標志清0
TIM_ICUserValueStructure.Capture_Period = 0;
// 存捕獲比較寄存器的值的變量的值清0
TIM_ICUserValueStructure.Capture_CcrValue = 0;
// 當第一次捕獲到上升沿之后,就把捕獲邊沿配置為下降沿
TIM_OC1PolarityConfig(GENERAL_TIM, TIM_ICPolarity_Falling);
// 開始捕獲標準置1
TIM_ICUserValueStructure.Capture_StartFlag = 1;
}
// 下降沿捕獲中斷
else // 第二次捕獲
{
// 獲取捕獲比較寄存器的值,這個值就是捕獲到的高電平的時間的值
TIM_ICUserValueStructure.Capture_CcrValue =
TIM_GetCapture1 (GENERAL_TIM);
// 當第二次捕獲到下降沿之后,就把捕獲邊沿配置為上升沿,好開啟新的一輪捕獲
TIM_OC1PolarityConfig(GENERAL_TIM, TIM_ICPolarity_Rising);
// 開始捕獲標志清0
TIM_ICUserValueStructure.Capture_StartFlag = 0;
// 捕獲完成標志置1
TIM_ICUserValueStructure.Capture_FinishFlag = 1;
}
TIM_ClearITPendingBit (GENERAL_TIM,GENERAL_TIM_IT_CCx);
}
}
|