日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对通用输入输出GPIO的深入理解

發(fā)布時間:2023/12/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对通用输入输出GPIO的深入理解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

GPIO的各種模式
? ? GPIO管腳可以被配置為多種工作模式,其中有3種比較常用:高阻輸入、推挽輸出、開漏輸出
? ? 1. 高阻輸入(Input)


? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 2012-6-25 11:00:57 上傳 下載附件 (8.61 KB)

圖1.1 GPIO高阻輸入模式結(jié)構(gòu)示意圖

? ?為減少信息傳輸線的數(shù)目,大多數(shù)計算機中的信息傳輸線采用總線形式,即凡要傳輸?shù)耐愋畔⒍荚谕唤M傳輸線,且信息是分時傳送的。在計算機中一般有三組總線,即數(shù)據(jù)總線、地址總線和控制總線。為防止信息相互干擾,要求凡掛到總線上的寄存器或存儲器等,它的輸入輸出端不僅能呈現(xiàn)0、1兩個信息狀態(tài),而且還應(yīng)能呈現(xiàn)第三個狀態(tài)----高阻抗狀態(tài),即此時好像它們的輸出被開關(guān)斷開,對總線狀態(tài)不起作用,此時總線可由其他器件占用。三態(tài)緩沖器即可實現(xiàn)上述功能,它除具有輸入輸出端之外,還有一控制端。
? ?如圖1.1所示,為GPIO管腳在高阻輸入模式下的等效結(jié)構(gòu)示意圖。這是一個管腳的情況,其它管腳的結(jié)構(gòu)也是同樣的。輸入模式的結(jié)構(gòu)比較簡單,就是一個帶有施密特觸發(fā)輸入(Schmitt-triggered input)的三態(tài)緩沖器(U1),并具有很高的輸入等效阻抗。施密特觸發(fā)輸入的作用是能將緩慢變化的或者是畸變的輸入脈沖信號整形成比較理想的矩形脈沖信號。執(zhí)行GPIO管腳讀操作時,在讀脈沖(Read Pulse)的作用下會把管腳(Pin)的當前電平狀態(tài)讀到內(nèi)部總線上(Internal Bus)。在不執(zhí)行讀操作時,外部管腳與內(nèi)部總線之間是隔離的。

? ? 2. 推挽輸出(Output)

? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 2012-6-25 11:00:58 上傳 下載附件 (18.4 KB)

圖1.2 GPIO推挽輸出模式結(jié)構(gòu)示意圖


? ???推挽輸出原理:在功率放大器電路中大量采用推挽放大器電路,這種電路中用兩只三極管構(gòu)成一級放大器電路,兩只三極管分別放大輸入信號的正半周和負半周,即用一只三極管放大信號的正半周,用另一只三極管放大信號的負半周,兩只三極管輸出的半周信號在放大器負載上合并后得到一個完整周期的輸出信號。
  推挽放大器電路中,一只三極管工作在導通、放大狀態(tài)時,另一只三極管處于截止狀態(tài),當輸入信號變化到另一個半周后,原先導通、放大的三極管進入截止,而原先截止的三極管進入導通、放大狀態(tài),兩只三極管在不斷地交替導通放大和截止變化,所以稱為推挽放大器(armjishu.com)。
? ?? ? 如圖1.2所示,為GPIO管腳在推挽輸出模式下的等效結(jié)構(gòu)示意圖。U1是輸出鎖存器,執(zhí)行GPIO管腳寫操作時,在寫脈沖(Write Pulse)的作用下,數(shù)據(jù)被鎖存到Q和/Q。T1和T2構(gòu)成CMOS反相器,T1導通或T2導通時都表現(xiàn)出較低的阻抗,但T1和T2不會同時導通或同時關(guān)閉,最后形成的是推挽輸出。在推挽輸出模式下,GPIO還具有回讀功能,實現(xiàn)回讀功能的是一個簡單的三態(tài)門U2。注意:執(zhí)行回讀功能時,讀到的是管腳的輸出鎖存狀態(tài),而不是外部管腳Pin的狀態(tài)。

