【stm32f0实验】红外接收+串口中断收发

[复制链接]
8065|12
 楼主| 小李瓦大喜 发表于 2012-8-24 13:54 | 显示全部楼层 |阅读模式
首先谢谢ST送的板子。最近抽空写了一个stm32f0的程序,IAR的。主要的功能是利用定时器2的输入捕获功能,接收普通红外按键发出的数据,然后实验了一下F0的两个串口,中断方式下的接收和发送。
    捕获用的管管脚是PA1,定时器2的2通道。
    希望有的坛友能用的到。 stm32f0红外接收.rar (5.53 MB, 下载次数: 774)
 楼主| 小李瓦大喜 发表于 2012-8-24 13:56 | 显示全部楼层
定时器2的2通道配置
void REMOTE_config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_ICInitTypeDef  TIM_ICInitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//PA1
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_2);
  
  TIM_TimeBaseStructure.TIM_Period = 65535;
  TIM_TimeBaseStructure.TIM_Prescaler = 19;//24ms
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  
  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 = 0x00;
  TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
  
  TIM_ClearITPendingBit(TIM2,  TIM_IT_CC2);
  TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
  TIM_Cmd(TIM2, ENABLE);
}
 楼主| 小李瓦大喜 发表于 2012-8-24 13:58 | 显示全部楼层
这是定时器2的中断处理
extern u8 remotekey;
u16 ccd [80] ;
volatile u16 data0;           //前16个脉冲存放地址
volatile u16 data1;           //后16个脉冲存放地址
void TIM2_IRQHandler(void)
{
  static int  id  = 0 ;
  static u16  cur = 0 ;
  static u16  last= 0 ;
  u8 remotekey_1;
  u16 step ;
  int fh;
  u8 i;
  if(TIM_GetITStatus( TIM2,  TIM_IT_CC2 ))
    {
     TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);
     cur = TIM_GetCapture2(TIM2);
        if(cur > last )
          {step = cur - last ;}
          else
           {step = 65535 - last + cur ;}
           fh = step *10 / (2400) ;
        if((fh>130)&&(fh<140))
          {id =0;}
          else if((fh>9)&&(fh<13))
                {ccd[id++]=0;}
                else if( (fh > 20 ) && (fh <24 ))
                       {ccd[id++]=1;}
        if(id==32)
           {
             id=0;
             remotekey=0;
             for(i= 0 ;i< 8 ; i++ )
                {remotekey |= ccd[16+i]<<i ; }
             remotekey_1 = 0 ;
             for(i= 0 ;i< 8 ; i++ )
                {remotekey_1 |= ccd[24+i]<<i ;}
             if((remotekey+remotekey_1)!=255)
             {remotekey=0;remotekey_1=0;}
           }      
     }
  last = cur ;
}
jany.wei 发表于 2012-8-24 17:44 | 显示全部楼层
sinadz 发表于 2012-8-24 18:06 | 显示全部楼层
看来ST的板子没送错人:lol,鼓励共享
火箭球迷 发表于 2012-8-24 18:16 | 显示全部楼层
ST活动的目的达到了
xsgy123 发表于 2012-8-24 18:20 | 显示全部楼层
对于新手应该很有帮助
xpzheng888 发表于 2012-11-18 16:40 | 显示全部楼层
用的是那两个接口,请教?
zxm19820916 发表于 2016-3-28 16:26 | 显示全部楼层
只使用下降沿中断或者上升沿中断,2次中断的计数值应该是波形的一个周期吧,怎么判断高电平/低电平的宽度?
二蚊子 发表于 2016-7-2 22:21 | 显示全部楼层
xu2003 发表于 2016-12-23 16:30 | 显示全部楼层
toddchen817 发表于 2018-12-18 00:14 | 显示全部楼层
我查手册STM32F0的PA1没有定时器2的2通道。
toddchen817 发表于 2018-12-18 00:19 | 显示全部楼层
F030系列的没有,F051/072的有
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

20

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部