GPIO簡介

GPIO簡介
GPIO(通用輸入/輸出端口)是相對於芯片而言的,如果在對應的芯片存在GPIO引腳則可以通過讀這些引腳來獲取引腳的變化(即:引腳的高低電平的變化)。


通過寄存器來訪問引腳:
在S3C2410芯片中存在117個I/O端口,共分爲A~H共8組分別爲GPA~~GPH,在S3C2440中存在130個I/O端口,共分爲A~J 9組名分別爲GPA~GPJ,配置這些端口相應的寄存器(GPXCON, x=A~H/J),設置引腳是用於輸入/輸出,或者是用於特殊功能。控制s3c2440的GPIO端口的寄存器有3類,分別是GPxCON、GPxDAT、GPxUP (x=A ~ J):
GPxCON:GPIO控制寄存器,可以設置選定GPIO口的輸入輸出方式和功能。GPA組的23個端口比較特殊,只能是輸出方式。GPACON的每一位對應一個引腳,當某位爲0時,對應引腳爲輸出端口,否則爲複用功能。
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--保留不用。
GPxDAT: 此引腳用於讀寫引腳的狀態,即端口數據。當引腳配置爲輸出時,給該寄存器某位寫1,則對應引腳輸出高電平,寫0輸出低電平。當引腳配置爲輸出時,讀該寄存器可以得到端口電平狀態。
GPXDAT用於讀/寫引腳,當配置GPXCON寄存器設置某引腳爲輸入時,讀此寄存器可以得知相應引腳的變化,當配置GPXCON寄存器設置某引腳爲輸出時,通過寫此此寄存器可以是相應引腳產生高低電平變化。
GPxUP: 該寄存器可以設置引腳是否使用上拉電阻,某位爲0時對應引腳使用內部上拉電阻,某位爲1時相應引腳無內部上拉電阻。注意:GPA組沒有GPxUP寄存器,即沒有上拉電阻。
通過軟件訪對GPIO的訪問:
#define GPBCON  (*(volatile unsigned long *)0x56000010)
#define GPBDAT  (*(volatile unsigned long *)0x56000014)
#define GPB_OUT  (1<<(2*5))
GPBCON = GPB_OUT; //設置GPB5爲輸出
GPBDAT &= ~(1<<5); //向GPB5輸出低電平
注:當需要設計程序訪問硬件時可參考芯片提供的電路原理圖查找所使用引腳並進一步查找芯片手冊中寄存器地址說明才確定所使用的寄存器的具體地址。
設置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即可。要讀數據時,先將寄存器置高,然後再讀。】
只對寄存器第x位賦0,其餘值不變 : GPBDAT &=~(1<<x);
只對寄存器第x位賦1,其餘值不變 : GPBDAT |=(1<<x);
這個移位雖然繁瑣,但是弄清之後,感覺甚是方便。
發佈了36 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章