? ? 3. 開漏輸出(OutputOD)


? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 2012-6-25 11:00:58 上傳 下載附件 (16.73 KB)

圖1.3 GPIO開漏輸出結(jié)構(gòu)示意圖

? ???如圖1.3所示,為GPIO管腳在開漏輸出模式下的等效結(jié)構(gòu)示意圖。開漏輸出和推挽輸出相比結(jié)構(gòu)基本相同,但只有下拉晶體管T1而沒有上拉晶體管。同樣,T1實際上也是多組可編程選擇的晶體管。開漏輸出的實際作用就是一個開關(guān),輸出“1”時斷開、輸出“0”時連接到GND(有一定內(nèi)阻)。回讀功能:讀到的仍是輸出鎖存器的狀態(tài),而不是外部管腳Pin的狀態(tài)。因此開漏輸出模式是不能用來輸入的。
? ? 開漏輸出結(jié)構(gòu)沒有內(nèi)部上拉,因此在實際應(yīng)用時通常都要外接合適的上拉電阻(通常采用4.7~10kΩ)。開漏輸出能夠方便地實現(xiàn)“線與”邏輯功能,即多個開漏的管腳可以直接并在一起(不需要緩沖隔離)使用,并統(tǒng)一外接一個合適的上拉電阻,就自然形成“邏輯與”關(guān)系。開漏輸出的另一種用途是能夠方便地實現(xiàn)不同邏輯電平之間的轉(zhuǎn)換(如3.3V到5V之間),只需外接一個上拉電阻,而不需要額外的轉(zhuǎn)換電路。典型的應(yīng)用例子就是基于開漏電氣連接的I2C總線。

? ? 4. 鉗位二極管
? ? GPIO內(nèi)部具有鉗位保護二極管,如圖1.4所示。其作用是防止從外部管腳Pin輸入的電壓過高或者過低。VDD正常供電是3.3V,如果從Pin輸入的信號(假設(shè)任何輸入信號都有一定的內(nèi)阻)電壓超過VDD加上二極管D1的導通壓降(假定在0.6V左右),則二極管D1導通,會把多于的電流引到VDD,而真正輸入到內(nèi)部的信號電壓不會超過3.9V。同理,如果從Pin輸入的信號電壓比GND還低,則由于二極管D2的作用,會把實際輸入內(nèi)部的信號電壓鉗制在-0.6V左右。


? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 2012-6-25 11:00:58 上傳 下載附件 (11.59 KB)

圖1.4 GPIO鉗位二極管示意圖

? ? 假設(shè)VDD=3.3V,GPIO設(shè)置在開漏模式下,外接10kΩ上拉電阻連接到5V電源,在輸出“1”時,我們通過測量發(fā)現(xiàn):GPIO管腳上的電壓并不會達到5V,而是在4V上下,這正是內(nèi)部鉗位二極管在起作用。雖然輸出電壓達不到滿幅的5V,但對于實際的數(shù)字邏輯通常3.5V以上就算是高電平了(armjishu.com)。



? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 2012-6-25 11:00:58 上傳 下載附件 (21.79 KB)

圖1.5 解決開漏模式上拉電壓不足的方法
? ???如果確實想進一步提高輸出電壓,一種簡單的做法是先在GPIO管腳上串聯(lián)一只二極管(如1N4148),然后再接上拉電阻。參見圖1.5,框內(nèi)是芯片內(nèi)部電路。向管腳寫“1”時,T1關(guān)閉,在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)

電力場效應(yīng)管又名電力場效應(yīng)晶體管分為結(jié)型和絕緣柵型,通常主要指絕緣柵型中的MOS型(Metal Oxide Semiconductor FET),簡稱電力MOSFETPower MOSFET),結(jié)型電力場效應(yīng)晶體管一般稱作靜電感應(yīng)晶體管(Static Induction Transistor——SIT)。

