OpenEdv-开源电子网

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

外部中断问题

[复制链接]

11

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2013-4-1
在线时间
27 小时
发表于 2016-2-17 09:21:12 | 显示全部楼层 |阅读模式
1金钱
RT 此处要利用PD7做为外部中断入口,判断其电平。但是运行时发现PD15(配置为I/O开关输出)也可以进入EXIT9_5中断,P并且D15和PD7互不影响对方电平。不知该如何解决。
void EXTIX_Init(void)
{

                EXTI_InitTypeDef EXTI_InitStructure;
                NVIC_InitTypeDef NVIC_InitStructure;

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟

    //GPIOD.7 中断线以及中断初始化配置   下降沿触发
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource7);

          EXTI_InitStructure.EXTI_Line=EXTI_Line7;        //PD7
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          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;                        //中断线5-9,共用中断函数
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级2,
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                                        //子优先级1
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

}
void EXTI9_5_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line7)!=RESET)
   {
        EXTI_InitTypeDef EXTI_InitStructure;
        delay_ms(10);//消抖
        open_close++;
        if(open_close==1)
        {
                        USART1_Write_ButtonStatus(203,0xFF,0x00);delay_ms(5);
                        printf("开门\r\n");
                        EXTI_InitStructure.EXTI_Line=EXTI_Line7;        //PD7
                        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
                        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
                        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                        EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器       
        }
        if(open_close==2)
        {
                        USART1_Write_ButtonStatus(204,0xFF,0x00);delay_ms(5);
                        printf("关门\r\n");
                        EXTI_InitStructure.EXTI_Line=EXTI_Line7;        //PD7
                        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
                        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
                        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                        EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器       
                        open_close=0;
        }
        EXTI_ClearITPendingBit(EXTI_Line7); //清除LINE0上的中断标志位  
  }
}

最佳答案

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

问题已解决,输出引脚接的继电器,启动关闭继电器的时候对PD7电平发生了干扰,在中断函数中增加了判断电平的语句后解决问题了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2013-4-1
在线时间
27 小时
 楼主| 发表于 2016-2-17 09:21:13 | 显示全部楼层
问题已解决,输出引脚接的继电器,启动关闭继电器的时候对PD7电平发生了干扰,在中断函数中增加了判断电平的语句后解决问题了。
回复

使用道具 举报

6

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2016-1-19
在线时间
38 小时
发表于 2016-2-17 15:03:25 | 显示全部楼层
看下楼主的原理图。
回复

使用道具 举报

11

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2013-4-1
在线时间
27 小时
 楼主| 发表于 2016-2-22 15:35:49 | 显示全部楼层
大雄先生 发表于 2016-2-17 15:03
看下楼主的原理图。

两个IO口是独立的,没有关联,问题还是没有解决
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-4-16
在线时间
11 小时
发表于 2016-4-29 10:59:16 | 显示全部楼层
我也遇到了类似的问题
怎么办啊?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 16:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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