您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> gpio中断问大家
本帖共有2188个阅读者
发表帖子 发表投票 回复主题
gpio中断问大家
tzg74500(论坛游民)
tzg74500
头衔:社区公民
帮派:无帮无派
帖数:87
金钱:806
积分:110
注册时间:2011/7/31
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
gpio中断问大家
gpio的h口,ph0,设置为双边沿中断,如何知道这次中断是由于上升沿还是下降沿产生?


这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2011/9/22 19:02:15
ppsca(论坛新手)
ppsca
头衔:社区公民
帮派:无帮无派
帖数:43
金钱:305
积分:41
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

进入中断后,立刻读取IO电平,如果为高电平,则为上升沿触发,反之亦然。


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2011/9/22 23:06:01
tzg74500(论坛游民)
tzg74500
头衔:社区公民
帮派:无帮无派
帖数:87
金钱:806
积分:110
注册时间:2011/7/31
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
搞定了,但 不能 直接读,只能重新初始化为GPIO后再读,然后读完再设子为GPIO中断

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2011/9/24 20:51:18
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

貌似没有那么麻烦,给你一个我之前写的按键中断你看看。

BF518上的。

#include <cdefBF518.h>
#include <sys\exception.h>
#include <ccblkfn.h>
#include <stdio.h>

#define pDEVICE_OE (volatile unsigned short *)0x20320000
#define pLED_DAT (volatile unsigned short *)0x20340000

#define IOSCLK  PH4
#define IOMISO  PH5
#define IOCS  PH6

EX_INTERRUPT_HANDLER(Pushbutton_ISR);

void Set_PLL(unsigned int pmsel,unsigned int pssel)
{
unsigned int new_PLL_CTL;
*pPLL_DIV = pssel;
asm("ssync;");
new_PLL_CTL = (pmsel & 0x3f) << 9;  
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
  *pPLL_CTL = new_PLL_CTL;
  asm("ssync;");
  asm("idle;");
}
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}

void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}

delay(int count)
{
int i;
for(i=0;i<count;i++);
}



init_port()
{
int iar5 = *pSIC_IAR5;
int imask1 = *pSIC_IMASK0;

*pPORTG_FER   &= (~(PG6 | PG7 | PG8| PG9)); //PH4  时钟  PH5  数据  PH6 片选
*pPORTGIO_DIR  &= (~(PG6 | PG7 | PG8| PG9));
*pPORTGIO_INEN  |= PG6 | PG7 | PG8| PG9;



*pPORTGIO_EDGE |= PG6 | PG7 | PG8| PG9;;  /* edge sensitive */
*pPORTGIO_POLAR &= (~(PG6 | PG7 | PG8| PG9)); /* rising edge */
    *pPORTGIO_MASKA_SET |= PG6 | PG7 | PG8| PG9;/* enable pbs */

    /* port H interrupt A is bits 20-23 of IAR3, setup for IVG11 */
    iar5 |= 0x00000004;
iar5 &= 0xfffffff4;
    *pSIC_IAR5 = iar5;

    /* register ISR and enable port H interrupt A */
    register_handler(ik_ivg11, Pushbutton_ISR);
    imask1 = *pSIC_IMASK1;
    imask1 |= 0x00000100;
    *pSIC_IMASK1 = imask1;


}


EX_INTERRUPT_HANDLER(Pushbutton_ISR)
{
int pb_status = *pPORTGIO;

/* if PB1 pushed */
if ( 0x0040 == (pb_status & PG6) )
{
  *pPORTGIO_CLEAR = PG6;
  printf("PB is PG6!\n");
}
  if ( 0x0080 == (pb_status & PG7) )
{
  *pPORTGIO_CLEAR = PG7;
  printf("PB is PG7!\n");
}

  if ( 0x0100 == (pb_status & PG8) )
{
  *pPORTGIO_CLEAR = PG8;
  printf("PB is PG8!\n");
}

  if ( 0x0200 == (pb_status & PG9) )
{
  *pPORTGIO_CLEAR = PG9;
  printf("PB is PG9!\n");
}

}




/****************************************************************************
* 名称 : main
* 功能 : LED测试主函数
* 入口参数 :无
* 出口参数 :无
****************************************************************************/

void main(void)
{
unsigned short data;

  Set_PLL(16,4);
    Init_EBIU();
    Init_SDRAM();
    init_port();
    while(1);  

}



这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2011/9/25 18:44:13
tzg74500(论坛游民)
tzg74500
头衔:社区公民
帮派:无帮无派
帖数:87
金钱:806
积分:110
注册时间:2011/7/31
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你这个是单边沿中断 ,肯定没问题,你试试双边沿中断,这种方式是不行的。。

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2011/10/1 8:25:49
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

好,有空的话我试试


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2011/10/9 11:32:46
liuhai2200(论坛新手)
liuhai2200
头衔:社区公民
帮派:无帮无派
帖数:69
金钱:636
积分:84
注册时间:2012/8/12
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
我同样也是出现1楼所说的情况,不能直接读。我设置是下降沿触发,进中断后管脚的状态一直是高电平,正常来说应该是低电平(我尝试过软件延时消抖,也是不行)。不知道是哪的问题。

完成梦想
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/10 23:05:53
liuhai2200(论坛新手)
liuhai2200
头衔:社区公民
帮派:无帮无派
帖数:69
金钱:636
积分:84
注册时间:2012/8/12
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
是我理解错了,下降沿触发后,管脚的状态就是高电平,然后再进行clear。但我还存在一个问题:一个按键动作会出现2次下降沿(寄存器设是单边沿),从示波器上看按键波形也挺好的。

完成梦想
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/11 10:09:31
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
8信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
当管脚设置为中断状态后,读取的值不再是电平值,而是中断触发状态值,所以不管你是上升沿或是下降沿,触发后在中断寄存器中读取的都是1,这个值只代表中断触发,不代表电平状态。
做个短延时吧,有时候按键上的抖动很难捕捉。或是硬件设计时,加个100nF的电容去毛刺。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/4/11 11:05:09
liuhai2200(论坛新手)
liuhai2200
头衔:社区公民
帮派:无帮无派
帖数:69
金钱:636
积分:84
注册时间:2012/8/12
9信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢andy,我硬件上已经加了0.1uF的硬件去抖,而且在中断中也加入了短延时,貌似如果延时时间太短还是会进2次中断。延时函数的时间是根据cycles,再根据时钟主频算来的,这没问题吧。

完成梦想
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/11 17:42:54
13
1
1/2
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159192 Call, 1 Queries, Processed in 0.030991 second(s),