OpenEdv-开源电子网

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

请问stm32f205 用的是外部中断,一直解码不成功 难产中啊,有哪位大神给我看看源码有什么问题

[复制链接]

14

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-9-10
在线时间
0 小时
发表于 2014-9-10 16:39:08 | 显示全部楼层 |阅读模式
5金钱
   IO配置   
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    外部中断配置
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,GPIO_PinSource15);
    EXTI_ClearITPendingBit(EXTI_Line15);
    EXTI_InitStructure.EXTI_Line = EXTI_Line15;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//红外
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    //处理红外键盘
//返回相应的键值
u8 Remote_Process(void)
{
    u8 t1,t2;
    t1= Remote_Odr>>24; //红外解码
    t2=(Remote_Odr>>16)&0xff;
    Remote_Rdy=0 ;//清除标记
    if(t1==(u8)~t2&&t1==REMOTE_ID)//检验遥控识别码(ID)
    {printf("###################解码成功#####################\r\n");

            t1=Remote_Odr>>8;
            t2=Remote_Odr;
            if(t1==(u8)~ t2)
            {
                        if(t1 ==0x00)
                            t1 =0x55;
                    printf("###################解码成功#####################\r\n");
                return t1; //处理键值
            }
    }
    return 0;
}

中断处理函数
void EXTI15_10_IRQHandler(void)
{
      u8 res=0;
    u8 OK=0;
    u8 RODATA=0;
    while(1)
    {
        if(RDATA)//有高脉冲出现
        {
            res=Pulse_Width_Check();//获得此次高脉冲宽度
            if(res!=250)
           printf("res=%d\r\n",res);
            if(res==250)break;//非有用信号
            if(res>=200&&res<250)OK=1; //获得前导位(4.5ms)
            else  if(res>=100&&res<200)  //按键次数加一(2ms)
            {
                Remote_Rdy=1;//接受到数据
                Remote_Cnt++;//按键次数增加
                break;
            }
            else if(res>=50&&res<85)
            {
                    RODATA=1;//1.5ms
            }
            else if(res>=10&&res<50)
            {
                    RODATA=0;//500us
            }
            if(OK)
            {
                Remote_Odr<<=1;
                Remote_Odr+=RODATA;
                Remote_Cnt=0; //按键次数清零
            }
           // EXTI->R=1<< 15;      // 清除中断标志位
            EXTI_ClearITPendingBit(EXTI_Line15);
        }
    }
    EXTI_ClearITPendingBit(EXTI_Line15);     // 清除中断标志位
}
#define RDATA                              GPIO_ReadInputData(GPIOB)&GPIO_Pin_15

//检测脉冲宽度
//最长脉宽为 5ms
//返回值:x,代表脉宽为 x*20 us(x=1~250);
u8 Pulse_Width_Check(void)
{
    u8 t=0,i=0;
    while(RDATA)
    {
        t++;
    delay_us(20);
    //IRQ_delay_us(5);
        if(t==250)return t; //超时溢出
    }
    return t;
}
void KEY_Process(void)
{
    u8 keydate;
    u8 i;
    //KEY_Scan();
    if(Remote_Rdy)
    {
        keydate = Remote_Process();
        printf("keydate=%x\r\n",keydate); 这里解码一直未成功,一直为0
            for(i=0;i<20;i++)
            {
                if(keydate == IrDAREC_KEY)
                {    printf("###################解码成功#####################\r\n");
                        if(Remote_Cnt ==1)
                        {
                            
                            Key_status = i;
                            KEY_TSK_SET();
                        }
                        break;
                }
            }
    }
}


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

使用道具 举报

14

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-9-10
在线时间
0 小时
 楼主| 发表于 2014-9-10 17:19:06 | 显示全部楼层
哪位大神帮帮忙啊,自己顶顶
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-10 23:21:56 | 显示全部楼层
帮顶....
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-11 09:33:05 | 显示全部楼层
回复【2楼】yang627468471:
---------------------------------
不管怎样,感觉程序有点了乱,我自己写过红外解码,也是用外中断,没那么复杂。多检查下代码,应该问题不大。
回复

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2014-9-7
在线时间
11 小时
发表于 2014-9-11 19:52:33 | 显示全部楼层
回复【4楼】TinyBoy:
---------------------------------
用定时器输入捕获测脉宽
hellow world!
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-12 08:08:29 | 显示全部楼层
回复【5楼】SDDX:
---------------------------------
 这个用中断很有必要,你用的中断类型应该可以2次中断就得到一个码的位,计数交给定时器。
回复

使用道具 举报

14

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-9-10
在线时间
0 小时
 楼主| 发表于 2014-10-21 09:01:47 | 显示全部楼层
之后用定时器检测脉宽已经解决了,谢谢各位啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 01:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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