ARM Cortex M3系列GPIO口介紹(工作方式探討)
一、Cortex M3的GPIO口特性
在介紹GPIO口功能前,有必要先說明一下M3的結(jié)構(gòu)框圖,這樣能夠更好理解總線結(jié)構(gòu)和GPIO所處的位置。
Cortex M3結(jié)構(gòu)框圖
從圖中可以看出,GPIO口都是接在APB總線上的,而且M3具有兩個AHB到APB橋,GPIO則直接接在AHB矩陣上,這樣可以減少CPU和DMA控制器之間的競爭沖入,獲得較高性能。APB總線橋配置為寫緩沖區(qū),使得CPU或DMA控制器可直接操作APB外設(shè),而無需等待總線寫操作完成。
M3數(shù)字I/O功能:
高速GPIO口,其寄存器被移到外設(shè)AHB總線,可以字節(jié),半字和字尋址。
位電平置位和清零寄存器允許單指令置位和清零一個端口的任意位。
所有GPIO口寄存器支持M3位帶操作。
整個端口值可以用一條指令寫入。
GPIO口寄存器可由GPDMA控制器進(jìn)行訪問,可以進(jìn)行DMA數(shù)據(jù)操作,使之與DMA請求同步。
單個I/O口方向可以控制。
所有I/O口在復(fù)位后默認(rèn)作為上拉輸入。(Why?因?yàn)槲⒖刂破鬟B接了很多設(shè)備,如果復(fù)位后作為輸出,則由于控制器電平狀態(tài)不定,可能會導(dǎo)致外圍設(shè)備產(chǎn)生動作,從而產(chǎn)生不利影響,故復(fù)位后一半都作為輸入狀態(tài)。)
M3可產(chǎn)生中斷的數(shù)字端口:
PORT0 和 PORT2 端口的每個引腳都可以提供中斷功能;
每個端口上的中斷可被編程為上升沿、下降沿或邊沿產(chǎn)生中斷;
邊沿檢測是異步的,因此可以在沒有時鐘的情況下(例如掉電模式)操作。使用這種特性,就無需電平觸發(fā)中斷;
可掉電喚醒;
寄存器為軟件提供掛起的上升沿中斷、掛起的下降沿中斷和整個掛起的 GPIO中斷;
GPIO0 和 GPIO2 中斷與外部中斷 3 事件共用相同的 NVIC 通道。
二、GPIO口的寄存器描述
Cortex M3引腳的寄存器描述:
PINMODEx表示引腳模式選擇寄存器,在使用前要配置好。
引腳模式選擇寄存器位
PINMODEx
功能
復(fù)位后的值
00
引腳使能上拉電阻
00
01
中繼模式
10
引腳無片內(nèi)上拉或下拉電阻
11
引腳使能下拉電阻
中繼模式說明:當(dāng)引腳處于邏輯高電平,中繼模式能使能上拉電阻;當(dāng)引腳處于邏輯低電平時,中繼模式會使能下拉電阻,這樣當(dāng)引腳配置為輸入且沒有外部驅(qū)動時,能夠保持上一個已知狀態(tài)。
PINSELx:功能選擇寄存器。用來設(shè)定PORT引腳的功能,當(dāng)PINSELx各位為0時,才用作GPIO
端口。
FIOxDIR:GPIO口方向寄存器,單獨(dú)控制每個端口管腳的方向,可作為字節(jié)(8位),半字(16位)和字長(32位)的數(shù)據(jù)進(jìn)行訪問。
FIOxMASK:屏蔽寄存器。任何寫、讀的操作只在該寄存器對應(yīng)位為“0“時才有效。
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.1GPIO端口方向寄存器FIOxDIR(FIO0DIR??FIO4DIR- 0x2009 C000??0x2009 C080)
當(dāng)引腳被配置為 GPIO功能時,該寄存器可用來控制引腳的方向。勿必根據(jù)引腳功能來設(shè)置每個引腳的方向。
注:GPIO引腳 P0.29和P0.30 與USB D+/-引腳共用,并且具有相同的方向。如果FP0DIR位29或位30在FIO0DIR寄存器中被配置為零,則P0.29 和P0.30都為輸入。如果FP0DIR位29和位30被配置為1,則P0.29和P0.30都為輸出。
高速GPIO端口方向寄存器位描述
位
符號
值
描述
復(fù)位值
31:0(字長數(shù)據(jù))
FP0DIR
FP1DIR
FP2DIR
FP3DIR
FP4DIR
0
1
控制的引腳為輸入引腳
控制的引腳為輸出引腳
0
字和半字的操作基本類似,只是可以通過8位寄存器或者16位的寄存器分別控制方向而已,這里不再解釋,請參看《深入淺出Cortex-M3 LPC1700》.
2.2GPIO端口輸出設(shè)置寄存器FIOxSET(FIO0SET??FIO7SET - 0x2009 C018??0x2009 C098)
當(dāng)引腳在輸出模式中被配置為 GPIO 時,該寄存器在端口引腳產(chǎn)生高電平輸出。向該寄存器的某些位寫入“1”時,對應(yīng)的引腳產(chǎn)生高電平。寫入“0”無效。如果需要引腳輸出低電平或第二種功能,那么寫 1 到 FIOxSET 的相應(yīng)位無效。 讀FIOxSET 寄存器返回該寄存器的值,該值由前一次對 FIOxSET 和 FIOxCLR(或前面提到的 FIOxPIN)的寫操作確定,它不反映任何外部環(huán)境對 I/O引腳的影響。 通過 FIOxSET 寄存器訪問的端口引腳受到 FIOxMASK 寄存器相應(yīng)位的限制。
高速GPIO端口輸出設(shè)置寄存器位描述
位
符號
值
描述
復(fù)位值
31:0(字長數(shù)據(jù))
FP0SET
FP1SET
FP2SET
FP3SET
FP4SET
0
1
控制的引腳輸出不改變
控制的引腳輸出被設(shè)為高電平
0
2.3GPIO端口輸出清零寄存器FIOxCLR(FIO0CLR??FIO07CLR - 0x2009 C01C??0x2009 C09C)
當(dāng)引腳在輸出模式中被配置為 GPIO 時,該寄存器在端口引腳產(chǎn)生低電平輸出。向某些位寫入“1”會使相應(yīng)的引腳產(chǎn)生低電平,同時清零 FIOxSET 寄存器的相應(yīng)位。寫入“0”無效。如果引腳被配置為輸入或其它功能,那么寫 FIOxCLR 對引腳沒有影響。 通過FIOxCLR寄存器訪問的端口引腳受到FIOxMASK寄存器相應(yīng)位的限制.
高速GPIO端口輸出清零寄存器位描述
位
符號
值
描述
復(fù)位值
31:0(字長數(shù)據(jù))
FP0CLR
FP1CLR
FP2CLR
FP3CLR
FP4CLR
0
1
控制的引腳輸出不改變
控制的引腳輸出被設(shè)為低電平
0
2.4GPIO端口引腳值寄存器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)選擇了模擬配置時,引腳狀態(tài)不能被讀出。將引腳選擇用作A/D輸入會斷開與引腳數(shù)字部分的連接。在這種情況下,從 FIOxPIN 寄存器中讀出的引腳值無效。
寫 FIOxPIN 寄存器時, FIOxPIN 寄存器的值會保存到端口輸出寄存器,而無需使用 FIOxSET和 FIOxCLR寄存器來獲得整個寫入值。由于這種特性影響整個端口,因此在應(yīng)用中時要小心。 通過 FIOxPIN 寄存器訪問的端口引腳受到 FIOxMASK 寄存器相應(yīng)位的限制。 只有在屏蔽寄存器中用0 屏蔽的引腳與高速 GPIO 端口引腳值寄存器的當(dāng)前內(nèi)容相互關(guān)聯(lián)。
高速GPIO端口引腳值寄存器位描述
位
符號
值
描述
復(fù)位值
31:0(字長數(shù)據(jù))
FP0VAL
FP1VAL
FP2VAL
FP3VAL
FP4VAL
0
1
控制的引腳輸出設(shè)為低電平
控制的引腳輸出設(shè)為高電平
0
2.5高速GPIO端口屏蔽寄存器FIOxMASK (FIO0MASK??FIO7MASK - 0x2009 C010??0x2009 C090)
該寄存器用來屏蔽某些端口引腳,被屏蔽的引腳將無法通過 FIOxPIN、 FIOxSET 或 FIOxCLR寄存器寫訪問。當(dāng)讀FIOxPIN 寄存器時,屏蔽寄存器還將過濾相應(yīng)端口的內(nèi)容。
通過讀或?qū)懺L問,該寄存器中為“0”的位使能相應(yīng)物理引腳的訪問。如果該寄存器中的位為“1”,則相應(yīng)位將不會通過寫訪問改變,并且讀操作時將不會在更新的 FIOxPIN 寄存器中反映出來。
高速GPIO端口引腳值寄存器位描述
位
符號
值
描述
復(fù)位值
31:0(字長數(shù)據(jù))
FP0VAL
FP1VAL
FP2VAL
FP3VAL
FP4VAL
0
1
控制的引腳輸出設(shè)為低電平
控制的引腳輸出設(shè)為高電平
0
2.1GPIO端口方向寄存器FIOxDIR(FIO0DIR??FIO4DIR- 0x2009 C000??0x2009 C080)
當(dāng)引腳被配置為 GPIO功能時,該寄存器可用來控制引腳的方向。勿必根據(jù)引腳功能來設(shè)置每個引腳的方向。
注:GPIO引腳 P0.29和P0.30 與USB D+/-引腳共用,并且具有相同的方向。如果FP0DIR位29或位30在FIO0DIR寄存器中被配置為零,則P0.29 和P0.30都為輸入。如果FP0DIR位29和位30被配置為1,則P0.29和P0.30都為輸出。
高速GPIO端口方向寄存器位描述
位
符號
值
描述
復(fù)位值
31:0(字長數(shù)據(jù))
FP0DIR
FP1DIR
FP2DIR
FP3DIR
FP4DIR
0
1
控制的引腳為輸入引腳
控制的引腳為輸出引腳
0
字和半字的操作基本類似,只是可以通過8位寄存器或者16位的寄存器分別控制方向而已,這里不再解釋,請參看《深入淺出Cortex-M3 LPC1700》.
2.2GPIO端口輸出設(shè)置寄存器FIOxSET(FIO0SET??FIO7SET - 0x2009 C018??0x2009 C098)
當(dāng)引腳在輸出模式中被配置為 GPIO 時,該寄存器在端口引腳產(chǎn)生高電平輸出。向該寄存器的某些位寫入“1”時,對應(yīng)的引腳產(chǎn)生高電平。寫入“0”無效。如果需要引腳輸出低電平或第二種功能,那么寫 1 到 FIOxSET 的相應(yīng)位無效。 讀FIOxSET 寄存器返回該寄存器的值,該值由前一次對 FIOxSET 和 FIOxCLR(或前面提到的 FIOxPIN)的寫操作確定,它不反映任何外部環(huán)境對 I/O引腳的影響。 通過 FIOxSET 寄存器訪問的端口引腳受到 FIOxMASK 寄存器相應(yīng)位的限制。
高速GPIO端口輸出設(shè)置寄存器位描述
位
符號
值
描述
復(fù)位值
31:0(字長數(shù)據(jù))
FP0SET
FP1SET
FP2SET
FP3SET
FP4SET
0
1
控制的引腳輸出不改變
控制的引腳輸出被設(shè)為高電平
0
2.3GPIO端口輸出清零寄存器FIOxCLR(FIO0CLR??FIO07CLR - 0x2009 C01C??0x2009 C09C)
當(dāng)引腳在輸出模式中被配置為 GPIO 時,該寄存器在端口引腳產(chǎn)生低電平輸出。向某些位寫入“1”會使相應(yīng)的引腳產(chǎn)生低電平,同時清零 FIOxSET 寄存器的相應(yīng)位。寫入“0”無效。如果引腳被配置為輸入或其它功能,那么寫 FIOxCLR 對引腳沒有影響。 通過FIOxCLR寄存器訪問的端口引腳受到FIOxMASK寄存器相應(yīng)位的限制.