關於STM32GPIO口的8種工作模式,我們先引出一些問題?
STM32GPIO口如果既要輸入又要輸出怎麼辦?
1、浮空輸入模式
上圖紅色的表示便是浮空輸入的過程,外部輸入時0讀出的就是0,外部輸入時1讀出的就是1,外部沒有輸入IO處於阻塞讀不出電平狀態。
用處:感覺在信號處理方面用的比較好,比如在讀取一段一段的波形,可以清晰的知道什麼時候是0信號,什麼時候是1信號,什麼時候是沒有信號的。
類比:51單片機找不到類似的輸入模式
2、上拉輸入
上拉輸入和浮空輸入的區別是,上拉電阻的開關關閉了,如上圖所示。IO沒有輸入的時候,IO電平等於VDD即1電平,當然IO輸入低電平的事就是VDD和IO口形成一個閉環電路,根據分壓法IO口出分擔的電壓爲0。當然IO輸入爲1時,IO口電壓和VDD相等,上拉電阻好比斷開了,IO口的電壓還是0。
用處:在按鍵使用的時候特別適用,按鍵的一端接地,一端接IO口,當按鍵沒有按下的時候電平爲高電平,當按鍵按下的時候IO是低電平。
類比:51單片機P1 P2 P3口就是上拉輸入的,大家可以回憶一下51單片機的按鍵操作,我們應該知道51單片機除了P0口內部沒有上拉電阻其他的IO都有上拉電阻。大家應該明白了51單片機沒有按鍵的時候,我們讀到的事高電平了吧!!
小計:
上拉輸入,不管輸入1還是不輸入IO的電平都是1,輸入0是IO口的電平是0
PS按鍵是共地還是共VCC選擇的時候要慎重
3、下拉輸入
下拉輸入和上拉輸入的區別是,上拉電阻的開關打開了了,下拉電阻的開關關閉;了。如上圖所示。IO沒有輸入的時候,IO電平等於VSS即0電平,當IO輸入高電平的時候IO口就和VSS組成一個閉合電路,根據分壓法,電壓都分擔到了電阻上,所以IO口電平爲高電平。當然IO輸入爲低電平的時候,IO口肯定是低電平。
用處:在按鍵使用的時候特別適用,按鍵的一端接VCC,一端接IO口,當按鍵沒有按下的時候電平爲低電平,當按鍵按下的時候IO是高電平電平。
類比:51單片機沒有類似的IO口
PS按鍵是共地還是共VCC選擇的時候要慎重
4、模擬輸入
模擬輸入,大家看上圖的紅色的標示。模擬輸入和其他輸入最大的區別
1、 沒有連接TTL觸發器,這樣保留最原始的電壓值,不是轉換過後的0和1信號
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的寄存器就是間接向輸出寄存器寫入。好處是有的,大家自己百度哈!!
用處:適合做一些開關控制,應爲推輓輸出可以快速的切換0和1,例如繼電器,led等
類比:51單片機沒有類似的IO口
3、 開漏輸出
上圖紅色標示便是開漏輸出的過程圖,圖上1和2的標示已經在推輓輸出中介紹了,此處不再說明。開漏輸出與推輓輸出唯一的區別就是開漏輸出只有一個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、 複用(推輓和開漏)輸出
複用
複用推輓\開漏和(推輓\開漏輸出)區別在於起點不一樣,複用輸出來源片上外設,比如IIC,SPI等。相信大家已經可以理解了,不做解釋了。
大家是不是覺得8中模式都會了呢?我一開始的問題GPIO輸入和輸出之間的影響?
當我們設置爲輸入模式的時候,看上圖“1”和“2”是線與的關係,如何你想要“1”對我們的輸入沒有影響,要麼要“1”斷開,要麼讓“1”高電平。比如鍵盤檢測的時候,如何“1”是低電平的話。那麼輸入端會一直是低電平。我的開開發板PC5是鍵盤,如何我對輸出端不做任何處理的話,即使我PC5輸入設爲上拉輸入,輸入寄存器一直是0。如果直接給ODR寄存器置1我的問題就解決了。
問題1 我沒有設置PC5的輸出模式,直接給輸出寄存器置1,IO口的輸出端是什麼情況?STM32有沒有默認的輸出方式,這個要看輸出寄存器復位的時候的值,來判斷他的工作模式。。總之爲了保險起見,應把輸出寄存器置1。就和我們用51單片機IO作爲輸入的時候一定要先置一,一般系統復位後都是一。
當我們設置爲輸出模式的時候,我們能不能讀取數據(不設置輸入模式),當我們設置爲開漏模式的時候,外接上拉電阻過後,我們不用設置輸入模式就可以讀取IO的電平了。這個是唯一的全雙工的方式,除了複用功能外。我猜想默認輸入應該是浮空輸入。
哈哈其實GPIOx_CRX復位後值是0x44444444,即默認的輸入是浮空輸入模式,輸出是推輓輸出 !!