OpenEdv-开源电子网

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

stm32f205 用定时器12,通道2做红外遥控,遥控的每个按键捕获脉冲宽度都一样,大神门,这是怎么回事啊

[复制链接]

14

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-9-10
在线时间
0 小时
发表于 2014-9-17 10:40:46 | 显示全部楼层 |阅读模式
5金钱
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM12, ENABLE);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_TIM12);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
     TIM_TimeBaseStructure.TIM_Period = 65535;
    TIM_TimeBaseStructure.TIM_Prescaler =29;            
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM 向上计数模式
      TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM12, &TIM_TimeBaseStructure);//根据指定的参数初始化 TIMx
    
    
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;//上升沿捕获
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//管脚与寄存器对应关系
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
    TIM_ICInitStructure.TIM_ICFilter = 0x0;        //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
    TIM_ICInit(TIM12, &TIM_ICInitStructure);       //初始化定时器输入捕获通道
    TIM_Cmd(TIM12,ENABLE );     //使能定时器1
       TIM_ITConfig( TIM12,TIM_IT_CC2,ENABLE);
       
    NVIC_InitStructure.NVIC_IRQChannel = TIM8_BRK_TIM12_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;  //先占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级1级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器   



void TIM8_BRK_TIM12_IRQHandler(void)
{
    static vu8 id = 0 ;  
  static vu16  cur_value = 0 ;  
  static vu16  last_value  = 0 ;  

  u16 capture_value ;
  //int capture_time;
  u32 capture_time;
  if(TIM_GetITStatus(TIM12,TIM_IT_CC2))
  {
    TIM_ClearITPendingBit(TIM12, TIM_IT_CC2); //清中断标志
     cur_value =TIM_GetCapture2(TIM12) ; //获取捕获值
   if(cur_value >= last_value )
    {
      capture_value = cur_value - last_value ;
    }
    else
    {
      capture_value = 65536 - last_value + cur_value ;
    }
    last_value = cur_value ;
    //capture_time 为两次捕获的计数值的差,为了避免浮点数运算,此处,把浮点数放大十倍,转换成整数计算。
    capture_time = capture_value *10 / (2400) ;
    printf("capture_time=%x\r\n",capture_time);
    // 引导码+单击码,9+4.5=13.5ms    
    if( (capture_time > 130) && (capture_time <140) )
    {
      id = 0 ;
      //Addr_Comd_pBuffer = 0;
      IR_STATUS_RSE(Clr_IR_STATUS);
      IR_STATUS_SET(IRDaRec_START);
    }
    //连续码:9+2.5=11.5ms 周期108ms
    else if( (capture_time > 110 ) && (capture_time <120 ))
    {
        id=0;
        RepCode_CNT_INC();//按键次数加1
        IR_STATUS_SET(IRDaRec_OK);        
    }
    // 1.125ms
    else if( (capture_time > 9 ) && (capture_time <13 )&&IS_STATUS_IR(IRDaRec_START))
    {
      Addr_Comd_pBuffer<<=1;
      Addr_Comd_pBuffer+=0;
      id++;
    }
    // 2.245ms
    else if( (capture_time > 20 ) && (capture_time <24 )&&IS_STATUS_IR(IRDaRec_START))
    {
      Addr_Comd_pBuffer<<=1;
      Addr_Comd_pBuffer+=1;
      id++;
    }          
    if(id>=59)
    {
      id = 0;
    }
    if((id >=32)&&IS_STATUS_IR(IRDaRec_START))
    {
      /*UART1_SendByte(Addr_Comd_pBuffer);
      UART1_SendByte(Addr_Comd_pBuffer>>8);
      UART1_SendByte(Addr_Comd_pBuffer>>16);
      UART1_SendByte(Addr_Comd_pBuffer>>24);*/
      id = 0;
      IR_STATUS_SET(IRDaRec_OK);
      IR_STATUS_RSE(IRDaRec_START);    
      //test_ir();  
    }
    tsk_IR();
  }  

}
以下是捕获脉冲结果,每个红外按键都一样

最佳答案

查看完整内容[请看2#楼]

已经解决了,最后分析了时钟树TIM_TimeBaseStructure.TIM_Prescaler =24;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-9-10
在线时间
0 小时
 楼主| 发表于 2014-9-17 10:40:47 | 显示全部楼层
已经解决了,最后分析了时钟树TIM_TimeBaseStructure.TIM_Prescaler =24;
回复

使用道具 举报

14

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-9-10
在线时间
0 小时
 楼主| 发表于 2014-9-17 10:52:56 | 显示全部楼层
原子哥,帮帮忙
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-17 23:37:24 | 显示全部楼层
我也没辙,慢慢调试下吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 01:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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