基于STM32的红外遥控器解码逻辑和代码分析
还有一种方式使用stm32的 tim_getcounter()计算,这种方法最好,中断里边加延时不建议使用,只是测试一下而已。
/*************************************************************
名称: Timer4_CFG()
功能: 初始化timer4
输出参数:
作者:v
******************************************************************/
void Timer4_CFG()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO , ENABLE);
GPIO_InitStructure.GPIO_Pin = IR_LED_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(IR_LED_PORT, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 3599; //72MHz/(3599+1)=10 000 HZ 50uS
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //
TIM_TimeBaseStructure.TIM_Period = 200; // ARR基准值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM4,DISABLE);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
TIM_ITConfig(TIM4,TIM_IT_Trigger,ENABLE);
TIM_Cmd(TIM4, DISABLE);
}
/*************************************************************
名称: Remote_Scan()
功能:
输出参数:
作者:v
******************************************************************/
static u8 Remote_Scan()
{
u16 TIMt=0;
u16 waitquit;//超时退出
u8 i,ia;
if(RDATA()!=0)//先判断是否为0 排除干扰
return 0;
TIM_SetCounter(TIM4,0);//TIM4->CNT=0;
TIM_Cmd(TIM4, ENABLE);
waitquit=60000;
do{
waitquit--;
}
while((!RDATA())&&(waitquit));//检查高电平的时间4ms
TIM_Cmd(TIM4, DISABLE);
TIMt=TIM_GetCounter(TIM4);
if((TIMt<70)||(TIMt>120))
return 0;
TIM_SetCounter(TIM4,0);
TIM_Cmd(TIM4, ENABLE);
waitquit=60000;
do{
waitquit--;
}
while((RDATA())&&( waitquit));//接收高电平
TIMt=TIM_GetCounter(TIM4);
TIM_Cmd(TIM4, DISABLE);
if((TIMt>120)||(TIMt<60))//同样 8MS
return 0;
////////////引导码接收完毕///////开始接收客户码//////////////////////////////
for(i=0;i<3;i++)//接收3个字节 24位码
{
for(ia=0;ia<8;ia++)
{
TIM_Cmd(TIM4, ENABLE);
while(!RDATA());//等待高
TIM_SetCounter(TIM4,0);
waitquit=60000;//可根据实测调整
do{
waitquit--;
}
while((RDATA())&&( waitquit));//接收高电平
TIM_Cmd(TIM4, DISABLE);
TIMt=TIM_GetCounter(TIM4);
////////////////////////////高电平结束/////////////////////////
user_code[i]>>=1;
if((TIMt>45))
return 0;
if((TIMt>35)&&(TIMt<45))//经过实测 在1400us以上为1 小于一般为 9 为0
user_code[i]|=0x80;
}
}
REM_FLG=1;
return 1;
}
这两种方法解出来的码都是一样的,用多个也测试过,没有问题很稳定,。
最新评论