#include "capture.h"
extern u16 cap_value[cap_len];//用来保存捕获的计数值
extern u8 cap_num; //进入捕获次
extern u8 capture_end_flag;
void ir_capture_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef TIM2_ICInitStructure;
//开启定时器2时钟和GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//PA.0作为输入捕获通道,上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//计数周期为arr*1us,20ms后会溢出,一般不会溢出
//溢出一般发生在一个红外信号结束后在捕获到上升沿后一直没有捕获到下降沿,而且这个时间一般比20ms大,所以溢出可以用来表示一个红外信号结束
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//定时器2捕获通道1,初始化为下降沿捕获,因为红外接收头在没有信号的时候输出为高
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM2_ICInitStructure.TIM_ICFilter = 0x3;
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
//设置捕获的优先级最高
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//这边要设置2种中断模式
CAP_INT_EN(0);
//暂时关闭定时器,要使用时在开启
CAP_EN(0);
}
//定时器2中断处理函数
void TIM2_IRQHandler(void)
{
u16 TIM2CH1_CAPTURE_VAL=0;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(cap_num!=0)//
{
CAP_INT_EN(0);//结束此次捕获
CAP_EN(0);
cap_value[cap_num-1]=cap_value[cap_num-2]; //暂时将最后一个脉冲补充成一组信号,即复制它前一个数据
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);
capture_end_flag=1;
}
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
if(cap_num==0)
{
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);
}
else
{
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
cap_value[cap_num-1]=TIM2CH1_CAPTURE_VAL;
if(cap_num&0x01)
{
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);
}
else
{
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);
}
}
TIM_SetCounter(TIM2,0);
cap_num++;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update);
}
|