昨天开始调红外通讯,我是通过外部中断的下降沿触发,进入中断函数后,当检测到高电平出现时就开始计时高电平保持的时长, 但是现在的问题是 这个外部中断函数每次都只能在按下的时候,能够检测到同步码4.5ms的高电平,后面的数据传输都不能进入外部中断,求解?下面的相关代码
void EXIT_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource8); //配置PC8为外部中断
EXTI_ClearITPendingBit(EXTI_Line8);
EXTI_InitStructure.EXTI_Line = EXTI_Line8;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设置触发方式为下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void EXTI9_5_IRQHandler(void)
{
u8 StartFlag=0;
u8 RxBit=0;
while(1)
{
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8))
{
PulseWidth=Pulse_Width_Check(); //获取高电平保持时间
if(PulseWidth>=120) break; //超过4.5ms垃圾数据直接跳出
if(80<=PulseWidth<120) StartFlag=1; //收到同步数据
else if(36<=PulseWidth<80) //1800us-4000us 区间默认为2250us 表示连续按键,按键值加1
{
SameDataFlag=1;
DataCount++;
break;
}
else if(20<=PulseWidth<36) RxBit=1; //1000us-1800us 区间默认为1680us 接收数据为1
else if(4<=PulseWidth<20) RxBit=0; //200us-1000us 区间默认为560us 接收数据为0
if(StartFlag)
{
ReceiveData<<=1;
ReceiveData+=RxBit;
DataCount=0;
}
}
}
// EXTI_ClearITPendingBit(EXTI_Line8);
EXTI_ClearFlag(EXTI_Line8);
}
|