ARM--GPIO端口

来源:互联网 发布:windows壁纸高清 编辑:程序博客网 时间:2024/05/29 14:14

s3c2440共有130个GPIO端口,分为9组,GPA ~ GPJ,通过寄存器控制。

控制s3c2440的GPIO端口的寄存器有3类,分别是GPxCON、GPxDAT、GPxUP (x=A ~ J):

GPxCON:GPIO控制寄存器,可以设置选定GPIO口的输入输出方式和功能。GPA组的23个端口比较特殊,只能是输出方式。GPACON的每一位对应一个引脚,当某位为0时,对应引脚为输出端口,否则为复用功能。

GPB ~ GPJ端口的GPxCON寄存器使用方法一致,每两位控制一个引脚,00时为输入I/O口,01时为输出I/O口,10时为复用功能,11保留。

GPxDAT:此引脚用于读写引脚的状态,即端口数据。当引脚配置为输出时,给该寄存器某位写1,则对应引脚输出高电平,写0输出低电平。当引脚配置为输出时,读该寄存器可以得到端口电平状态。

GPxUP:该寄存器可以设置引脚是否使用上拉电阻,某位为0时对应引脚使用上拉电阻,某位为1时不使用上拉电阻。注意:GPA组没有GPxUP寄存器,即没有上拉电阻。

1.GPIO简介:   

   GPIO(通用输入/输出端口)是相对于芯片而言的,如果在对应的芯片存在GPIO引脚则可以通过读这些引脚来获取引脚的变化(即:引脚的高低电平的变化).

   在S3C2410芯片中存在117个I/O端口,共分为A~H共8组分别为GPA~~GPH,在S3C2440中存在130个I/O端口,共分为A~J9组名分别为GPA~GPJ,配置这些端口相应的寄存器(GPXCON, x=A~H/J),设置引脚是用于输入/输出,或者是用于特殊功能.

1.1通过寄存器来访问引脚:

    1.GPXCON寄存器:

        GPXCON(x=A~~H/J)寄存器用于设置相应引脚的功能是输入/输出,还是特殊功能或保留不用。

         在功能配置方面PORTA与PORTB~PORTH/J有所不同,GPACON寄存器中每一位对应一个引脚(共23位),当某位被设置为0是,对应该位引脚被设置为输出引脚(可以用于写入),此时我们可以对GPADAT寄存器(用于写引脚)进行写操作,当某位被设置为1时(相应引脚为地址线/或用于控制),此时GONADAT无用.

         PORTB~PORTH/J对寄存器操作完全相同,GPXCON每2位对应一个引脚:

         00--输入。 01--输出。10--特殊功能。11--保留不用。

2.GPXDAT寄存器:【用来读写端口数据的】

        GPXDAT用于读/写引脚,当配置GPXCON寄存器设置某引脚为输入时,读此寄存器可以得知相应引脚的变化,当配置GPXCON寄存器设置某引脚为输出时,通过写此此寄存器可以是相应引脚产生高低电平变化.

   3.GPXUP寄存器:

         当某位为1时,相应引脚无内部上拉电阻;为0是,相应引脚使用内部上拉电阻;

1.2通过软件访对GPIO的访问:

#define GPBCON        (*(volatile unsigned long *)0x56000010)

/*0x56000010:为S342440的GPBCON地址 */

#define GPBDAT         (*(volatile unsigned long *)0x56000014)

/*0x56000014:为S342440的GPBDAT地址*/

#define GPB_OUT      (1<<(2*5))

/*此处为设置GPBCON对应第五位引脚的值其值为01----对应GPBCON展开值为0000010000000000*/                   

GPBCON = GPB_OUT; //设置GPB5为输出

GPBDAT &= ~(1<<5); //向GPB5输出低电平

注:当需要设计程序访问硬件时可参考芯片提供的电路原理图查找所使用引脚并进一步查找芯片手册中寄存器地址说明才确定所使用的寄存器的具体地址.

以上来自网络。

前面刚刚对GPIO寄存器位数那么多,操作繁琐抱怨

这里就发现一些对GPIO寄存器操作的技巧。

先记录下来。不过这位牛人的文章中好像很多地方显示都不正确,

自己尝试改改吧,不一定能改正确

设置GPIO寄存器技巧:
以GPF为例
1,设置控制位GPxCON寄存器的控制:


从引脚读数据 将GPxCON设置为输入:

      #define GPFx_in   ~(3<<(x*2))

【注释:将GPF端口的第X位设置为输入】   ,

前面说到的寄存器的输入输出控制中:【PORTB~PORTH/J对寄存器操作完全相同,GPXCON每2位对应一个引脚:

         00--输入。 01--输出。10--特殊功能。11--保留不用。】

3对应的二进制是11,将3先移位到 要操作的对应位,取反就成了00。

按此思路,如果要将相应的GPxCON设置为输出位,
只需将“01”左移即可:

     #define GPGx_out   (1<<(x*2))

2,对数据寄存器GPxDAT的控制:

回顾前面对GPxDAT的说明:

【一句话:GPxDAT是用来读写端口数据的。写数据的时候,直接将要写的值赋给GPxDAT即可。要读数据时,先将寄存器置高,然后再读。】

只对寄存器第x位赋0,其余值不变 : GPBDAT &=~(1<<x);

只对寄存器第x位赋1,其余值不变 : GPBDAT |=(1<<x);

这个移位虽然繁琐,但是弄清之后,感觉甚是方便。


原创粉丝点击