相关文章:
http://blog.csdn.net/zhangxuechao_/article/details/75039906
举例
u8 ir_tick() //记录高电平时间
{
u8 i = 0;
while(ir_in == 1)
{
i++;
if(i >= 250)
{
break;
}
delay_us(20); //一次循环20um
}
return i;
}
void EXTI15_10_IRQHandler()
{
u8 i = 0;
u32 ir = 0;
u8 ok = 0;
u8 tick;
u8 data;
if(EXTI_GetITStatus(EXTI_Line15) == SET)
{
led1 = ~led1;
while(1)
{
if(ir_in == 1)
{
tick = ir_tick();
if(tick >= 250) //错误码
{
break;
}
else if((tick >= 200) && (tick < 250)) //起始码
{
ok = 1;
continue;
}
else if((tick >= 25) && (tick <= 40)) //0
{
data = 0;
}
else if((tick >= 75) && (tick <= 90)) //1
{
data = 1;
}
else
{
break;
}
if(ok == 1)
{
ir <<= 1;
ir |= data;
}
if(i++ >= 32)
{
break;
}
}
}
if(ok == 1)
{
printf("ir %08x\n", ir);
}
}
EXTI_ClearITPendingBit(EXTI_Line15);
}
void IR_init()
{
GPIO_InitTypeDef gpio =
{
GPIO_Pin_15,
GPIO_Speed_50MHz,
GPIO_Mode_IPU
};
EXTI_InitTypeDef exti =
{
EXTI_Line15,
EXTI_Mode_Interrupt,
EXTI_Trigger_Falling,
ENABLE
};
NVIC_InitTypeDef nvic =
{
EXTI15_10_IRQn,
2,
2,
ENABLE
};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO, ENABLE);
GPIO_Init(GPIOG, &gpio);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource15);
NVIC_Init(&nvic);
EXTI_Init(&exti);
}