一、Cortex M3的GPIO口特性
在介紹GPIO口功能前,有必要先說明一下M3的結(jié)構(gòu)框圖,這樣能夠更好理解總線結(jié)構(gòu)和GPIO所處的位置。
Cortex M3結(jié)構(gòu)框圖 從圖中可以看出,GPIO口都是接在APB總線上的,而且M3具有兩個(gè)AHB到APB橋,GPIO則直接接在AHB矩陣上,這樣可以減少CPU和DMA控制器之間的競(jìng)爭(zhēng)沖入,獲得較高性能。APB總線橋配置為寫緩沖區(qū),使得CPU或DMA控制器可直接操作APB外設(shè),而無需等待總線寫操作完成。 M3數(shù)字I/O功能:
高速GPIO口,其寄存器被移到外設(shè)AHB總線,可以字節(jié),半字和字尋址。
位電平置位和清零寄存器允許單指令置位和清零一個(gè)端口的任意位。
所有GPIO口寄存器支持M3位帶操作。
整個(gè)端口值可以用一條指令寫入。
GPIO口寄存器可由GPDMA控制器進(jìn)行訪問,可以進(jìn)行DMA數(shù)據(jù)操作,使之與DMA請(qǐng)求同步。
單個(gè)I/O口方向可以控制。
所有I/O口在復(fù)位后默認(rèn)作為上拉輸入。(Why?因?yàn)槲⒖刂破鬟B接了很多設(shè)備,如果復(fù)位后作為輸出,則由于控制器電平狀態(tài)不定,可能會(huì)導(dǎo)致外圍設(shè)備產(chǎn)生動(dòng)作,從而產(chǎn)生不利影響,故復(fù)位后一半都作為輸入狀態(tài)。)
M3可產(chǎn)生中斷的數(shù)字端口:
PORT0 和 PORT2 端口的每個(gè)引腳都可以提供中斷功能;
每個(gè)端口上的中斷可被編程為上升沿、下降沿或邊沿產(chǎn)生中斷;
邊沿檢測(cè)是異步的,因此可以在沒有時(shí)鐘的情況下(例如掉電模式)操作。使用這種特性,就無需電平觸發(fā)中斷;
可掉電喚醒;
寄存器為軟件提供掛起的上升沿中斷、掛起的下降沿中斷和整個(gè)掛起的 GPIO中斷;
GPIO0 和 GPIO2 中斷與外部中斷 3 事件共用相同的 NVIC 通道。
二、GPIO口的寄存器描述
Cortex M3引腳的寄存器描述:
PINMODEx表示引腳模式選擇寄存器,在使用前要配置好。
引腳模式選擇寄存器位
中繼模式說明:當(dāng)引腳處于邏輯高電平,中繼模式能使能上拉電阻;當(dāng)引腳處于邏輯低電平時(shí),中繼模式會(huì)使能下拉電阻,這樣當(dāng)引腳配置為輸入且沒有外部驅(qū)動(dòng)時(shí),能夠保持上一個(gè)已知狀態(tài)。
PINSELx:功能選擇寄存器。用來設(shè)定PORT引腳的功能,當(dāng)PINSELx各位為0時(shí),才用作GPIO
端口。
FIOxDIR:GPIO口方向寄存器,單獨(dú)控制每個(gè)端口管腳的方向,可作為字節(jié)(8位),半字(16位)和字長(zhǎng)(32位)的數(shù)據(jù)進(jìn)行訪問。
FIOxMASK:屏蔽寄存器。任何寫、讀的操作只在該寄存器對(duì)應(yīng)位為“0“時(shí)才有效。
FIOxPIN:管腳值寄存器。只要管腳不配置為ADC,其他所有方式都可以從該位讀出端口當(dāng)前的實(shí)際狀態(tài)。注:如果讀FIOPIN寄存器,那么不管物理引腳的狀態(tài)如何,在 FIOMASK
寄存器中被“1”屏蔽的位將始終讀出0。
FIOxSET:輸出引腳的狀態(tài)。寫 1 使相應(yīng)的端口引腳產(chǎn)生高電平。寫 0 沒有影響。讀該寄存器返回端口輸出寄存器的當(dāng)前內(nèi)容。只可以更改 FIOMASK 中為 0 的位,即非屏蔽位。
FIOxCLR:控制輸出引腳的狀態(tài)。寫 1 使相應(yīng)的端口引腳產(chǎn)生低電平。寫 0 沒有影響。只可以更改 FIOMASK 中為 0 的位,即非屏蔽位。
2.1 GPIO端口方向寄存器FIOxDIR(FIO0DIR??FIO4DIR- 0x2009 C000??0x2009 C080)
當(dāng)引腳被配置為 GPIO功能時(shí),該寄存器可用來控制引腳的方向。勿必根據(jù)引腳功能來設(shè)置每個(gè)引腳的方向。
注:GPIO引腳 P0.29和P0.30 與USB D+/-引腳共用,并且具有相同的方向。如果FP0DIR位29或位30在FIO0DIR寄存器中被配置為零,則P0.29 和P0.30都為輸入。如果FP0DIR位29和位30被配置為1,則P0.29和P0.30都為輸出。
高速GPIO端口方向寄存器位描述 位 | | | | | 31:0(字長(zhǎng)數(shù)據(jù)) | FP0DIR FP1DIR FP2DIR FP3DIR FP4DIR | | | |
字和半字的操作基本類似,只是可以通過8位寄存器或者16位的寄存器分別控制方向而已,這里不再解釋,請(qǐng)參看《深入淺出Cortex-M3 LPC1700》. 2.2 GPIO端口輸出設(shè)置寄存器FIOxSET(FIO0SET??FIO7SET - 0x2009 C018??0x2009 C098)
當(dāng)引腳在輸出模式中被配置為 GPIO 時(shí),該寄存器在端口引腳產(chǎn)生高電平輸出。向該寄存器的某些位寫入“1”時(shí),對(duì)應(yīng)的引腳產(chǎn)生高電平。寫入“0”無效。如果需要引腳輸出低電平或第二種功能,那么寫 1 到 FIOxSET 的相應(yīng)位無效。 讀FIOxSET 寄存器返回該寄存器的值,該值由前一次對(duì) FIOxSET 和 FIOxCLR(或前面提到的 FIOxPIN)的寫操作確定,它不反映任何外部環(huán)境對(duì) I/O引腳的影響。 通過 FIOxSET 寄存器訪問的端口引腳受到 FIOxMASK 寄存器相應(yīng)位的限制。
高速GPIO端口輸出設(shè)置寄存器位描述 位 | | | | | 31:0(字長(zhǎng)數(shù)據(jù)) | FP0SET FP1SET FP2SET FP3SET FP4SET | | 控制的引腳輸出不改變
控制的引腳輸出被設(shè)為高電平
| |
2.3 GPIO端口輸出清零寄存器FIOxCLR(FIO0CLR??FIO07CLR - 0x2009 C01C??0x2009 C09C)
當(dāng)引腳在輸出模式中被配置為 GPIO 時(shí),該寄存器在端口引腳產(chǎn)生低電平輸出。向某些位寫入“1”會(huì)使相應(yīng)的引腳產(chǎn)生低電平,同時(shí)清零 FIOxSET 寄存器的相應(yīng)位。寫入“0”無效。如果引腳被配置為輸入或其它功能,那么寫 FIOxCLR 對(duì)引腳沒有影響。 通過FIOxCLR寄存器訪問的端口引腳受到FIOxMASK寄存器相應(yīng)位的限制.
高速GPIO端口輸出清零寄存器位描述 位 | | | | | 31:0(字長(zhǎng)數(shù)據(jù)) | FP0CLR FP1CLR FP2CLR FP3CLR FP4CLR | | 控制的引腳輸出不改變
控制的引腳輸出被設(shè)為低電平
| |
2.4 GPIO端口引腳值寄存器FIOxPIN(FIO0PIN??FIO7PIN- 0x2009 C014??0x2009 C094)
該寄存器提供了端口引腳的值,可配置這些值來執(zhí)行僅為數(shù)字的功能。該寄存器將給出引腳的當(dāng)前邏輯值,而不管引腳是否配置為輸入或輸出,或作為 GPIO或作為其它可選的數(shù)字功能。
例如,特殊的端口引腳可能具有 GPIO輸入、GPIO 輸出、UART 接收和 PWM 輸出等可選功能。無論該引腳配置成何種功能,都可以從相應(yīng)的 FIOxPIN 寄存器中讀出其當(dāng)前的邏輯狀態(tài)。 如果引腳配置為模擬功能,當(dāng)選擇了模擬配置時(shí),引腳狀態(tài)不能被讀出。將引腳選擇用作A/D輸入會(huì)斷開與引腳數(shù)字部分的連接。在這種情況下,從 FIOxPIN 寄存器中讀出的引腳值無效。
寫 FIOxPIN 寄存器時(shí), FIOxPIN 寄存器的值會(huì)保存到端口輸出寄存器,而無需使用 FIOxSET和 FIOxCLR寄存器來獲得整個(gè)寫入值。由于這種特性影響整個(gè)端口,因此在應(yīng)用中時(shí)要小心。 通過 FIOxPIN 寄存器訪問的端口引腳受到 FIOxMASK 寄存器相應(yīng)位的限制。 只有在屏蔽寄存器中用0 屏蔽的引腳與高速 GPIO 端口引腳值寄存器的當(dāng)前內(nèi)容相互關(guān)聯(lián)。
高速GPIO端口引腳值寄存器位描述 位 | | | | | 31:0(字長(zhǎng)數(shù)據(jù)) | FP0VAL FP1VAL FP2VAL FP3VAL FP4VAL | | 控制的引腳輸出設(shè)為低電平
控制的引腳輸出設(shè)為高電平
| |
2.5 高速GPIO端口屏蔽寄存器FIOxMASK (FIO0MASK??FIO7MASK - 0x2009 C010??0x2009 C090)
該寄存器用來屏蔽某些端口引腳,被屏蔽的引腳將無法通過 FIOxPIN、 FIOxSET 或 FIOxCLR寄存器寫訪問。當(dāng)讀FIOxPIN 寄存器時(shí),屏蔽寄存器還將過濾相應(yīng)端口的內(nèi)容。
通過讀或?qū)懺L問,該寄存器中為“0”的位使能相應(yīng)物理引腳的訪問。如果該寄存器中的位為“1”,則相應(yīng)位將不會(huì)通過寫訪問改變,并且讀操作時(shí)將不會(huì)在更新的 FIOxPIN 寄存器中反映出來。
高速GPIO端口引腳值寄存器位描述 位 | | | | | 31:0(字長(zhǎng)數(shù)據(jù)) | FP0VAL FP1VAL FP2VAL FP3VAL FP4VAL | | 控制的引腳輸出設(shè)為低電平
控制的引腳輸出設(shè)為高電平
| |
2.1 GPIO端口方向寄存器FIOxDIR(FIO0DIR??FIO4DIR- 0x2009 C000??0x2009 C080)
當(dāng)引腳被配置為 GPIO功能時(shí),該寄存器可用來控制引腳的方向。勿必根據(jù)引腳功能來設(shè)置每個(gè)引腳的方向。
注:GPIO引腳 P0.29和P0.30 與USB D+/-引腳共用,并且具有相同的方向。如果FP0DIR位29或位30在FIO0DIR寄存器中被配置為零,則P0.29 和P0.30都為輸入。如果FP0DIR位29和位30被配置為1,則P0.29和P0.30都為輸出。
高速GPIO端口方向寄存器位描述 位 | | | | | 31:0(字長(zhǎng)數(shù)據(jù)) | FP0DIR FP1DIR FP2DIR FP3DIR FP4DIR | | 控制的引腳為輸入引腳
控制的引腳為輸出引腳
| |
字和半字的操作基本類似,只是可以通過8位寄存器或者16位的寄存器分別控制方向而已,這里不再解釋,請(qǐng)參看《深入淺出Cortex-M3 LPC1700》. 2.2 GPIO端口輸出設(shè)置寄存器FIOxSET(FIO0SET??FIO7SET - 0x2009 C018??0x2009 C098)
當(dāng)引腳在輸出模式中被配置為 GPIO 時(shí),該寄存器在端口引腳產(chǎn)生高電平輸出。向該寄存器的某些位寫入“1”時(shí),對(duì)應(yīng)的引腳產(chǎn)生高電平。寫入“0”無效。如果需要引腳輸出低電平或第二種功能,那么寫 1 到 FIOxSET 的相應(yīng)位無效。 讀FIOxSET 寄存器返回該寄存器的值,該值由前一次對(duì) FIOxSET 和 FIOxCLR(或前面提到的 FIOxPIN)的寫操作確定,它不反映任何外部環(huán)境對(duì) I/O引腳的影響。 通過 FIOxSET 寄存器訪問的端口引腳受到 FIOxMASK 寄存器相應(yīng)位的限制。
高速GPIO端口輸出設(shè)置寄存器位描述 位 | | | | | 31:0(字長(zhǎng)數(shù)據(jù)) | FP0SET FP1SET FP2SET FP3SET FP4SET | | 控制的引腳輸出不改變
控制的引腳輸出被設(shè)為高電平
| |
2.3 GPIO端口輸出清零寄存器FIOxCLR(FIO0CLR??FIO07CLR - 0x2009 C01C??0x2009 C09C)
當(dāng)引腳在輸出模式中被配置為 GPIO 時(shí),該寄存器在端口引腳產(chǎn)生低電平輸出。向某些位寫入“1”會(huì)使相應(yīng)的引腳產(chǎn)生低電平,同時(shí)清零 FIOxSET 寄存器的相應(yīng)位。寫入“0”無效。如果引腳被配置為輸入或其它功能,那么寫 FIOxCLR 對(duì)引腳沒有影響。 通過FIOxCLR寄存器訪問的端口引腳受到FIOxMASK寄存器相應(yīng)位的限制.
高速GPIO端口輸出清零寄存器位描述 位 | | | | | 31:0(字長(zhǎng)數(shù)據(jù)) | FP0CLR FP1CLR FP2CLR FP3CLR FP4CLR | | 控制的引腳輸出不改變
控制的引腳輸出被設(shè)為低電平
| |
2.4 GPIO端口引腳值寄存器FIOxPIN(FIO0PIN??FIO7PIN- 0x2009 C014??0x2009 C094)
該寄存器提供了端口引腳的值,可配置這些值來執(zhí)行僅為數(shù)字的功能。該寄存器將給出引腳的當(dāng)前邏輯值,而不管引腳是否配置為輸入或輸出,或作為 GPIO或作為其它可選的數(shù)字功能。
例如,特殊的端口引腳可能具有 GPIO輸入、GPIO 輸出、UART 接收和 PWM 輸出等可選功能。無論該引腳配置成何種功能,都可以從相應(yīng)的 FIOxPIN 寄存器中讀出其當(dāng)前的邏輯狀態(tài)。 如果引腳配置為模擬功能,當(dāng)選擇了模擬配置時(shí),引腳狀態(tài)不能被讀出。將引腳選擇用作A/D輸入會(huì)斷開與引腳數(shù)字部分的連接。在這種情況下,從 FIOxPIN 寄存器中讀出的引腳值無效。
寫 FIOxPIN 寄存器時(shí), FIOxPIN 寄存器的值會(huì)保存到端口輸出寄存器,而無需使用 FIOxSET和 FIOxCLR寄存器來獲得整個(gè)寫入值。由于這種特性影響整個(gè)端口,因此在應(yīng)用中時(shí)要小心。 通過 FIOxPIN 寄存器訪問的端口引腳受到 FIOxMASK 寄存器相應(yīng)位的限制。 只有在屏蔽寄存器中用0 屏蔽的引腳與高速 GPIO 端口引腳值寄存器的當(dāng)前內(nèi)容相互關(guān)聯(lián)。
高速GPIO端口引腳值寄存器位描述 位 | | | | | 31:0(字長(zhǎng)數(shù)據(jù)) | FP0VAL FP1VAL FP2VAL FP3VAL FP4VAL | | 控制的引腳輸出設(shè)為低電平
控制的引腳輸出設(shè)為高電平
| |
2.5 高速GPIO端口屏蔽寄存器FIOxMASK (FIO0MASK??FIO7MASK - 0x2009 C010??0x2009 C090)
該寄存器用來屏蔽某些端口引腳,被屏蔽的引腳將無法通過 FIOxPIN、 FIOxSET 或 FIOxCLR寄存器寫訪問。當(dāng)讀FIOxPIN 寄存器時(shí),屏蔽寄存器還將過濾相應(yīng)端口的內(nèi)容。
通過讀或?qū)懺L問,該寄存器中為“0”的位使能相應(yīng)物理引腳的訪問。如果該寄存器中的位為“1”,則相應(yīng)位將不會(huì)通過寫訪問改變,并且讀操作時(shí)將不會(huì)在更新的 FIOxPIN 寄存器中反映出來。
高速GPIO端口引腳值寄存器位描述 位 | | | | | 31:0(字長(zhǎng)數(shù)據(jù)) | FP0VAL FP1VAL FP2VAL FP3VAL FP4VAL | | 控制的引腳輸出設(shè)為低電平
控制的引腳輸出設(shè)為高電平
| |
對(duì)于常見的ARM處理器,它們的GPIO口基本上可以配置為輸入模式、輸出模式、開漏或推挽模式,對(duì)于新唐的M0來說,所有I/O都處于準(zhǔn)雙端模式;對(duì)于NXP的M3處理器來說,GPIO可以配置為上拉、下拉、開漏或者中繼模式。
開漏輸出與推挽輸出的區(qū)別: 推挽輸出: 推挽結(jié)構(gòu)一般是指兩個(gè)三極管分別受兩互補(bǔ)信號(hào)的控制,總是在一個(gè)三極管導(dǎo)通的時(shí)候另一個(gè)截止。可以輸出高,低電平,連接數(shù)字器件,正常的拉出/灌入電流為4mA,短時(shí)間極限值可以達(dá)到40mA,但不是每個(gè)引腳都能輸出這么多 開漏輸出:輸出端相當(dāng)于三極管的集電極。要得到高電平狀態(tài)需要上拉電阻才行。適合于做電流型的驅(qū)動(dòng),其吸收電流的能力相對(duì)強(qiáng)(一般20mA以內(nèi)). 開漏電路概念中提到的“漏”就是指MOS FET的漏極。同理,開集電路中的“集”就是指三極管的集電極。開漏電路就是指以MOS FET的漏極為輸出的電路。一般的用法是會(huì)在漏極外部的電路添加上拉電阻。完整的開漏電路應(yīng)該由開漏器件和開漏上拉電阻組成。 組成開漏形式的電路有以下幾個(gè)特點(diǎn):
1. 利用 外部電路的驅(qū)動(dòng)能力,減少IC內(nèi)部的驅(qū)動(dòng)。當(dāng)IC內(nèi)部MOSFET導(dǎo)通時(shí),驅(qū)動(dòng)電流是從外部的VCC流經(jīng)R pull-up,MOSFET到GND。IC內(nèi)部?jī)H需很小的柵極驅(qū)動(dòng)電流。如圖1。
2. 可以將多個(gè)開漏輸出的Pin,連接到一條線上。形成 “與邏輯” 關(guān)系。如圖,當(dāng)PIN_A、PIN_B、PIN_C任意一個(gè)變低后,開漏線上的邏輯就為0了。這也是I2C,SMBus等總線判斷總線占用狀態(tài)的原理。
3. 可以利用改變上拉電源的電壓,改變傳輸電平。IC的邏輯電平由電源Vcc1決定,而輸出高電平則由Vcc2決定。這樣我們就可以用低電平邏輯控制輸出高電平邏輯了。
4. 開漏Pin不連接外部的上拉電阻,則只能輸出低電平(因此對(duì)于經(jīng)典的51單片機(jī)的P0口而言,要想做輸入輸出功能必須加外部上拉電阻,否則無法輸出高電平邏輯)。
問題集錦 一、準(zhǔn)雙向IO結(jié)構(gòu)的特點(diǎn)是
1 輸出結(jié)構(gòu)類似 OC門,輸出低電平時(shí),內(nèi)部NMOS導(dǎo)通,驅(qū)動(dòng)能力較強(qiáng)(800uA);輸出高電平靠?jī)?nèi)部上拉電阻,驅(qū)動(dòng)能力弱(60uA)。
2 永遠(yuǎn)有內(nèi)部電阻上拉,高電平輸出電流能力很弱,所以即使IO口長(zhǎng)時(shí)間短路到地也不會(huì)損壞IO口
(同理,IO口低電平輸出能力較強(qiáng),作低電平輸出時(shí)不能長(zhǎng)時(shí)間短路到VCC)
3 作輸入時(shí),因?yàn)镺C門有"線與"特性,必須把IO口設(shè)為高電平(所以按鍵多為共地接法)
4 作輸出時(shí),輸出低電平可以推動(dòng)LED(也是很弱的),輸出高電平通常需要外接緩沖電路(所以LED多為共陽接法)
5 軟件模擬 OC結(jié)構(gòu)的總線反而比較方便-----例如 IIC總線
* OC門:三極管的叫集電極開路,場(chǎng)效應(yīng)管的叫漏極開路,簡(jiǎn)稱開漏輸出。具備"線與"能力,有0得0。
* 為什么設(shè)計(jì)成輸出時(shí)高電平弱,低電平強(qiáng)----是考慮了當(dāng)年流行的TTL器件輸入
二、IO不同模式的區(qū)別?
簡(jiǎn)單的說:
“準(zhǔn)雙向IO口”在讀前必須先用寫指令置"1",才能讀入;寫則無須此步.
“真正的雙向IO口”可直接讀寫.
“三態(tài)IO口”有高,低電平,高阻狀態(tài),高阻本人理解:相當(dāng)此腳與內(nèi)部電路斷開.
|