? ?A:我們先來說說集電極開路輸出的結(jié)構(gòu)。集電極開路輸出的結(jié)構(gòu)如圖1所示,右邊的那個三極管集電極什么都不接,所以叫做集電極開路(左邊的三極管為反相之用,使輸入為“0”時,輸出也為“0”)。對于圖1,當左端的輸入為“0”時,前面的三極管截止(即集電極C跟發(fā)射極E之間相當于斷開),所以5V電源通過1K電阻加到右邊的三極管上,右邊的三極管導通(即相當于一個開關(guān)閉合);當左端的輸入為“1”時,前面的三極管導通,而后面的三極管截止(相當于開關(guān)斷開)。

我們將圖1簡化成圖2的樣子。圖2中的開關(guān)受軟件控制,“1”時斷開,“0”時閉合。很明顯可以看出,當開關(guān)閉合時,輸出直接接地,所以輸出電平為0。而當開關(guān)斷開時,則輸出端懸空了,即高阻態(tài)。這時電平狀態(tài)未知,如果后面一個電阻負載(即使很輕的負載)到地,那么輸出端的電平就被這個負載拉到低電平了,所以這個電路是不能輸出高電平的。

再看圖三。圖三中那個1K的電阻即是上拉電阻。如果開關(guān)閉合,則有電流從1K電阻及開關(guān)上流過,但由于開關(guān)閉和時電阻為0(方便我們的討論,實際情況中開關(guān)電阻不為0,另外對于三極管還存在飽和壓降),所以在開關(guān)上的電壓為0,即輸出電平為0。如果開關(guān)斷開,則由于開關(guān)電阻為無窮大(同上,不考慮實際中的漏電流),所以流過的電流為0,因此在1K電阻上的壓降也為0,所以輸出端的電壓就是5V了,這樣就能輸出高電平了。但是這個輸出的內(nèi)阻是比較大的(即1KΩ),如果接一個電阻為R的負載,通過分壓計算,就可以算得最后的輸出電壓為5*R/(R+1000)伏,即5/(1+1000/R)伏。所以,如果要達到一定的電壓的話,R就不能太小。如果R真的太小,而導致輸出電壓不夠的話,那我們只有通過減小那個1K的上拉電阻來增加驅(qū)動能力。但是,上拉電阻又不能取得太小,因為當開關(guān)閉合時,將產(chǎn)生電流,由于開關(guān)能流過的電流是有限的,因此限制了上拉電阻的取值,另外還需要考慮到,當輸出低電平時,負載可能還會給提供一部分電流從開關(guān)流過,因此要綜合這些電流考慮來選擇合適的上拉電阻。

如果我們將一個讀數(shù)據(jù)用的輸入端接在輸出端,這樣就是一個IO口了(51IO口就是這樣的結(jié)構(gòu),其中P0口內(nèi)部不帶上拉,而其它三個口帶內(nèi)部上拉),當我們要使用輸入功能時,只要將輸出口設(shè)置為1即可,這樣就相當于那個開關(guān)斷開,而對于P0口來說,就是高阻態(tài)了。

對于漏極開路(OD)輸出,跟集電極開路輸出是十分類似的。將上面的三極管換成場效應(yīng)管即可。這樣集電極就變成了漏極,OC就變成了OD,原理分析是一樣的。

另一種輸出結(jié)構(gòu)是推挽輸出。推挽輸出的結(jié)構(gòu)就是把上面的上拉電阻也換成一個開關(guān),當要輸出高電平時,上面的開關(guān)通,下面的開關(guān)斷;而要輸出低電平時,則剛好相反。比起OC或者OD來說,這樣的推挽結(jié)構(gòu)高、低電平驅(qū)動能力都很強。如果兩個輸出不同電平的輸出口接在一起的話,就會產(chǎn)生很大的電流,有可能將輸出口燒壞。而上面說的OCOD輸出則不會有這樣的情況,因為上拉電阻提供的電流比較小。如果是推挽輸出的要設(shè)置為高阻態(tài)時,則兩個開關(guān)必須同時斷開(或者在輸出口上使用一個傳輸門),這樣可作為輸入狀態(tài),AVR單片機的一些IO口就是這種結(jié)構(gòu)。


2012-6-25 11:00:59 上傳 下載附件 (18.71 KB)

