|
一,定时器初始化
/*******************************************************************************
* 函 数 名 : time1_init
* 函数功能 : 定时器1端口初始化函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void time1_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //声明一个结构体变量,用来初始化GPIO
TIM_ICInitTypeDef TIM1_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 开启定时器1时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_ClearITPendingBit(TIM1,TIM_IT_Update);//清除TIMx的中断待处理位:TIM 中断源
TIM_TimeBaseInitStructure.TIM_Period =9999;//设置自动重装载寄存器周期的值100MS
TIM_TimeBaseInitStructure.TIM_Prescaler = 719;//设置用来作为TIMx时钟频率预分频值,100Khz计数频率
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
/* 设置中断参数,并打开中断 */
TIM1_ICInitStructure.TIM_Channel = TIM_Channel_4; //捕获通道
TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //xia沿捕获
TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //直接映射
TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //不分频每个变化捕获
TIM1_ICInitStructure.TIM_ICFilter = 0x00;//不滤波
TIM_ICInit(TIM1, &TIM1_ICInitStructure);
/* 设置NVIC参数 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=TIM1_CC_IRQn; ////TIM1 捕获中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC4,ENABLE); //使能更新中断和捕获中断
TIM_Cmd(TIM1, ENABLE); //使能定时器//使能或者失能TIMx外设
TIM_ClearITPendingBit(TIM1, TIM_IT_Update|TIM_IT_CC4 ); //清除标识
}
二、中断处理
/* 遥控器解码
*/
void TIM1_CC_IRQHandler(void)
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查TIM1更新中断标识
{
overflow++;
}
if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET) //检查TIM1通道4捕获标识
{
if(state==WAIT_FALLING) // 捕获下降沿
{
TIM1CH4_CAPTURE_VAL = TIM_GetCapture4(TIM1);//获得输入捕获的值
yktimvalue = TIM1CH4_CAPTURE_VAL + (overflow*720);
//判断高电平持续时间 大于 208a-87776vs 80a=33760vs/3520 a=422vs 3a=1266 vs
if(yktimvalue>8770)
{
ykaj_num = 0;
ykaj_value= 0;
}
overflow = 0;
TIM_SetCounter(TIM1,0);
state = WAIT_RISING;
TIM_OC4PolarityConfig(TIM1,TIM_ICPolarity_Rising); //设置上升沿触发
}
else if(state==WAIT_RISING) //捕获上升沿
{
TIM1CH4_CAPTURE_VAL = TIM_GetCapture4(TIM1);
yktimvalue = TIM1CH4_CAPTURE_VAL;
//判断低电平持续时间 422 1266 vs
if(yktimvalue>40 && yktimvalue<50)
{
ykaj_bit=0;//收到数据 0
}
else if(yktimvalue>125 && yktimvalue<135)
{
ykaj_bit=1;//收到数据 1
}
ykaj_value<<=1;
ykaj_value+=ykaj_bit;
ykaj_num++;
if(ykaj_num>=24)
{
yk_keys =(u16)ykaj_value;
yk_keys&=0x0fff;
ykaj_value>>=12;
if(yk_keys==(u16)ykaj_value)
{
ykaj_bzok=1;
}
else
{
ykaj_num = 0;
ykaj_value= 0;
}
}
if(yktimvalue<40 || yktimvalue>135)
{
ykaj_num = 0;
ykaj_value= 0;
}
overflow = 0;
TIM_SetCounter(TIM1,0);
state = WAIT_FALLING;
TIM_OC4PolarityConfig(TIM1,TIM_ICPolarity_Falling); //设置下降沿触发
}
}
TIM_ClearITPendingBit(TIM1, TIM_IT_Update|TIM_IT_CC4 ); //清除标识
}
|
评分
-
查看全部评分
|