|
出現(xiàn)的是捕獲高電平的時(shí)間
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
delay_us(30);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
if(TIM_ICUserValueStructure.Capture_FinishFlag == 1)
{
// 計(jì)算高電平時(shí)間的計(jì)數(shù)器的值
time = TIM_ICUserValueStructure.Capture_Period * (0xffff+1) +
(TIM_ICUserValueStructure.Capture_CcrValue+1);
// 打印高電平脈寬時(shí)間
printf ( "\r\n測(cè)得高電平脈寬時(shí)間:%d.%d s\r\n",time/TIM_PscCLK,time%TIM_PscCLK );
TIM_ICUserValueStructure.Capture_FinishFlag = 0;
}
void TIM4_IRQHandler(void)
{
// 當(dāng)要被捕獲的信號(hào)的周期大于定時(shí)器的最長(zhǎng)定時(shí)時(shí),定時(shí)器就會(huì)溢出,產(chǎn)生更新中斷
// 這個(gè)時(shí)候我們需要把這個(gè)最長(zhǎng)的定時(shí)周期加到捕獲信號(hào)的時(shí)間里面去
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 )
{
// 計(jì)數(shù)器清0
TIM_SetCounter ( GENERAL_TIM, 0 );
// 自動(dòng)重裝載寄存器更新標(biāo)志清0
TIM_ICUserValueStructure.Capture_Period = 0;
// 存捕獲比較寄存器的值的變量的值清0
TIM_ICUserValueStructure.Capture_CcrValue = 0;
// 當(dāng)?shù)谝淮尾东@到上升沿之后,就把捕獲邊沿配置為下降沿
TIM_OC1PolarityConfig(GENERAL_TIM, TIM_ICPolarity_Falling);
// 開始捕獲標(biāo)準(zhǔn)置1
TIM_ICUserValueStructure.Capture_StartFlag = 1;
}
// 下降沿捕獲中斷
else // 第二次捕獲
{
// 獲取捕獲比較寄存器的值,這個(gè)值就是捕獲到的高電平的時(shí)間的值
TIM_ICUserValueStructure.Capture_CcrValue =
TIM_GetCapture1 (GENERAL_TIM);
// 當(dāng)?shù)诙尾东@到下降沿之后,就把捕獲邊沿配置為上升沿,好開啟新的一輪捕獲
TIM_OC1PolarityConfig(GENERAL_TIM, TIM_ICPolarity_Rising);
// 開始捕獲標(biāo)志清0
TIM_ICUserValueStructure.Capture_StartFlag = 0;
// 捕獲完成標(biāo)志置1
TIM_ICUserValueStructure.Capture_FinishFlag = 1;
}
TIM_ClearITPendingBit (GENERAL_TIM,GENERAL_TIM_IT_CCx);
}
}
|
|