在平時的電路設(shè)計時我們會遇到開漏(open drain)和開集(open collector)的概念,可能大家在念書時就知道其基本的用法,而且在設(shè)計中也并未遇到過問題。但是我忽然覺得自己也對這個概念了解的并不系統(tǒng)。于是進行了以下總結(jié): 所謂開漏電路的概念里提到的“漏”就是指MOS FET的漏極,同理,開集電路中的“集”就是指三極管的集電極,開漏電路就是指以MOS FET的漏極為輸出的電路。一般的常規(guī)用法是會在漏極外部的電路添加一個上拉電阻。完整的開漏電路應(yīng)該由開漏器件和開漏的上拉電阻組成。如下圖中所示:


2012-6-25 11:00:59 上傳 下載附件 (15.79 KB)

組成開漏形式的電路有以下幾個特點:

1. 利用外部電路的驅(qū)動能力,減少IC內(nèi)部的驅(qū)動。當IC內(nèi)部MOSFET導通時,驅(qū)動電流是從外部的VCC流經(jīng)R pull-up MOSFETGNDIC內(nèi)部僅需很下的柵極驅(qū)動電流。如圖1

2. 可以將多個開漏輸出的Pin,連接到一條線上。形成“與邏輯”關(guān)系。如圖1,當PIN_APIN_BPIN_C任意一個變低后,開漏線上的邏輯就為0了。這也是I2CSMBus等總線判斷總線占用狀態(tài)的原理。

3. 可以利用改變上拉電源的電壓,改變傳輸電平。如圖2, IC的邏輯電平由電源Vcc1決定,而輸出高電平則由Vcc2決定。這樣我們就可以用低電平邏輯控制輸出高電平邏輯了。

4. 開漏Pin不連接外部的上拉電阻,則只能輸出低電平。

5. 標準的開漏腳一般只有輸出的能力。添加其它的判斷電路,才能具備雙向輸入、輸出的能力。

應(yīng)用中需注意:

1. 開漏和開集的原理類似,在許多應(yīng)用中我們利用開集電路代替開漏電路。例如,某輸入Pin要求由開漏電路驅(qū)動。則我們常見的驅(qū)動方式是利用一個三極管組成開集電路來驅(qū)動它,即方便又節(jié)省成本。如圖3


2012-6-25 11:00:59 上傳 下載附件 (10.47 KB)

2. 上拉電阻R pull-up的阻值決定了邏輯電平轉(zhuǎn)換的沿的速度。阻值越大,速度越低功耗越小。反之亦然!


2012-6-25 11:00:59 上傳 下載附件 (7.57 KB)

GPIO配置

1GPIO_Mode_AIN 模擬輸入 ? ???

2GPIO_Mode_IN_FLOATING 浮空輸入

3GPIO_Mode_IPD 下拉輸入

4GPIO_Mode_IPU 上拉輸入

這三種輸入電路是用那一種,要根據(jù)外圍電路來決定。

所謂高阻,可以簡單理解為輸出端處于浮空狀態(tài)(沒有電流流動),其電平隨外部電平高低而定,即門電路放棄對輸出端電路的控制。而上拉就是將不確定的信號通過一個電阻嵌位在高電平,電阻同時起限流作用。下拉同理,只不過上拉是對器件注入電流,下拉是輸出電流。至于弱上拉和強上拉,只是上拉電阻的阻值不同,沒有什么嚴格區(qū)分。簡言之,上拉就是在端口沒有輸入的情況下,將端口的電平穩(wěn)定在高電平。

5GPIO_Mode_Out_OD 開漏輸出

6GPIO_Mode_Out_PP 推挽輸出

7GPIO_Mode_AF_OD 復用開漏輸出

8GPIO_Mode_AF_PP 復用推挽輸出

GPIO_Speed_10MHz 最高輸出速率10MHz

GPIO_Speed_2MHz 最高輸出速率2MHz

GPIO_Speed_50MHz 最高輸出速率50MHz

