GPIO的工作模式、GPIO複用

2022-01-02 15:00:02

1、GPIO 的8種工作模式

GPIO 的電路是一堆電路,所以需要設定暫存器,來開啟對應的開關,來實現不同的功能。

在這裡插入圖片描述

輸入部分:

輸入的訊號,不會反向的迴流到輸出電路,因為 N-MOS、P-MOS 不會被反向導通。(輸入電路不會影響到輸出電路)

輸入電路內部有兩個電阻:上拉電阻、下拉電阻。

  • 上下拉電阻對應兩個開關:這個開關也是通過 GPIO 的設定暫存器,來進行設定開啟或者關閉。
  • VDD 開關閉合:上拉輸入。(即沒有訊號輸入的時候,觸發器裡面儲存 1 )
  • VSS 開關閉合:下拉輸入。(即沒有訊號輸入的時候,觸發器裡面儲存 1)
  • VDD、VSS 都不導通:浮空輸入。

模擬輸入:不經過觸發器,直接接到片上外設 ADC ,從而進行模數轉換。

觸發器:儲存高低電平的 bit 位。(代表數位輸入)

在這裡插入圖片描述

輸出部分:

N-MOS 管:高電平 導通

P-MOS 管: 低電平 導通

當輸出暫存器為高電平的時候,經過一個非門,傳到輸出控制的時候,就變成了一個低電平,從而將 P-MOS 導通。

電位的提供不是靠資料暫存器,而是通過開啟對應的開關,從而利用對應的電源實現。(VDD、VSS)

輸出控制有兩個控制端

  • 輸出資料暫存器:代表通用的 GPIO
  • 片上外設暫存器:代表 GPIO 的複用功能。

不同模式對應的電路流向:

浮空輸入:

image-20220101102345300

輸入上拉、下拉:

image-20220101102433609

image-20220101102536522

模擬輸入:

image-20220101102508451

開漏輸出:此時的 I/O 埠,既可以做輸入模式、也可以做輸出模式。

  • 此時的輸出電平,並不會影響到輸入電路。(與推完輸出不同)
  • 因為開漏輸出:VDD 不會起作用,輸出高電平的時候,依靠外面外接一個上拉電阻
  • 所以開漏輸出的高電平,並不會影響到對應的輸入電路。

image-20220101102635507

image-20220101102743167

推輓輸出:

  • 此時輸出高電平,是依靠 VDD 來實現的,所以同時會影響到輸入電路。
  • 此時輸入電路就無法分辨,高電平是自己輸出的,還是外部輸入的。

image-20220101102910481


2、GPIO 的複用

STM32基本上每個引腳都有8種設定模式:

1)浮空輸入
2)帶弱上拉輸入
3)帶弱下拉輸入
4)模擬輸入

5)推輓輸出
6)開漏輸出
7)複用推輓輸出
8)複用開漏輸出

STM32Fxx內部整合了很多的外設控制器,比如USART、SPI、bxCAN等等,這些外設控制器,也需要通過引腳與外設連線。

複用功能是相對於微控制器的引腳而言的。所謂「複用功能」,是指微控制器的引腳既可以做普通GPIO使用,也可以作為內部外設控制器的引腳來使用。

比如我們來看看STM32F103xx微控制器的PA5引腳,如下圖:
在這裡插入圖片描述

(1)GPIO 支援多種外設的時候,如何區別

!!!:通過外設時鐘是否是能,以及當前 GPIO 處於什麼模式。

PA5 的功能:

  • 普通GPIO
  • SPI1的時鐘(SPI1_SCK)
  • DAC的輸出通道1(DAC_OUT1)
  • ADC的輸入通道5(ADC12_IN5)

PA5支援的三種外設(SPI1、DAC、ADC)在同一時刻只能選擇一種

選擇的方法是:開啟相應外設的時鐘,並使其它外設的時鐘保持關閉狀態。

如果PA5被設定為複用功能,但是沒有開啟它支援的任何外設的時鐘,它的輸出是不確定的。


(2)普通推輓輸出、複用推輓輸出的區別

複用推輓輸出和(普通)推輓輸出在輸出的時候均使用兩個MOS管(P-MOS和-MOS),其輸出電路是相同的

!!!!區別在於控制輸出的訊號來源

  • (普通)推輓輸出控制MOS管的訊號來自 輸出資料暫存器
  • 複用推輓輸出的控制訊號來自微控制器的 內建外設控制器(比如SPI1)。

下面這張圖,是普通GPIO輸出的引腳設定圖,可以看到其輸出訊號來自輸出 資料暫存器Output data register):
在這裡插入圖片描述
下面這張圖,是選擇複用功能後的引腳設定圖,可以看到其輸出訊號來自 晶片內建的外設控制器
在這裡插入圖片描述
注意:雖然複用模式的控制訊號來自內建外設控制器,但是微控制器(CPU)依然可以讀取相應的資料

  • 複用推輓輸出模式 下,微控制器可以通過讀取輸出資料暫存器(Output Data Register)的資料來獲取上次輸出的值;
  • 複用開漏輸出的模式 下,微控制器可以通過讀取輸入資料暫存器(Input Data Register)的值來獲取引腳的狀態。