這里我只介紹一下timer.c中的一個函數(shù)机久,其他的幾個函數(shù)都是初始化函數(shù)叫挟,這個大家都很清楚双炕,也沒什么好講的踱蠢。接下來就看看我接下來要講的函數(shù):
u8 TIM2CH1_CAPTURE_STA=0; //輸入捕獲狀態(tài)
u16 TIM2CH1_CAPTURE_VAL; //輸入捕獲值
//定時器2中斷服務(wù)程序
void
TIM2_IRQHandler(void)
{
if((TIM2CH1_CAPTURE_STA&0X80)==0)//還未成功捕獲
{
if (TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)//檢查指定的TIM中斷發(fā)生與否:TIM 中斷源
{
if(TIM2CH1_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
{
TIM2CH1_CAPTURE_STA|=0X80;//標記成功捕獲了一次
TIM2CH1_CAPTURE_VAL=0XFFFF;
}
else
{
TIM2CH1_CAPTURE_STA++;
}
}
}
if (TIM_GetITStatus(TIM2,TIM_IT_CC1) != RESET)//捕獲1發(fā)生捕獲事件
{
if(TIM2CH1_CAPTURE_STA&0X40) //捕獲到一個下降沿
{
TIM2CH1_CAPTURE_STA|=0X80; //標記成功捕獲到一次上升沿
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);//記下捕獲的值
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);//CC1P=0 設(shè)置為上升沿捕獲
}else //還未開始,第一次捕獲上升沿
{
TIM2CH1_CAPTURE_STA=0; //清空
TIM2CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM2CH1_CAPTURE_STA|=0X40; //標記捕獲到了上升沿
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC1P=1 設(shè)置為下降沿捕獲
}
}
}
TIM_ClearITPendingBit(TIM2,
TIM_IT_CC1|TIM_IT_Update); //清除中斷標志位
}
開頭定義的兩個全局變量:TIM2CH1_CAPTURE_STA的作用在接下來我們會講到袖肥,而TIM2CH1_CAPTURE_VAL則是我們在主函數(shù)中計算時間所需要用到的數(shù)咪辱。
TIM2CH1_CAPTURE_STA是一個八位二進制數(shù),各個位的作用如下:
現(xiàn)在讓我們來好好看看這個中斷函數(shù)椎组。
第一個if判斷判斷的是TIM2CH1_CAPTURE_STA的最高位是不是0油狂,如果為0表示還沒有完全捕獲到一個完整的高電平(有一個上升沿和一個下降沿),在剛開始這個判斷肯定為真寸癌,現(xiàn)在讓我們進入這個函數(shù)专筷,緊接著的這個判斷if (TIM_GetITStatus(TIM2,
TIM_IT_Update) != RESET)判斷的是TIM2是否發(fā)生了中斷,再下面的一層判斷if(TIM2CH1_CAPTURE_STA&0X40)則是判斷TIM2CH1_CAPTURE_STA的第二高位是否為1蒸苇,如果為1磷蛹,則表示已經(jīng)接收到了一個上升沿。再往里if判斷的我將會在最后的一個流程內(nèi)解釋清楚溪烤。
if (TIM_GetITStatus(TIM2,
TIM_IT_CC1) != RESET)這個if判斷判斷的則是是否捕獲到你定義的捕獲(這里就是上升沿捕獲或者下降沿捕獲)味咳,前面的初始化函數(shù)里已經(jīng)初始化為上升沿捕獲庇勃,所以第一次這是是判斷是否捕獲到上升沿。如果捕獲到了槽驶,進入第二層判斷匪凉,判斷TIM2CH1_CAPTURE_STA的次高位是否為1,不是1則執(zhí)行else內(nèi)的內(nèi)容捺檬。
講了這么多,我想你們可能還沒有完全理解贸铜,接下來我就以一個高電平的例子來講一下這個中斷函數(shù)堡纬。
開始了,進行第一層判斷if((TIM2CH1_CAPTURE_STA&0X80)==0)蒿秦,這時TIM2CH1_CAPTURE_STA=00000000烤镐,為真,進入判斷if (TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET) 棍鳖,這個判斷在TIM2發(fā)生中斷的時候自動進入炮叶,關(guān)鍵在if(TIM2CH1_CAPTURE_STA&0X40)這個判斷,前面我們說了TIM2CH1_CAPTURE_STA=00000000渡处,沒有執(zhí)行這個判斷內(nèi)部代碼的權(quán)利镜悉,只有次高位為1即TIM2CH1_CAPTURE_STA=x1xxxxxx時,才有權(quán)利進去医瘫。所以侣肄,我們把他先放在一邊。
接下來我們看這個判斷if (TIM_GetITStatus(TIM2, TIM_IT_CC1)!= RESET)醇份,前面我們也說了稼锅,這個是判斷是否捕獲到上升沿的。好的僚纷,這個判斷就是我們的開始矩距,當我們捕獲到一個上升沿的時候,進入怖竭,if(TIM2CH1_CAPTURE_STA&0X40)為假锥债,執(zhí)行else,
else
{
TIM2CH1_CAPTURE_STA=0;
TIM2CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM2CH1_CAPTURE_STA|=0X40;
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);
}
這里讓TIM2CH1_CAPTURE_STA的次高位為1了侵状,而且改成了捕獲下降沿T廾帧!Hば帧U雷蟆!
然后在接下執(zhí)行中斷函數(shù)的時候 艇潭,我們就有進入這個if(TIM2CH1_CAPTURE_STA&0X40)判斷的權(quán)利拼窥,因為現(xiàn)在TIM2CH1_CAPTURE_STA=01xxxxxx,現(xiàn)在我們看這個判斷內(nèi)的代碼:
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)
{
TIM2CH1_CAPTURE_STA|=0X80;
TIM2CH1_CAPTURE_VAL=0XFFFF;
}
else
{
TIM2CH1_CAPTURE_STA++;
}
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)這個判斷的是TIM2CH1_CAPTURE_STA后六位是否都為1戏蔑,如果都為1表示這個高電平的時間很長很長,這時強制將TIM2CH1_CAPTURE_STA的最高位置1鲁纠,令TIM2CH1_CAPTURE_VAL=0XFFFF总棵,完成一個高電平的接收。如果后六位不都為1改含,TIM2CH1_CAPTURE_STA++情龄,表示溢出次數(shù)加1.。如此反復(fù)捍壤,直至到下降沿的到來骤视。
當下降沿到來的時候if (TIM_GetITStatus(TIM2, TIM_IT_CC1) !=RESET)為真(因為前面已經(jīng)將捕獲事件改為捕獲下降沿!>榫酢专酗!這里不再是捕獲上升沿),第二層判斷if(TIM2CH1_CAPTURE_STA&0X40)也為真
if(TIM2CH1_CAPTURE_STA&0X40)
{
TIM2CH1_CAPTURE_STA|=0X80;
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);
}
將TIM2CH1_CAPTURE_STA最高位置1,讀取最后一次中斷計數(shù)器內(nèi)的數(shù),再改為捕獲上升沿盗扇,為下一次讀取高電平做準備祷肯。
到這里,一個高電平就讀取完了疗隶,數(shù)據(jù)將在主函數(shù)中處理佑笋。
總而言之,當TIM2CH1_CAPTURE_STA最高位置1時斑鼻,一個高電平就讀取完了允青。