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

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

void init_PF0_IN(void)
{
*pFIO_DIR &= ~PF0;
*pFIO_INEN |= PF0;
}
对这个 函数我进行了但不运行,运行完这个 函数之后我查看寄存器,突然发现以下寄存器FIO_FLAG_D,FIO_FLAG_C,FIO_FLAG_S,

FIO_FLAG_T这四个寄存器突然由原来的0000变成了0001,也就是说,系统自动把这四个寄存器生成了0001.

而我把这个初始化程序修改了一下,如下所示

void init_PF0_IN(void)
{
*pFIO_DIR &= ~PF0;
*pFIO_INEN |= PF0;
*pFIO_FLAG_C=0X0000;
*pFIO_FLAG_S &=0X0000;
}

但是对与上面这个程序,我单步运行,运行到这个函数的最后一步的时候,我发现 FIO_FLAG_C和FIO_FLAG_S这两个 寄存器竟然还是0001,按理说我已经把他们赋值为 0000了,为什么 查看寄存器还是 0001呢

疑问一:难道只要把PF口配置成输入,系统就 会自动 把PF口设置为高电平 1

疑问二:为什么,我对那 两个 寄存器付了0000这个 值,但是她还 是顽固的 保持0001不变呢

疑问三:这个FIO_FLAG_T这个寄存器是 怎么 使用的


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

1 .板卡上PF0和PF1接口有上拉电阻,在输入状态下,自然会读取数据1。

2.*pFIO_FLAG_C寄存器为写1清除接口,写0无效。但有个条件,1是该接口处于输出状态,使用,*pFIO_FLAG_C 写1,清除输出的高电平。2是在中断输入状态,用该寄存器清除中断触发标志。你在输入状态使用这个寄存器,不会有效果,而且你写的是0,也不会有效果。

你将寄存器初始化为输出状态,就能看到效果,具体可参考例子程序。

*pFIO_FLAG_S &=0X0000;   该寄存器不可进行“& |” 操作,只可写1,且必须用于输出状态下,输入状态下无效。

3.  锁定当前寄存器状态,不要使用。使用后将无法操作寄存


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/7/19 10:35:38
hitcxf(论坛新手)
hitcxf
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:154
积分:10
注册时间:2012/3/14
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

*pFIO_DIR &= ~PF0;  最后的结果应该使*pFIO_DIR 变成0,展开应该是*pFIO_DIR = *pFIO_DIR & ~PF0 这样看来~PF0 应该是0,难道是PF0 默认状态下是高电平?还有/*/ ******************   GENERAL-PURPOSE I/O  ********************* */
/*  Port F (Previously Flag I/O_ Masks */
#define PF0   0x0001
#define PF1   0x0002
#define PF2   0x0004
#define PF3   0x0008
#define PF4   0x0010
#define PF5   0x0020
#define PF6   0x0040
#define PF7   0x0080
#define PF8   0x0100
#define PF9   0x0200
#define PF10  0x0400
#define PF11  0x0800
#define PF12  0x1000
#define PF13  0x2000
#define PF14  0x4000
#define PF15  0x8000
头文件是这样定义的,难道PF0刚开始每一位都是1,还有将pFIO_DIR 写0,是将其所有位都写0,写1只将其最后一位写1?是不是*pFIO_DIR=0x0000对应为输入,*pFIO_DIR=0x000对应为输出???



这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/7/20 18:31:56
hitcxf(论坛新手)
hitcxf
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:154
积分:10
注册时间:2012/3/14
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
/*  PORT F BIT POSITIONS */
#define PF0_P  0x0
#define PF1_P  0x1
#define PF2_P  0x2
#define PF3_P  0x3
#define PF4_P  0x4
#define PF5_P  0x5
#define PF6_P  0x6
#define PF7_P  0x7
#define PF8_P  0x8
#define PF9_P  0x9
#define PF10_P  0xA
#define PF11_P  0xB
#define PF12_P  0xC
#define PF13_P  0xD
#define PF14_P  0xE
#define PF15_P  0xF
这个是什么含义啊? PF0 PF0_P 这两个有什么区别啊?

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

*pFIO_DIR &= ~PF0 为位操作,意思为保持其他位不变,只将PF0位设置为0.

PF0  为0x0001,取反后为 0xfffe,与*pFIO_DIR相与,PF0为设置为0,其他位保持不变。不管PF0默认为什么,执行后*pFIO_DIR的PF0位为0.设置为输入。

头文件定位只代表这一位,是为了方便使用位名称进行位操作,如将PF0位设置为1,只需将PF0 或入寄存器即可。和默认状态无关。搜索帮助文件“FIO_DIR”,可知该寄存器位写0为输入,写1为输出。

PF0_P 定义的不是位操作,能用上就用,用不上就不用,不要对其头文件定义过于计较。







这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/7/21 0:10:05
red_wlh(论坛新手)
red_wlh
头衔:社区公民
帮派:无帮无派
帖数:34
金钱:359
积分:41
注册时间:2012/4/9
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

顶一个


学习DSP中
等级:论坛新手 参考IP地址:*.*.*.*
2012/9/8 10:44:33
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154626 Call, 1 Queries, Processed in 0.030273 second(s),