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