一、什么是GPIO? GPIO,英文全稱為General-Purpose IO ports,也就是通用IO口。嵌入式系統(tǒng)中常常有數(shù)量眾多,但是結(jié)構(gòu)卻比較簡單的外部設(shè)備/電路,對這些設(shè)備/電路有的需要CPU為之提供控制手段,有的則需要被CPU用作輸入信號。而且,許多這樣的設(shè)備/電路只要求一位,即只要有開/關(guān)兩種狀態(tài)就夠了,比如燈亮與滅。對這些設(shè)備/電路的控制,使用傳統(tǒng)的串行口或并行口都不合適。所以在微控制器芯片上一般都會提供一個“通用可編程IO接口”,即GPIO。 接口至少有兩個寄存器,即“通用IO控制寄存器”與“通用IO數(shù)據(jù)寄存器”。數(shù)據(jù)寄存器的各位都直接引到芯片外部,而對這種寄存器中每一位的作用,即每一位的信號流通方向,則可以通過控制寄存器中對應(yīng)位獨立的加以設(shè)置。這樣,有無GPIO接口也就成為微控制器區(qū)別于微處理器的一個特征。 ????在實際的MCU中,GPIO是有多種形式的。比如,有的數(shù)據(jù)寄存器可以按照位尋址,有些卻不能按照位尋址,這在編程時就要區(qū)分了。比如傳統(tǒng)的8051系列,就區(qū)分成可位尋址和不可位尋址兩種寄存器。另外,為了使用的方便,很多mcu把glue logic等集成到芯片內(nèi)部,增強了系統(tǒng)的穩(wěn)定性能,比如GPIO接口除去兩個標(biāo)準(zhǔn)寄存器必須具備外,還提供上拉寄存器,可以設(shè)置IO的輸出模式是高阻,還是帶上拉的電平輸出,或者不帶上拉的電平輸出。這在電路設(shè)計中,外圍電路就可以簡化不少。 ?? 另外需要注意的是,對于不同的計算機體系結(jié)構(gòu),設(shè)備可能是端口映射,也可能是內(nèi)存映射的。如果系統(tǒng)結(jié)構(gòu)支持獨立的IO地址空間,并且是端口映射,就必須使用匯編語言完成實際對設(shè)備的控制,因為C語言并沒有提供真正的“端口”的概念。如果是內(nèi)存映射,那就方便的多了。 舉個例子,比如像寄存器A(地址假定為0x48000000)寫入數(shù)據(jù)0x01,那么就可以這樣設(shè)置了。 #define A (*(volatile unsigned long *)0x48000000) ... ?????A = 0x01; ... ????這實際上就是內(nèi)存映射機制的方便性了。其中volatile關(guān)鍵字是嵌入式系統(tǒng)開發(fā)的一個重要特點。上述表達式拆開來分析,首先(volatile unsigned long *)0x48000000的意思是把0x48000000強制轉(zhuǎn)換成volatile unsigned long類型的指針,暫記為p,那么就是#define A *p,即A為P指針指向位置的內(nèi)容了。這里就是通過內(nèi)存尋址訪問到寄存器A,可以讀/寫操作。 ?? 二、S3C2410的GPIO的特點 ????s3c2410的GPIO有117pin,下面應(yīng)該到9 IO ports看看詳細部分了。 The S3C2410X has 117 multi-functional input/output port pins. The ports are: — Port A (GPA): 23-output port — Port B (GPB): 11-input/output port — Port C (GPC): 16-input/output port — Port D (GPD): 16-input/output port — Port E (GPE): 16-input/output port — Port F (GPF): 8-input/output port — Port G (GPG): 16-input/output port — Port H (GPH): 11-input/output port ????這么多的IO口,其實很多是復(fù)合功能的,既可以作為普通的IO口使用,也可以作為特殊外設(shè)接口。在程序設(shè)計時,要對整體的資源有所規(guī)劃,初始化時就應(yīng)該把所有資源安排合理。這樣才會避免出現(xiàn)問題。 ????現(xiàn)在的8個端口,其寄存器是相似的。除了兩個通用寄存器GPxCON、GPxDAT外,還提供了GPxUP用于確定是否使用內(nèi)部上拉電阻(其中x為A-H,需要注意的是沒有GPAUP)。應(yīng)用的主要步驟就是: ????·設(shè)置GPIO控制寄存器GPxCON ????·設(shè)置GPIO上拉寄存器GPxUP 初始化完成后,就可以通過對GPxDAT的操作來實現(xiàn)相應(yīng)的應(yīng)用了。其中,PORT A與PORT B-H在功能選擇方面有所不同,GPACON的每一位對應(yīng)一根引腳(共23pin有效)。當(dāng)某位設(shè)為0,相應(yīng)引腳為輸出引腳,此時往GPADAT中寫0/1,可以讓引腳輸出低電平/高電平;當(dāng)某位設(shè)為1,則相應(yīng)引腳為地址線,或者用于地址控制,此時GPADAT沒有用了。 一般而言,GPACON通常全設(shè)為1,以便訪問外部存儲器件。PORT B-H在寄存器操作方面完全相同。 GPxCON中每兩位控制一根引腳:00表示輸入,01表示輸出,10表示特殊功能,11保留。GPxDAT用于讀/寫引腳:當(dāng)引腳設(shè)為輸入時,讀此寄存器可知相應(yīng)引腳狀態(tài)是高/低;當(dāng)引腳設(shè)為輸出時,寫此寄存器相應(yīng)位可以使相應(yīng)引腳輸出低電平或高電平。GPxUP:某位設(shè)為0,相應(yīng)引腳無內(nèi)部上拉;為1,相應(yīng)引腳使用內(nèi)部上拉。關(guān)于特殊功能,那就得結(jié)合特殊外設(shè)來進行設(shè)置了。 ? ? PS:ARM是io和內(nèi)存統(tǒng)一編址的,GPIO寄存器映射到內(nèi)存總線上。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
?