我用外部中断+计数器做的,在线调试时,第一次按键可以得到正确数据,第二次按键时,得不到数据,原因是第二次按键计数器的计数有问题,一般都会偏小好多。求大神指点
红外初始化:
void IR_Init(void)
{
IR_Gpio_Init();
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA, EXTI_SENSITIVITY_FALL_ONLY);//下降沿触发 o_Init();
TIM2_Config();
}
void IR_Gpio_Init(void)
{
GPIOA->DDR&=0xF7;
GPIOA->CR1|=0x08;
GPIOA->CR2|=0x08;
}
定时器初始化
void TIM2_Config(void)
{
TIM2->PSCR=0x04;
TIM2->ARRH=0x3A;//14999+1
TIM2->ARRL=0x97;
TIM2->EGR=0x01;
TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
TIM2->CR1=0X01;
}
外部中断处理
INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3)
{
uint16_t Ir_time=0;
TIM2_Cmd(DISABLE);//停止计数
Ir_time=TIM2_GetCounter();
TIM2_SetCounter(0x00);
TIM2_Cmd(ENABLE);
if((Ir_time)>12000)////11000
{
Ir_start=1;
Ir_num=0;
}
//if(Ir_time<1050)
// return;
if((Ir_start==1)&&(Ir_time<2600)&&(Ir_time>900)) // 2300//2600 1000 //如果已经收到启动代码,且数据在有效范围内
{
if(Ir_num<=7)
{
Ir_data<<=1; //因为先发地址高位,所以要向右移动
if(Ir_time>1700) // 1900 // 1700 //如果数据间隔大于数据0和数据1中间数值,则认为收到数据1
Ir_data|=1;
//else
//Ir_data=0;
if(Ir_num==7)
{
code.Sys_Code=Ir_data;
Ir_data=0;
}
Ir_num++; //收到一位后IR_Num加1
}
else //if(Ir_num=21)
{
Ir_data<<=1;
if(Ir_time>2000)
Ir_data|=1;
if(Ir_num%8==7)
{
code.Rec_Code[(Ir_num/8)-1]=Ir_data;
Ir_data=0;
}
Ir_num++;
}
//Ir_buffer[Ir_num-1]=Ir_data;
}
if((Ir_num>119) )//&& (Ir_time>450)&&(Ir_time<650))//尾码检测
{
Ir_start=0; //启动标志清零 //
TIM2_Cmd(DISABLE); //收到全部数据后关闭定时器,可节能,也避免出错
Sign_Data_Ok=1; //数据收完后接收结束标志置位
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>