打印
[STM32F0]

在STM32F051的EXTI的ISR中怎么分辨是上升沿还是下降沿触发的中断

[复制链接]
13270|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lr2131|  楼主 | 2014-6-9 17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
extern void KEYS_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        EXTI_InitTypeDef EXTI_InitStruct;
        NVIC_InitTypeDef NVIC_InitStruct;
        /* config the extiline(PB0) clock and AFIO clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
          
        /* Configyre P[A|B|C|D|E]0  NIVC  */
        NVIC_InitStruct.NVIC_IRQChannel = EXTI4_15_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPriority = 0x00;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStruct);
       
        /* EXTI line gpio config(PF7) */       
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_2;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOF, &GPIO_InitStruct);

        /* EXTI line(PF7) mode config */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource7);
        EXTI_InitStruct.EXTI_Line = EXTI_Line7;
        EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//EXTI_Trigger_Falling;// | EXTI_Trigger_Rising;
        EXTI_InitStruct.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStruct);
}

我设置了PF7为外部中断,触发方式为上升沿和下降沿。在ISR里面,我需要对上升沿和下降沿有不同的处理,所以需要分辨当前触发了中断时是上升沿还是下降沿,不知道代码怎么写,最好是用到固件库的方式,不要直接操作寄存器,这样移植性好点。现在我正在找合适的范例,不知道找不找得到。
沙发
diweo| | 2014-6-9 19:20 | 只看该作者
EXTI_Trigger_Rising_Falling是1种,应该还有EXTI_Trigger_Rising和EXTI_Trigger_Falling

使用特权

评论回复
板凳
aozima| | 2014-6-9 19:42 | 只看该作者
在ISR中读IO电平

使用特权

评论回复
地板
airwill| | 2014-6-9 19:52 | 只看该作者
嗯楼上的办法不错, 如果还担心误判, 可以只设置 EXTI_Trigger_Rising, EXTI_Trigger_Falling 的一种, 在中断服务中修改这个设置.

使用特权

评论回复
5
icecut| | 2014-6-9 23:16 | 只看该作者
2,3楼都不错

使用特权

评论回复
6
lr2131|  楼主 | 2014-6-10 09:51 | 只看该作者
aozima 发表于 2014-6-9 19:42
在ISR中读IO电平

嗯,目前我也只能用读IO电平的方法了,本来是想有个固件库函数可以返回中断时是上升沿还是下降沿,发现没有这样的库函数,再想去找中断标志寄存器,以为有某个标志寄存器可以记录当前是上升沿中断还是下降沿中断,也没找到。

使用特权

评论回复
7
lr2131|  楼主 | 2014-6-10 09:54 | 只看该作者
airwill 发表于 2014-6-9 19:52
嗯楼上的办法不错, 如果还担心误判, 可以只设置 EXTI_Trigger_Rising, EXTI_Trigger_Falling 的一种, 在中 ...

你说的这个方法感觉也应该是可以的。

使用特权

评论回复
8
gxliu08| | 2014-6-10 10:27 | 只看该作者
本帖最后由 gxliu08 于 2014-6-10 10:30 编辑

是不是可以进入中断后用GPIO_ReadInputDataBit读一下信号引脚电平,SET 或 RESET?

使用特权

评论回复
9
mmuuss586| | 2014-6-10 10:31 | 只看该作者
设置成EXTI_Trigger_Rising_Falling触发,中断程序再判断是IO的当前电平,就知道是上升沿还是下降沿了;

使用特权

评论回复
10
lr2131|  楼主 | 2014-6-11 09:24 | 只看该作者
问题已解决了,试过了可以。
在ISR中读取IO电平状态:
#if                (MODE_POLLING == KEY_MODE)
#elif                (MODE_INTERRUPTE == KEY_MODE)
extern void EXTI4_15_IRQHandler(void)
{       
  if(EXTI_GetITStatus(EXTI_Line6) != RESET){       
                if(0 == GPIO_ReadInputDataBit(KEYS_PORT,KEY1_PIN)){// ϽµÑØ
                                LED1_ON();
                }else{//ÉÏÉýÑØ
                                LED1_OFF();
                }

    EXTI_ClearITPendingBit(EXTI_Line6);
  }else if(EXTI_GetITStatus(EXTI_Line7) != RESET){
                if(0 == GPIO_ReadInputDataBit(KEYS_PORT,KEY2_PIN)){// ϽµÑØ
                                LED2_ON();
                }else{//ÉÏÉýÑØ
                                LED2_OFF();
                }
               
    EXTI_ClearITPendingBit(EXTI_Line7);       
        }
}
#endif

使用特权

评论回复
11
寂寞小帅| | 2014-11-21 16:08 | 只看该作者
真好需需要

使用特权

评论回复
12
zxm19820916| | 2016-3-15 11:36 | 只看该作者
正需要,思想重要。

使用特权

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

本版积分规则

11

主题

203

帖子

0

粉丝