OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4907|回复: 2

stm8s红外解码

[复制链接]

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-3-22
在线时间
8 小时
发表于 2016-3-22 20:24:15 | 显示全部楼层 |阅读模式
1金钱
我用外部中断+计数器做的,在线调试时,第一次按键可以得到正确数据,第二次按键时,得不到数据,原因是第二次按键计数器的计数有问题,一般都会偏小好多。求大神指点
红外初始化:
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;    //数据收完后接收结束标志置位
    }

}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
332
金钱
332
注册时间
2015-12-3
在线时间
54 小时
发表于 2016-4-9 18:05:00 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-4-9 20:35:29 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 00:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表