STM32GPIO口8種模式細緻分析(類比51單片機)

關於STM32GPIO口的8種工作模式,我們先引出一些問題?

STM32GPIO口如果既要輸入又要輸出怎麼辦?

1、浮空輸入模式

 

 

上圖紅色的表示便是浮空輸入的過程,外部輸入時0讀出的就是0,外部輸入時1讀出的就是1,外部沒有輸入IO處於阻塞讀不出電平狀態。

用處:感覺在信號處理方面用的比較好,比如在讀取一段一段的波形,可以清晰的知道什麼時候是0信號,什麼時候是1信號,什麼時候是沒有信號的

類比:51單片機找不到類似的輸入模式

 

2、上拉輸入

 

上拉輸入和浮空輸入的區別是,上拉電阻的開關關閉了,如上圖所示。IO沒有輸入的時候IO電平等於VDD1電平,當然IO輸入低電平的事就是VDDIO口形成一個閉環電路,根據分壓法IO口出分擔的電壓爲0當然IO輸入爲1IO口電壓和VDD相等,上拉電阻好比斷開了,IO口的電壓還是0

 

用處:在按鍵使用的時候特別適用,按鍵的一端接地,一端接IO口,當按鍵沒有按下的時候電平爲高電平,當按鍵按下的時候IO是低電平。

 

類比:51單片機P1 P2 P3口就是上拉輸入的,大家可以回憶一下51單片機的按鍵操作,我們應該知道51單片機除了P0口內部沒有上拉電阻其他的IO都有上拉電阻。大家應該明白了51單片機沒有按鍵的時候,我們讀到的事高電平了吧!!

 

小計:

上拉輸入,不管輸入1還是不輸入IO的電平都是1,輸入0IO口的電平是0

PS按鍵是共地還是共VCC選擇的時候要慎重


3下拉輸入

 

 

下拉輸入和上拉輸入的區別是,上拉電阻的開關打開了了,下拉電阻的開關關閉;了。如上圖所示。IO沒有輸入的時候IO電平等於VSS0電平,當IO輸入高電平的時候IO口就和VSS組成一個閉合電路,根據分壓法,電壓都分擔到了電阻上,所以IO口電平爲高電平。當然IO輸入爲低電平的時候IO口肯定是低電平。 

用處:在按鍵使用的時候特別適用,按鍵的一端接VCC,一端接IO口,當按鍵沒有按下的時候電平爲低電平,當按鍵按下的時候IO是高電平電平。

 

類比:51單片機沒有類似的IO口 

 

PS按鍵是共地還是共VCC選擇的時候要慎重

 

4、模擬輸入

 

模擬輸入,大家看上圖的紅色的標示。模擬輸入和其他輸入最大的區別

1、 沒有連接TTL觸發器,這樣保留最原始的電壓值,不是轉換過後的01信號

2、 數據連接的終點不一樣,其他的輸入我們都是讀取輸入寄存器的值,而模擬輸入,數據直接送到片上外設,一般是ADC

 


 下面就是輸出類型了

1、 推輓輸出

2、 開漏輸出

3、 複用推輓輸出

4、 複用開漏輸出

 


1、推輓輸出

 


上圖就是就是推輓輸出的過程。上圖標示的“2”便是我們的輸出寄存器,我們可以寫入1或者0,如果寫入1,圖上的“3”上面的P-mos導通,N-mos截止,IO口等價直接連接在VDD上,所以IO口電平是高電平。同理輸出寄存器的值爲0時,P-mos截止,N-mos導通。IO口直接連接在VSS上,所有IO口電平爲低電平。

大家可能會問圖上標的1是什麼?其實1的寄存器就是間接向輸出寄存器寫入。好處是有的,大家自己百度哈!!

 

用處:適合做一些開關控制,應爲推輓輸出可以快速的切換01,例如繼電器,led

 

類比:51單片機沒有類似的IO

 


3、 開漏輸出

 

上圖紅色標示便是開漏輸出的過程圖,圖上12的標示已經在推輓輸出中介紹了,此處不再說明。開漏輸出與推輓輸出唯一的區別就是開漏輸出只有一個N-mos管。當輸出寄存器的值爲0的時候,n-mos導通,IO口直接連接VSS,輸出爲低電平。當輸出寄存器爲1的時候,n-mos截止,IO口直接和輸出端斷開了,處於浮空狀態。電平狀態不可控制。

大家可能會說,這樣設計不是傻缺麼?有什麼用設計這種輸出方式。其實這種方式很有用的,請看下面的類比

類比:

我們都知道51單片機PO口,是不是想到什麼了?PO口就是類似的開漏輸出, PO口作爲輸出的時候一定要加上拉電阻,加上上拉電阻後,輸入寄存器爲1的時候,n-mos截止截止了,好比IO和輸出端斷開,這是IO口點壓就等於上拉電阻的電壓。這樣變輸出了高電平,如果IO口的高電平,連接到了外設低電平的,就會產生電流,電流不會流到IO口,(N-mos管截止了)直接流到外設。是不是增大了驅動能力了。(IO口的驅動能力有限,不能容忍大電流)。

通過改變上拉電阻的大小和電壓就能完成很多功能。

 


4、 複用(推輓和開漏)輸出


複用

 

複用推輓\開漏和(推輓\開漏輸出)區別在於起點不一樣,複用輸出來源片上外設,比如IICSPI等。相信大家已經可以理解了,不做解釋了。

 

 

大家是不是覺得8中模式都會了呢?我一開始的問題GPIO輸入和輸出之間的影響?

 

當我們設置爲輸入模式的時候,看上圖“1”和“2”是線與的關係,如何你想要“1”對我們的輸入沒有影響,要麼要“1”斷開,要麼讓“1”高電平。比如鍵盤檢測的時候,如何“1”是低電平的話。那麼輸入端會一直是低電平。我的開開發板PC5是鍵盤,如何我對輸出端不做任何處理的話,即使我PC5輸入設爲上拉輸入,輸入寄存器一直是0。如果直接給ODR寄存器置1我的問題就解決了。

問題我沒有設置PC5的輸出模式,直接給輸出寄存器置1IO口的輸出端是什麼情況?STM32有沒有默認的輸出方式,這個要看輸出寄存器復位的時候的值,來判斷他的工作模式。。總之爲了保險起見,應把輸出寄存器置1。就和我們用51單片機IO作爲輸入的時候一定要先置一,一般系統復位後都是一。

 

當我們設置爲輸出模式的時候,我們能不能讀取數據(不設置輸入模式),當我們設置爲開漏模式的時候,外接上拉電阻過後,我們不用設置輸入模式就可以讀取IO的電平了。這個是唯一的全雙工的方式,除了複用功能外。我猜想默認輸入應該是浮空輸入。

 

哈哈其實GPIOx_CRX復位後值是0x44444444,即默認的輸入是浮空輸入模式,輸出是推輓輸出 !!

發佈了10 篇原創文章 · 獲贊 214 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章