对通用输入输出GPIO的深入理解
GPIO的各種模式
? ? GPIO管腳可以被配置為多種工作模式,其中有3種比較常用:高阻輸入、推挽輸出、開漏輸出
? ? 1. 高阻輸入(Input)
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 2012-6-25 11:00:57 上傳 下載附件 (8.61 KB)
圖1.1 GPIO高阻輸入模式結構示意圖
? ?為減少信息傳輸線的數目,大多數計算機中的信息傳輸線采用總線形式,即凡要傳輸的同類信息都在同一組傳輸線,且信息是分時傳送的。在計算機中一般有三組總線,即數據總線、地址總線和控制總線。為防止信息相互干擾,要求凡掛到總線上的寄存器或存儲器等,它的輸入輸出端不僅能呈現0、1兩個信息狀態,而且還應能呈現第三個狀態----高阻抗狀態,即此時好像它們的輸出被開關斷開,對總線狀態不起作用,此時總線可由其他器件占用。三態緩沖器即可實現上述功能,它除具有輸入輸出端之外,還有一控制端。
? ?如圖1.1所示,為GPIO管腳在高阻輸入模式下的等效結構示意圖。這是一個管腳的情況,其它管腳的結構也是同樣的。輸入模式的結構比較簡單,就是一個帶有施密特觸發輸入(Schmitt-triggered input)的三態緩沖器(U1),并具有很高的輸入等效阻抗。施密特觸發輸入的作用是能將緩慢變化的或者是畸變的輸入脈沖信號整形成比較理想的矩形脈沖信號。執行GPIO管腳讀操作時,在讀脈沖(Read Pulse)的作用下會把管腳(Pin)的當前電平狀態讀到內部總線上(Internal Bus)。在不執行讀操作時,外部管腳與內部總線之間是隔離的。
? ? 2. 推挽輸出(Output)
圖1.2 GPIO推挽輸出模式結構示意圖
? ???推挽輸出原理:在功率放大器電路中大量采用推挽放大器電路,這種電路中用兩只三極管構成一級放大器電路,兩只三極管分別放大輸入信號的正半周和負半周,即用一只三極管放大信號的正半周,用另一只三極管放大信號的負半周,兩只三極管輸出的半周信號在放大器負載上合并后得到一個完整周期的輸出信號。
推挽放大器電路中,一只三極管工作在導通、放大狀態時,另一只三極管處于截止狀態,當輸入信號變化到另一個半周后,原先導通、放大的三極管進入截止,而原先截止的三極管進入導通、放大狀態,兩只三極管在不斷地交替導通放大和截止變化,所以稱為推挽放大器(armjishu.com)。
? ?? ? 如圖1.2所示,為GPIO管腳在推挽輸出模式下的等效結構示意圖。U1是輸出鎖存器,執行GPIO管腳寫操作時,在寫脈沖(Write Pulse)的作用下,數據被鎖存到Q和/Q。T1和T2構成CMOS反相器,T1導通或T2導通時都表現出較低的阻抗,但T1和T2不會同時導通或同時關閉,最后形成的是推挽輸出。在推挽輸出模式下,GPIO還具有回讀功能,實現回讀功能的是一個簡單的三態門U2。注意:執行回讀功能時,讀到的是管腳的輸出鎖存狀態,而不是外部管腳Pin的狀態。
? ? 3. 開漏輸出(OutputOD)
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 2012-6-25 11:00:58 上傳 下載附件 (16.73 KB)
圖1.3 GPIO開漏輸出結構示意圖
? ???如圖1.3所示,為GPIO管腳在開漏輸出模式下的等效結構示意圖。開漏輸出和推挽輸出相比結構基本相同,但只有下拉晶體管T1而沒有上拉晶體管。同樣,T1實際上也是多組可編程選擇的晶體管。開漏輸出的實際作用就是一個開關,輸出“1”時斷開、輸出“0”時連接到GND(有一定內阻)?;刈x功能:讀到的仍是輸出鎖存器的狀態,而不是外部管腳Pin的狀態。因此開漏輸出模式是不能用來輸入的。
? ? 開漏輸出結構沒有內部上拉,因此在實際應用時通常都要外接合適的上拉電阻(通常采用4.7~10kΩ)。開漏輸出能夠方便地實現“線與”邏輯功能,即多個開漏的管腳可以直接并在一起(不需要緩沖隔離)使用,并統一外接一個合適的上拉電阻,就自然形成“邏輯與”關系。開漏輸出的另一種用途是能夠方便地實現不同邏輯電平之間的轉換(如3.3V到5V之間),只需外接一個上拉電阻,而不需要額外的轉換電路。典型的應用例子就是基于開漏電氣連接的I2C總線。
? ? 4. 鉗位二極管
? ? GPIO內部具有鉗位保護二極管,如圖1.4所示。其作用是防止從外部管腳Pin輸入的電壓過高或者過低。VDD正常供電是3.3V,如果從Pin輸入的信號(假設任何輸入信號都有一定的內阻)電壓超過VDD加上二極管D1的導通壓降(假定在0.6V左右),則二極管D1導通,會把多于的電流引到VDD,而真正輸入到內部的信號電壓不會超過3.9V。同理,如果從Pin輸入的信號電壓比GND還低,則由于二極管D2的作用,會把實際輸入內部的信號電壓鉗制在-0.6V左右。
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 2012-6-25 11:00:58 上傳 下載附件 (11.59 KB)
圖1.4 GPIO鉗位二極管示意圖
? ? 假設VDD=3.3V,GPIO設置在開漏模式下,外接10kΩ上拉電阻連接到5V電源,在輸出“1”時,我們通過測量發現:GPIO管腳上的電壓并不會達到5V,而是在4V上下,這正是內部鉗位二極管在起作用。雖然輸出電壓達不到滿幅的5V,但對于實際的數字邏輯通常3.5V以上就算是高電平了(armjishu.com)。
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 2012-6-25 11:00:58 上傳 下載附件 (21.79 KB)
圖1.5 解決開漏模式上拉電壓不足的方法
? ???如果確實想進一步提高輸出電壓,一種簡單的做法是先在GPIO管腳上串聯一只二極管(如1N4148),然后再接上拉電阻。參見圖1.5,框內是芯片內部電路。向管腳寫“1”時,T1關閉,在Pin處得到的電壓是3.3+VD1+VD3=4.5V,電壓提升效果明顯;向管腳寫“0”時,T1導通,在Pin處得到的電壓是VD3=0.6V,仍屬低電平
漏極開路的分析
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 2012-6-25 11:00:58 上傳 下載附件 (35.29 KB)
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 2012-6-25 11:00:58 上傳 下載附件 (19.67 KB)
電力場效應管又名電力場效應晶體管分為結型和絕緣柵型,通常主要指絕緣柵型中的MOS型(Metal Oxide Semiconductor FET),簡稱電力MOSFET(Power MOSFET),結型電力場效應晶體管一般稱作靜電感應晶體管(Static Induction Transistor——SIT)。
? ?A:我們先來說說集電極開路輸出的結構。集電極開路輸出的結構如圖1所示,右邊的那個三極管集電極什么都不接,所以叫做集電極開路(左邊的三極管為反相之用,使輸入為“0”時,輸出也為“0”)。對于圖1,當左端的輸入為“0”時,前面的三極管截止(即集電極C跟發射極E之間相當于斷開),所以5V電源通過1K電阻加到右邊的三極管上,右邊的三極管導通(即相當于一個開關閉合);當左端的輸入為“1”時,前面的三極管導通,而后面的三極管截止(相當于開關斷開)。
我們將圖1簡化成圖2的樣子。圖2中的開關受軟件控制,“1”時斷開,“0”時閉合。很明顯可以看出,當開關閉合時,輸出直接接地,所以輸出電平為0。而當開關斷開時,則輸出端懸空了,即高阻態。這時電平狀態未知,如果后面一個電阻負載(即使很輕的負載)到地,那么輸出端的電平就被這個負載拉到低電平了,所以這個電路是不能輸出高電平的。
再看圖三。圖三中那個1K的電阻即是上拉電阻。如果開關閉合,則有電流從1K電阻及開關上流過,但由于開關閉和時電阻為0(方便我們的討論,實際情況中開關電阻不為0,另外對于三極管還存在飽和壓降),所以在開關上的電壓為0,即輸出電平為0。如果開關斷開,則由于開關電阻為無窮大(同上,不考慮實際中的漏電流),所以流過的電流為0,因此在1K電阻上的壓降也為0,所以輸出端的電壓就是5V了,這樣就能輸出高電平了。但是這個輸出的內阻是比較大的(即1KΩ),如果接一個電阻為R的負載,通過分壓計算,就可以算得最后的輸出電壓為5*R/(R+1000)伏,即5/(1+1000/R)伏。所以,如果要達到一定的電壓的話,R就不能太小。如果R真的太小,而導致輸出電壓不夠的話,那我們只有通過減小那個1K的上拉電阻來增加驅動能力。但是,上拉電阻又不能取得太小,因為當開關閉合時,將產生電流,由于開關能流過的電流是有限的,因此限制了上拉電阻的取值,另外還需要考慮到,當輸出低電平時,負載可能還會給提供一部分電流從開關流過,因此要綜合這些電流考慮來選擇合適的上拉電阻。
如果我們將一個讀數據用的輸入端接在輸出端,這樣就是一個IO口了(51的IO口就是這樣的結構,其中P0口內部不帶上拉,而其它三個口帶內部上拉),當我們要使用輸入功能時,只要將輸出口設置為1即可,這樣就相當于那個開關斷開,而對于P0口來說,就是高阻態了。
對于漏極開路(OD)輸出,跟集電極開路輸出是十分類似的。將上面的三極管換成場效應管即可。這樣集電極就變成了漏極,OC就變成了OD,原理分析是一樣的。
另一種輸出結構是推挽輸出。推挽輸出的結構就是把上面的上拉電阻也換成一個開關,當要輸出高電平時,上面的開關通,下面的開關斷;而要輸出低電平時,則剛好相反。比起OC或者OD來說,這樣的推挽結構高、低電平驅動能力都很強。如果兩個輸出不同電平的輸出口接在一起的話,就會產生很大的電流,有可能將輸出口燒壞。而上面說的OC或OD輸出則不會有這樣的情況,因為上拉電阻提供的電流比較小。如果是推挽輸出的要設置為高阻態時,則兩個開關必須同時斷開(或者在輸出口上使用一個傳輸門),這樣可作為輸入狀態,AVR單片機的一些IO口就是這種結構。
2012-6-25 11:00:59 上傳 下載附件 (18.71 KB)
在平時的電路設計時我們會遇到開漏(open drain)和開集(open collector)的概念,可能大家在念書時就知道其基本的用法,而且在設計中也并未遇到過問題。但是我忽然覺得自己也對這個概念了解的并不系統。于是進行了以下總結: 所謂開漏電路的概念里提到的“漏”就是指MOS FET的漏極,同理,開集電路中的“集”就是指三極管的集電極,開漏電路就是指以MOS FET的漏極為輸出的電路。一般的常規用法是會在漏極外部的電路添加一個上拉電阻。完整的開漏電路應該由開漏器件和開漏的上拉電阻組成。如下圖中所示:
2012-6-25 11:00:59 上傳 下載附件 (15.79 KB)
組成開漏形式的電路有以下幾個特點:
1. 利用外部電路的驅動能力,減少IC內部的驅動。當IC內部MOSFET導通時,驅動電流是從外部的VCC流經R pull-up ,MOSFET到GND。IC內部僅需很下的柵極驅動電流。如圖1。
2. 可以將多個開漏輸出的Pin,連接到一條線上。形成“與邏輯”關系。如圖1,當PIN_A、PIN_B、PIN_C任意一個變低后,開漏線上的邏輯就為0了。這也是I2C,SMBus等總線判斷總線占用狀態的原理。
3. 可以利用改變上拉電源的電壓,改變傳輸電平。如圖2, IC的邏輯電平由電源Vcc1決定,而輸出高電平則由Vcc2決定。這樣我們就可以用低電平邏輯控制輸出高電平邏輯了。
4. 開漏Pin不連接外部的上拉電阻,則只能輸出低電平。
5. 標準的開漏腳一般只有輸出的能力。添加其它的判斷電路,才能具備雙向輸入、輸出的能力。
應用中需注意:
1. 開漏和開集的原理類似,在許多應用中我們利用開集電路代替開漏電路。例如,某輸入Pin要求由開漏電路驅動。則我們常見的驅動方式是利用一個三極管組成開集電路來驅動它,即方便又節省成本。如圖3。
2012-6-25 11:00:59 上傳 下載附件 (10.47 KB)
2. 上拉電阻R pull-up的阻值決定了邏輯電平轉換的沿的速度。阻值越大,速度越低功耗越小。反之亦然!
2012-6-25 11:00:59 上傳 下載附件 (7.57 KB)
GPIO配置
(1)GPIO_Mode_AIN 模擬輸入 ? ???
(2)GPIO_Mode_IN_FLOATING 浮空輸入
(3)GPIO_Mode_IPD 下拉輸入
(4)GPIO_Mode_IPU 上拉輸入
這三種輸入電路是用那一種,要根據外圍電路來決定。
所謂高阻,可以簡單理解為輸出端處于浮空狀態(沒有電流流動),其電平隨外部電平高低而定,即門電路放棄對輸出端電路的控制。而上拉就是將不確定的信號通過一個電阻嵌位在高電平,電阻同時起限流作用。下拉同理,只不過上拉是對器件注入電流,下拉是輸出電流。至于弱上拉和強上拉,只是上拉電阻的阻值不同,沒有什么嚴格區分。簡言之,上拉就是在端口沒有輸入的情況下,將端口的電平穩定在高電平。
(5)GPIO_Mode_Out_OD 開漏輸出
(6)GPIO_Mode_Out_PP 推挽輸出
(7)GPIO_Mode_AF_OD 復用開漏輸出
(8)GPIO_Mode_AF_PP 復用推挽輸出
GPIO_Speed_10MHz 最高輸出速率10MHz
GPIO_Speed_2MHz 最高輸出速率2MHz
GPIO_Speed_50MHz 最高輸出速率50MHz
1.1I/O口的輸出模式下,有3種輸出速度可選(2MHz、10MHz和50MHz),這個速度是指I/O口驅動電路的響應速度而不是輸出信號的速度,輸出信號的速度與程序有關(芯片內部在I/O口 的輸出部分安排了多個響應速度不同的輸出驅動電路,用戶可以根據自己的需要選擇合適的驅動電路)。通過選擇速度來選擇不同的輸出驅動模塊,達到最佳的噪聲 控制和降低功耗的目的。高頻的驅動電路,噪聲也高,當不需要高的輸出頻率時,請選用低頻驅動電路,這樣非常有利于提高系統的EMI性能。當然如果要輸出較高頻率的信號,但卻選用了較低頻率的驅動模塊,很可能會得到失真的輸出信號。
關鍵是GPIO的引腳速度跟應用匹配(推薦10倍以上?)。比如:
? 對于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引腳速度就夠了,既省電也噪聲小。
? 對于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引腳速度或許不夠,這時可以選用10M的GPIO引腳速度。
? 對于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引腳速度顯然不夠了,需要選用50M的GPIO的引腳速度。
1.2 GPIO口設為輸入時,輸出驅動電路與端口是斷開,所以輸出速度配置無意義。
1.3在復位期間和剛復位后,復用功能未開啟,I/O端口被配置成浮空輸入模式。
1.4所有端口都有外部中斷能力。為了使用外部中斷線,端口必須配置成輸入模式。
1.5GPIO口的配置具有上鎖功能,當配置好GPIO口后,可以通過程序鎖住配置組合,直到下次芯片復位才能解鎖。
2、推挽輸出與開漏輸出的區別
? ?? ???推挽輸出:可以輸出高,低電平,連接數字器件;開漏輸出:輸出端相當于三極管的集電極. 要得到高電平狀態需要上拉電阻才行. 適合于做電流型的驅動,其吸收電流的能力相對強(一般20ma以內).
? ? 推挽結構一般是指兩個三極管分別受兩互補信號的控制,總是在一個三極管導通的時候另一個截止.
? ? 要實現 線與 需要用OC(open collector)門電路.是兩個參數相同的三極管或MOSFET,以推挽方式存在于電路中,各負責正負半周的波形放大任務,電路工作時,兩只對稱的功率開關管每次只有一個導通,所以導通損耗小,效率高。輸出既可以向負載灌電流,也可以從負載抽取電流
2012-6-25 11:00:59 上傳 下載附件 (37.77 KB)
當端口配置為輸出時:
? ???開漏模式:輸出 0 時,N-MOS 導通,P-MOS 不被激活,輸出0。
? ?? ?? ?? ?? ?? ?? ? 輸出 1 時,N-MOS 高阻, P-MOS 不被激活,輸出1(需要外部上拉電路);此模式可以把端口作為雙向IO使用。
? ? 推挽模式:輸出 0 時,N-MOS 導通,P-MOS 高阻 ,輸出0。
? ?? ?? ?? ?? ?? ?? ?輸出 1 時,N-MOS 高阻,P-MOS 導通,輸出1(不需要外部上拉電路)。
簡單來說開漏是0的時候接GND 1的時候浮空 推挽是0的時候接GND 1的時候接VCC
3、在STM32中選用IO模式
(1) 浮空輸入_IN_FLOATING —浮空輸入,可以做KEY識別,RX1
? ?(2)帶上拉輸入_IPU—IO內部上拉電阻輸入
(3)帶下拉輸入_IPD—IO內部下拉電阻輸入? ?? ?? ?
(4) 模擬輸入_AIN —應用ADC模擬輸入,或者低功耗下省電。
(5)開漏輸出_OUT_OD —IO輸出0接GND,IO輸出1,懸空,需要外接上拉電阻,才能實現輸出高電平。當輸出為1時,IO口的狀態由上拉電阻拉高電平,但由于是開漏輸出模式,這樣IO口也就可以由外部電路改變為低電平或不變 ??梢宰xIO輸入電平變化,實現C51的IO雙向功能。
??(6)推挽輸出_OUT_PP ——IO輸出0-接GND, IO輸出1 -接VCC,讀輸入值是未知的。
(7)復用功能的推挽輸出_AF_PP ——片內外設功能(I2C的SCL,SDA)
(8)復用功能的開漏輸出_AF_OD——片內外設功能(TX1,MOSI,MISO.SCK.SS)
實例總結:
(1)模擬I2C使用開漏輸出_OUT_OD,接上拉電阻,能夠正確輸出0和1;讀值時先
GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以讀IO的值;使用
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
(2)如果是無上拉電阻,IO默認是高電平;需要讀取IO的值,可以使用
帶上拉輸入_IPU和浮空輸入_IN_FLOATING和 開漏輸出_OUT_OD;
4、IO低功耗:
關于模擬輸入&低功耗,根據STM32的低功耗AN(AN2629)及其源文件,在STOP模式下,為了得到盡量低的功耗,確實把所有的IO(包括非A/D輸入的GPIO)都設置為模擬輸入
總結
以上是生活随笔為你收集整理的对通用输入输出GPIO的深入理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windbg调试dump文件_dump是
- 下一篇: idea2021.11激活码_最新在线免