您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 求助一个GPIO_interrupt 的程序
本帖共有1182个阅读者
发表帖子 发表投票 回复主题
求助一个GPIO_interrupt 的程序
zhoumaicheng(论坛新手)
zhoumaicheng
头衔:社区公民
帮派:无帮无派
帖数:29
金钱:464
积分:54
注册时间:2012/7/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
求助一个GPIO_interrupt 的程序

我今天仔细研究了一下这个程序,首先有 一个 初始化IO口的函数


void init_PF0_IN(void)
{
*pFIO_DIR &= ~PF0;
*pFIO_INEN |= PF0;
}

void Init_Flags(void)
{
*pFIO_INEN  |= PF0|PF1;
*pFIO_DIR  &=~(PF0|PF1);
*pFIO_EDGE  |= PF0|PF1;
*pFIO_MASKA_D |= PF0|PF1;
}

对于上面 两个 函数我进行了单步运行,当程序运行到这一步*pFIO_DIR  &=~(PF0|PF1);我查看寄存器发现FIO_FLAG_C,FIO_FLAG_T,FIO_FLAG_D,FIO_FLA_S,这四个寄存器全变成了0003,这个问题我已经在求助GPIO_IN那个帖子里 提出来了,但是当我运行到*pFIO_EDGE  |= PF0|PF1;这一步的时候,这四个寄存器莫名其妙的变成了0000,这是 为什么 呀,难道系统自动设置的?这里尽然你的寄存器全部变成了0000,说明此时你的 PF口电平应该为低,而我继续单步运行程序,执行到中断的时候将PF0
飞线接地,这时候显示了有PF0这个中断,而上面 四个寄存器突然变成了0001,问我不明白,我是接地,原来PF口是 低电平,我接地还是低电平,此时根本就 不能 形成 下降沿,为什么 能 够触发中断呢,还有,我接地为什么FIO_FLGA_D这个寄存器会是0001呢,我可是接地输入的低电平呀,然后我接着将 PF口连接到了3V电源上,这是我突然发现也可以出触发中断,怎么 接高电平也可以触发中断呢,很 不 明白?


喜欢学习
等级:论坛新手 参考IP地址:*.*.*.*
2012/7/18 17:12:18
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

*pFIO_DIR  &=~(PF0|PF1);    

                   执行这个,接口设置输入,读取接口状态,外部接口上拉,读取值为1.

我查看寄存器发现FIO_FLAG_C,FIO_FLAG_T,FIO_FLAG_D,FIO_FLA_S,这四个寄存器全变成了0003。

                  正常,处理器就是这么设计的。

但是当我运行到*pFIO_EDGE  |= PF0|PF1;这一步的时候,这四个寄存器莫名其妙的变成了0000。

                  执行这个,数据寄存器将不再指示当前IO的状态,而指示的是 是否触发,1代表触发,0代表没有触发,所以全部变为0.

飞线接地,这时候显示了有PF0这个中断,而上面 四个寄存器突然变成了0001,问我不明白,我是接地,原来PF口是 低电平,我接地还是低电平,此时根本就 不能 形成 下降沿,为什么 能 够触发中断呢。

                 PF接口被上拉,电平始终为1,接地后产生下降沿,触发中断。

飞线接地,这时候显示了有PF0这个中断,而上面 四个寄存器突然变成了0001,问我不明白,我是接地,原来PF口是 低电平,我接地还是低电平,此时根本就 不能 形成 下降沿,为什么 能 够触发中断呢,还有,我接地为什么FIO_FLGA_D这个寄存器会是0001呢,我可是接地输入的低电平呀,

               因中断触发,相对应的IO接口数据被设置为1.表示该接口中断触发,而非表示电平状态。

  然后我接着将 PF口连接到了3V电源上,这是我突然发现也可以出触发中断,怎么 接高电平也可以触发中断呢,很 不 明白?

             断开接地PF接口在上拉电阻作用下会自动变为1,你接电源产生中断,是由于接口接入高电平在接触瞬间出现电平抖动,产生了中断。



这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/7/19 10:23:14
hitcxf(论坛新手)
hitcxf
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:154
积分:10
注册时间:2012/3/14
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
求各个寄存器详细说明资料  *pFIO_DIR &=~(PF0|PF1); 这句话的意思是让PF0和|PF1的方向都设置为输入,但是那么PF0=?PF1=?PF0=0000 0000 0000 0001?PF1=0000 0000 0000 0010?求解

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

头文件已经定义了PF0和PF1,即 :

#define PF0  0x0001

#define PF0  0x0002

寄存器每一位的定义名称,就在VDSP帮助文件中,所有寄存器的每一位都有名字,设置表示该位置1,部分寄存器是多位组合,定义的名字也有,但如果不好查的话,也可以自己定义使用。



这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/7/21 0:01:49
小西瓜(论坛新手)
小西瓜
头衔:社区公民
帮派:无帮无派
帖数:10
金钱:208
积分:12
注册时间:2012/9/19
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
飞线接地的话有下降沿触发,那我如果没有飞线接地的话 是怎么触发的呢?

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/3/21 16:06:03
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
触发方式有沿触发和电平触发,沿触发分为上升沿触发或者下降沿触发。电平触发分为高电平或者低电平触发。看你使用哪个触发。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/3/21 22:53:21
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159180 Call, 1 Queries, Processed in 0.015625 second(s),