OpenEdv-开源电子网

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

关于红外接受模块配置问题

[复制链接]

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-7-11
在线时间
0 小时
发表于 2012-11-13 11:25:04 | 显示全部楼层 |阅读模式
原来红外用的是PA1,我现在改成PA8端口。哪里还需要修改,红外没反应


//初始化红外接收引脚的设置
//开启中断,并映射 
void Remote_Init(void)
{  
GPIO_InitTypeDef GPIO_InitStructure; //GPIO
NVIC_InitTypeDef NVIC_InitStructure; //中断
EXTI_InitTypeDef EXTI_InitStructure; //外部中断线
   
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE );  
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;  //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);  
 
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);   //选择PA1所在的GPIO管脚用作外部中断线路EXIT1
 
EXTI_InitStructure.EXTI_Line = EXTI_Line1; //外部线路EXIT1
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设外外部中断模式:EXTI线路为中断请求  EXTI_Mode_Event ;//设置 EXTI线路为事件请求 
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //外部中断触发沿选择:设置输入线路下降沿为中断请求
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能外部中断新状态
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
 
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能按键所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级1级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}   
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-11-13 12:02:50 | 显示全部楼层
回复【楼主位】cikcaj:
---------------------------------
自己顶一个
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-13 16:55:44 | 显示全部楼层
回复【2楼】cikcaj:
---------------------------------
中断线都没改啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-11-13 17:12:32 | 显示全部楼层
回复【楼主位】cikcaj:
---------------------------------
红外实验需要用到exit.c这个驱动吗
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-11-13 18:02:41 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
回复【3楼】正点原子:
---------------------------------
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能按键所在的外部中断通道
最后一块第一句,把 EXTI1_IRQn改成 EXTI8_IRQn
编译时他说 EXTI8_IRQn没定义,我去哪里定义啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-13 18:24:08 | 显示全部楼层
回复【5楼】cikcaj:
---------------------------------
EXTI8_IRQn 
是EXTI9_5IRQn吧。
在EXTI1_IRQn上,右键->goto definition 看看,附近应该就有。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-11-13 18:49:35 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
这个在 stm32f10x.h中没定义,这里只有
 RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */
  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */
  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */
  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */
  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */
  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */
  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */
  DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */
  DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */
  DMA1_Channel3_IR
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-11-13 18:59:37 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
哦,找到EXTI9_5_IRQn这个了,用到中断线8就用这个对吧
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-11-13 19:20:40 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子,编译通过后,红外还是没反应,是红外接收头换了的原因吗?
void Remote_Init(void)
{  
GPIO_InitTypeDef GPIO_InitStructure; //GPIO
NVIC_InitTypeDef NVIC_InitStructure; //中断
EXTI_InitTypeDef EXTI_InitStructure; //外部中断线
   
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE );   
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;  //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);  
 
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);   //选择PA1所在的GPIO管脚用作外部中断线路EXIT1
 
EXTI_InitStructure.EXTI_Line = EXTI_Line8; //外部线路EXIT1
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设外外部中断模式:EXTI线路为中断请求  EXTI_Mode_Event ;//设置 EXTI线路为事件请求 
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //外部中断触发沿选择:设置输入线路下降沿为中断请求
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能外部中断新状态
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
 
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按键所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级1级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}   

void EXTI8_IRQHandler(void)
{       
u8 res=0;
    u8 OK=0; 
    u8 RODATA=0;     
while(1)
    {        
        if(RDATA)//有高脉冲出现
        {
            res=Pulse_Width_Check();//获得此次高脉冲宽度       
            if(res==250)break;//非有用信号
            if(res>=200&&res<250)OK=1; //获得前导位(4.5ms)
            else if(res>=85&&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_ClearITPendingBit(EXTI_Line8);  //清除EXTI1线路挂起位         
}  
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-7-11
在线时间
0 小时
 楼主| 发表于 2012-11-13 20:33:54 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
完美解决,原来是下面那个中断服务函数的名字没改
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-13 20:38:52 | 显示全部楼层
IO口要接对哦。
中断服务函数,你的也不对。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 22:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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