1.1I/O口的輸出模式下,有3種輸出速度可選(2MHz、10MHz和50MHz),這個速度是指I/O口驅(qū)動電路的響應(yīng)速度而不是輸出信號的速度,輸出信號的速度與程序有關(guān)(芯片內(nèi)部在I/O口 的輸出部分安排了多個響應(yīng)速度不同的輸出驅(qū)動電路,用戶可以根據(jù)自己的需要選擇合適的驅(qū)動電路)。通過選擇速度來選擇不同的輸出驅(qū)動模塊,達到最佳的噪聲 控制和降低功耗的目的。高頻的驅(qū)動電路,噪聲也高,當不需要高的輸出頻率時,請選用低頻驅(qū)動電路,這樣非常有利于提高系統(tǒng)的EMI性能。當然如果要輸出較高頻率的信號,但卻選用了較低頻率的驅(qū)動模塊,很可能會得到失真的輸出信號。

關(guān)鍵是GPIO的引腳速度跟應(yīng)用匹配(推薦10倍以上?)。比如:

? 對于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引腳速度就夠了,既省電也噪聲小。

? 對于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引腳速度或許不夠,這時可以選用10M的GPIO引腳速度。

? 對于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引腳速度顯然不夠了,需要選用50M的GPIO的引腳速度。

1.2 GPIO口設(shè)為輸入時,輸出驅(qū)動電路與端口是斷開,所以輸出速度配置無意義。

1.3在復位期間和剛復位后,復用功能未開啟,I/O端口被配置成浮空輸入模式。

1.4所有端口都有外部中斷能力。為了使用外部中斷線,端口必須配置成輸入模式。

1.5GPIO口的配置具有上鎖功能,當配置好GPIO口后,可以通過程序鎖住配置組合,直到下次芯片復位才能解鎖。

2、推挽輸出與開漏輸出的區(qū)別


? ?? ???推挽輸出:可以輸出高,低電平,連接數(shù)字器件;開漏輸出:輸出端相當于三極管的集電極. 要得到高電平狀態(tài)需要上拉電阻才行. 適合于做電流型的驅(qū)動,其吸收電流的能力相對強(一般20ma以內(nèi)).
? ? 推挽結(jié)構(gòu)一般是指兩個三極管分別受兩互補信號的控制,總是在一個三極管導通的時候另一個截止.
? ? 要實現(xiàn) 線與 需要用OC(open collector)門電路.是兩個參數(shù)相同的三極管或MOSFET,以推挽方式存在于電路中,各負責正負半周的波形放大任務(wù),電路工作時,兩只對稱的功率開關(guān)管每次只有一個導通,所以導通損耗小,效率高。輸出既可以向負載灌電流,也可以從負載抽取電流


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內(nèi)部上拉電阻輸入

(3)帶下拉輸入_IPD—IO內(nèi)部下拉電阻輸入? ?? ?? ?

(4) 模擬輸入_AIN —應(yīng)用ADC模擬輸入,或者低功耗下省電。

(5)開漏輸出_OUT_OD —IO輸出0接GND,IO輸出1,懸空,需要外接上拉電阻,才能實現(xiàn)輸出高電平。當輸出為1時,IO口的狀態(tài)由上拉電阻拉高電平,但由于是開漏輸出模式,這樣IO口也就可以由外部電路改變?yōu)榈碗娖交虿蛔?。可以讀IO輸入電平變化,實現(xiàn)C51的IO雙向功能。

??(6)推挽輸出_OUT_PP ——IO輸出0-接GND, IO輸出1 -接VCC,讀輸入值是未知的。

(7)復用功能的推挽輸出_AF_PP ——片內(nèi)外設(shè)功能(I2C的SCL,SDA)

(8)復用功能的開漏輸出_AF_OD——片內(nèi)外設(shè)功能(TX1,MOSI,MISO.SCK.SS)

實例總結(jié):

(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低功耗:

關(guān)于模擬輸入&低功耗,根據(jù)STM32的低功耗AN(AN2629)及其源文件,在STOP模式下,為了得到盡量低的功耗,確實把所有的IO(包括非A/D輸入的GPIO)都設(shè)置為模擬輸入



總結(jié)

以上是生活随笔為你收集整理的对通用输入输出GPIO的深入理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。