//定时器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; //开启下一次捕获
}
}
你不是测高电平时间吗?
还是我的理解有错误?
一周热门 更多>