原子哥!你看看你发的STM8定时器2通道2的输入捕获的程序,理解不对哦

2019-07-19 21:34发布

//定时器2.输入捕获初始化代码
//输入捕获计数频率: Fmaster/(2^psc)
//输入捕获最大值:arr
//psc:分配系数,0~15;分频系数为:2^psc,最大为2^15=32768分频
//arr:自动重装载值,0~65535
void TIM2_CAP_Init(u8 psc,u16 arr)

         CLK->CKENR1|=1<<5; //开启TIM2时钟
         GPIOD->DDR&=~(1<<3);//PD3 输入模式
        GPIOD->CR1|=1<<3; //PD3,上拉
        GPIOD->CR2&=~(1<<3);//PD3,不使用中断

        TIM2->SCR=psc; //2^psc次方分频
        TIM2->ARRH=arr>>8; //必须先设置ARR的高字节
        TIM2->ARRL=arr&0XFF;//再设置低字节

        TIM2->CCMR2|=1<<0; //CC2映射在TI2FP2上
TIM2->CCMR2|=0<<2; //无预分频,每个事件一次捕获
TIM2->CCMR2|=0<<4; //无滤波,Fmaster采样.
TIM2->CCER1|=1<<5; //捕获下降沿
TIM2->CCER1|=1<<4; //IC2输入捕获使能,允许捕获计数器的值到捕获寄存器中

TIM2->CR1|=1<<7; //预装载使能
TIM2->IER|=1<<0; //使能更新中断
TIM2->IER|=1<<2; //通道2捕获中断使能
TIM2->CR1|=1<<0; //使能TIM2 
ITC_Set(TIM2_UPD_OVF_VECTOR,3); //优先级3
}

是这样的,原子哥你的程序首先设置下降沿捕获,然后进一个下降沿的中断,记录此时的捕获寄存器的值,再改为上升沿
然后在下一次上升沿的中断,记录此时的捕获寄存器的值。实际测得电平过程是:下降沿??低电平??上升沿
这不是测低电平时间吗?
你的程序是:
while(1) 
{  
if(t==20)

LED0_SET(i=!i);
t=0;  
}
t++;
delay_ms(10);  
  if(TIM2CH2_CAPTURE_STA&0X80)//成功捕获到了一次高电平
{
temp=TIM2CH2_CAPTURE_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM2CH2_CAPTURE_VAL; //得到总的高电平时间
printf("HIGH:%ld us ",temp/3);//打印总的高点平时间
TIM2CH2_CAPTURE_STA=0; //开启下一次捕获
}
}
你不是测高电平时间吗?
还是我的理解有错误?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。