管理员
- 积分
- 165353
- 金钱
- 165353
- 注册时间
- 2010-12-1
- 在线时间
- 2108 小时
|
发表于 2013-11-7 11:45:44
|
显示全部楼层
做过,不过是STM8S207的。不过应该也差不多。
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数
u8 TIM2CH2_CAPTURE_STA=0; //输入捕获状态
u16 TIM2CH2_CAPTURE_VAL; //输入捕获值
//定时器2捕获中断服务函数
INTERRUPT_HANDLER(TIM2_UPD_OVF_IRQHandler,TIM2_UPD_OVF_VECTOR)
{
u8 tsr;
static u8 led;
tsr=TIM2->SR1;
if((TIM2CH2_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if(tsr&0X01)//溢出
{
if(TIM2CH2_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM2CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM2CH2_CAPTURE_VAL=0XFFFF;
}else TIM2CH2_CAPTURE_STA++;
}
}
}
LED1_SET(led=!led);
TIM2->SR1&=~(1<<0);//清除溢出中断标志位
}
//TIM2捕获中断服务函数
INTERRUPT_HANDLER(TIM2_CAP_COM_IRQHandler,TIM2_CAP_COM_VECTOR)
{
u8 tsr;
tsr=TIM2->SR1;
if((TIM2CH2_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if(tsr&0x04)//捕获2发生捕获事件
{
if(TIM2CH2_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM2CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次低电平脉宽
TIM2CH2_CAPTURE_VAL=TIM2->CCR2H;//获取当前的捕获值.
TIM2CH2_CAPTURE_VAL<<=8;
TIM2CH2_CAPTURE_VAL+=TIM2->CCR2L;
TIM2->CCER1|=1<<5; //CC2P=1 设置为下降沿捕获
}else //还未开始,第一次捕获下降沿
{
TIM2->CNTRH=0; //计数器清空
TIM2->CNTRL=0; //计数器清空
TIM2CH2_CAPTURE_STA=0; //清空
TIM2CH2_CAPTURE_VAL=0;
TIM2CH2_CAPTURE_STA|=0X40; //标记捕获到了下降沿
TIM2->CCER1&=~(1<<5); //CC2P=0 设置为上升沿捕获
}
}
}
TIM2->SR1&=~(1<<2);//清除捕获中断标志位
}
//定时器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
}
int main( void )
{
u8 t,i;
u32 temp=0;
stm8_clock_init(1,0); //用内部HSE作为时钟,不分频,24Mhz
delay_init(24); //初始化延时函数
uart_init(24,9600); //9600波特率
BEEP_Init();
LED_Init();
KEY_Init();
EXIT_Init();
TIM2_CAP_Init(3,0XFFFF);//3Mhz的捕获计数频率
INT_ENABLE();
printf("OK\r\n");
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\r\n",temp/3);//打印总的高点平时间
TIM2CH2_CAPTURE_STA=0; //开启下一次捕获
}
}
} |
|