打印

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

[复制链接]
7237|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小李瓦大喜|  楼主 | 2012-8-24 13:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先谢谢ST送的板子。最近抽空写了一个stm32f0的程序,IAR的。主要的功能是利用定时器2的输入捕获功能,接收普通红外按键发出的数据,然后实验了一下F0的两个串口,中断方式下的接收和发送。
    捕获用的管管脚是PA1,定时器2的2通道。
    希望有的坛友能用的到。 stm32f0红外接收.rar (5.53 MB)
沙发
小李瓦大喜|  楼主 | 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 | 只看该作者
:P

使用特权

评论回复
5
sinadz| | 2012-8-24 18:06 | 只看该作者
看来ST的板子没送错人:lol,鼓励共享

使用特权

评论回复
6
火箭球迷| | 2012-8-24 18:16 | 只看该作者
ST活动的目的达到了

使用特权

评论回复
7
xsgy123| | 2012-8-24 18:20 | 只看该作者
对于新手应该很有帮助

使用特权

评论回复
8
xpzheng888| | 2012-11-18 16:40 | 只看该作者
用的是那两个接口,请教?

使用特权

评论回复
9
zxm19820916| | 2016-3-28 16:26 | 只看该作者
只使用下降沿中断或者上升沿中断,2次中断的计数值应该是波形的一个周期吧,怎么判断高电平/低电平的宽度?

使用特权

评论回复
10
二蚊子| | 2016-7-2 22:21 | 只看该作者

使用特权

评论回复
11
xu2003| | 2016-12-23 16:30 | 只看该作者

使用特权

评论回复
12
toddchen817| | 2018-12-18 00:14 | 只看该作者
我查手册STM32F0的PA1没有定时器2的2通道。

使用特权

评论回复
13
toddchen817| | 2018-12-18 00:19 | 只看该作者
F030系列的没有,F051/072的有

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

20

帖子

2

粉丝