2875|5

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

GPIO 驱动里面数据寄存器地址的疑惑 [复制链接]

/*******************************************************************************************
函数名称: GPIO_SetPin
描    述: 设置某个引脚输出高电平
输入参数: DWORD dwIoControlCode : I/O control code, 指出操作的GPIO组, 如GPA, GPB
          BYTE PinNum                        : 引脚编号, 如 GPB1, 则值为 1
输出参数:
返    回: TRUE: 操作成功    FALSE: 操作失败
*******************************************************************************************/
#define  ADDRESS_INTERVAL_GPIO                0x04 ;各个寄存器地址相差0X04
#define         IOCTL_GPX_MASK                        0x000000F

BOOL GPIO_SetPin(DWORD dwIoControlCode, BYTE PinNum)
{
        DWORD GPx;
        volatile DWORD *pRegDAT;                        // GPxDAT's address

        GPx = dwIoControlCode & IOCTL_GPX_MASK;
        if (PinNum >= PinNumTbl[GPx])  return FALSE;
       
        pRegDAT = ((DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO + 1);//怎么会这么计算呢?为什么会+1
        *pRegDAT |=  (0x01 << PinNum);

        return TRUE;
}
这是周立功的GPIO驱动里面的一个函数
我看数据手册中各个寄存器的地址相隔0x00000004的,
I/O PORT CONTROL REGISTER
PORT A CONTROL REGISTERS (GPACON/GPADAT)
Register Address R/W Description Reset Value
GPACON 0x56000000 R/W Configure the pins of port A 0x7FFFFF
GPADAT 0x56000004 R/W The data register for port A Undefined
Reserved 0x56000008 – Reserved Undefined
Reserved 0x5600000C – Reserved Undefined
/////////////////////////////////////////////////////
PORT B CONTROL REGISTERS (GPBCON, GPBDAT, and GPBUP)
Register Address R/W Description Reset Value
GPBCON 0x56000010 R/W Configure the pins of port B 0x0
GPBDAT 0x56000014 R/W The data register for port B Undefined
GPBUP 0x56000018 R/W Pull-up disable register for port B 0x0
Reserved 0x5600001C – Reserved Undefined
///////////////////////////////////////////////////////

这里
pRegDAT = ((DWORD *)v_pIOPregs + GPx * ADDRESS_INTERVAL_GPIO + 1);//怎么会这么计算呢?为什么会+1
知道的指点一下哦。初学者往往会问很弱智的问题。谢谢。

最新回复

//pRegDAT是指向经过映射的寄存器地址的指针,千万不要把它当成寄存器的地址  详情 回复 发表于 2008-8-1 09:03
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
// 定义 S3C2410 GPA ~ GPH 引脚个数
                                                //  A   B    C   D   E  F  G   H
const BYTE PinNumTbl[8] = {23, 11, 16, 16, 16, 8, 16, 11};
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
寄存器地址相差0x4,是指BYTE,字节。
而你疑问的+1,是以DWORD,也就是4BYTE进行的。
加1个DWORD,就是加4个BYTE。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
shuiyan 大哥总是一语点醒我这个小混脑子。

这个是地址,双字型的指针加1就等于多了4个字节——4byte;
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
感觉自己水平好次啊。刚才叫老大来看一下,他马上指出了。
老大就是老大。
俺刚毕业,小弟就是小弟。
好好在eeworld里面学习吧
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
//pRegDAT是指向经过映射的寄存器地址的指针,千万不要把它当成寄存器的地址
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表