最新教程下載:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255
第15章 STM32F407的GPIO基礎知識(重要)
本章教程為大家講解GPIO(General-purpose I/Os)基礎知識。GPIO配置是所有外設驅動的基礎,大家務必要熟練掌握。
15.1 初學者重要提示
15.2 GPIO功能簡介
15.3 GPIO功能模式分析(重要)
15.4 GPIO的拉電流負載和灌電流負載能力
15.5 IO補償單元,用於高速
15.6 GPIO兼容CMOS和TTL電平
15.7 不使用的引腳推薦設為模擬模式
15.8 總結
15.1 初學者重要提示
- 學習本章節務必要認真學習並掌握15.3小節GPIO功能模式分析,學好它們,對后續章節中外設的學習大有裨益。
- 對於不使用的引腳,推薦設置為模擬模式,懸空即可。
- GPIO的速度等級高的時候,最好使能IO補償單元。
- GPIO還涉及到一個注入電流的問題,此貼可以作為了解:http://www.armbbs.cn/forum.php?mod=viewthread&tid=87675 。
15.2 GPIO功能簡介
STM32F407的GPIO特性如下:
- 輸出狀態:開漏/推挽 + 上拉/下拉電阻。
- 通過輸出數據寄存器(GPIOx_ODR)或者外設(GPIO設置為復用模式時)輸出數據。
- GPIO速度等級設置。
- 輸入狀態:浮空,上拉/下拉,模擬。
- 通過輸入數據寄存器(GPIOx_IDR)或者外設(GPIO設置為復用模式)輸入數據。
- 通過寄存器GPIOx_BSRR實現對寄存器GPIOx_ODR的位操作。
- 通過配置寄存器GPIOx_LCKR的鎖機制,實現凍結IO口配置。
- 每兩個時鍾周期就可以翻轉一次IO。
- 高度靈活的引腳復用功能,允許IO引腳既可以做GPIO也可以做功能復用。
15.3 GPIO功能模式分析(重要)
STM32F4的GPIO端口可以配置為如下的8種模式:
- 輸入浮空
- 輸入上拉
- 輸入下拉
- 模擬功能
- 具有上拉或下拉功能的開漏輸出
- 具有上拉或下拉功能的推挽輸出
- 具有上拉或下拉功能的復用功能推挽
- 具有上拉或下拉功能的復用功能開漏
由於上拉和下拉是可選配置,對應的HAL庫配置使用下面6種就可以表示:
- GPIO_MODE_INPUT 輸入模式
- GPIO_MODE_OUTPUT_PP 推挽輸出
- GPIO_MODE_OUTPUT_OD 開漏輸出
- GPIO_MODE_AF_PP 復用推挽
- GPIO_MODE_AF_OD 復用開漏
- GPIO_MODE_ANALOG 模擬模式
15.3.1 推挽輸出
推挽電路是兩個參數相同的三極管或 MOSFET,以推挽方式存在於電路中。 電路工作時,兩只對稱的開關管每次只有一個導通,導通損耗小、效率高。輸出既可以向負載灌電流,也可以從負載抽取電流。推拉式輸出級提高電路的負載能力。 相對於開漏輸出模式,推挽輸出最大優勢是輸出高電平時,上升時間快,電壓驅動能力強。
15.3.2 開漏輸出
開漏端相當於 MOS 管的漏極(三極管的集電極),要得到高電平狀態必須外接上拉電阻才行,因此輸出高電平的驅動能力完全由外接上拉電阻決定,但是其輸出低電平的驅動能力很強。開漏形式的電路有以下幾個特點:
- 輸出高電平時利用外部電路的驅動能力,減少 IC 內部的驅動。
- 開漏是用來連接不同電平的器件,匹配電平用的,因為開漏引腳不連接外部的上拉電阻時,只能輸出低電平。如果需要同時具備輸出高電平的功能,則需要接上拉電阻,很好的一個優點是通過改變上拉電源的電壓,便可以改變傳輸電平。上拉電阻的阻值決定了邏輯電平轉換的速度。阻值越大,速度越低,功耗越小。
- 開漏輸出提供了靈活的輸出方式,但是也有其弱點,就是帶來上升沿的延時。因為上升沿是通過外接上拉無源電阻對負載充電,所以當電阻選擇小時延時就小,但功耗大;反之延時大功耗小。所以如果對延時有要求,則建議用下降沿輸出。
- 可以將多個開漏輸出連接到一條線上。通過一只上拉電阻,在不增加任何器件的情況下,形成“與邏輯”關系,即“線與”。可以簡單的理解為:在所有引腳連在一起時,外接一上拉電阻,如果有一個引腳輸出為邏輯 0,相當於接地,與之並聯的回路“相當於被一根導線短路”,所以外電路邏輯電平便為 0,只有都為高電平時,與的結果才為邏輯 1。
15.3.3 復用推挽和開漏
復用指的是GPIO切換到CPU內部設備(比如SPI,I2C,UART等電路),也就是GPIO不是作為普通IO使用,是由內部設備直接驅動。推挽和開漏的特征同上。
15.3.4 四種輸入模式
通過上面的引腳結構圖可以得到如下三種方式
- 浮空輸入:CPU內部的上拉電阻、下拉電阻均斷開的輸入模式。
- 下拉輸入:CPU內部的下拉電阻使能、上拉電阻斷開的輸入模式。
- 上拉輸入:CPU內部的上拉電阻使能、下拉電阻斷開的輸入模式。
而模擬輸入模式是GPIO引腳連接內部ADC。
15.4 GPIO的拉電流負載和灌電流負載能力
這里先普及點小知識,什么是拉電流負載,什么是灌電流負載。
- 拉電流負載:一種負載電流從驅動門流向外電路,稱為拉電流負載。比如使用STM32F4的GPIO直接驅動LED就是拉電流形式。
- 灌電流負載:負載電流從外電路流入驅動門,稱為灌電流負載。比如下面這種形式的LED驅動電路
有了上面這些知識后再來看STM32F407的IO驅動能力(截圖來自STM32F407數據手冊):
通過上面的截圖可知:STM32F407單個引腳的最大拉電流和灌電流不可超過25mA,這個知識點,大家要知道。
15.5 IO補償單元,用於高速
IO補償單元用於控制I/O通信壓擺率(tfall / trise)以此來降低I/O噪聲。當前STM32F4的速度等級可以配置為以下四種:
/** @defgroup GPIO_speed_define GPIO speed define * @brief GPIO Output Maximum frequency * @{ */ #define GPIO_SPEED_FREQ_LOW ((uint32_t)0x00000000U) /*!< Low speed */ #define GPIO_SPEED_FREQ_MEDIUM ((uint32_t)0x00000001U) /*!< Medium speed */ #define GPIO_SPEED_FREQ_HIGH ((uint32_t)0x00000002U) /*!< Fast speed */ #define GPIO_SPEED_FREQ_VERY_HIGH ((uint32_t)0x00000003U) /*!< High speed */
不同的速度等級支持的最大時鍾速度可以看此貼:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94429 。
15.6 GPIO兼容CMOS和TTL電平
CMOS和TTL電平兼容問題也是一個比較重要的知識點,關於這方面的知識已經在論壇進行了總結(由於截圖較多,較長,就不整理到教程里面了):http://www.armbbs.cn/forum.php?mod=viewthread&tid=87676 。
15.7 不使用的引腳推薦設置為模擬模式
主要從功耗和防干擾考慮。
- 所有用作帶上拉電阻輸入的 I/O都會在引腳外部保持為低時產生電流消耗。此電流消耗的值可通過使用的靜態特性中給出的上拉 / 下拉電阻值簡單算出。
- 對於輸出引腳,還必須考慮任何外部下拉電阻或外部負載以估計電流消耗。
- 若外部施加了中間電平,則額外的 I/O 電流消耗是因為配置為輸入的 I/O。此電流消耗是由用於區分輸入值的輸入施密特觸發器電路導致。除非應用需要此特定配置,否則可通過將這些I/O 配置為模擬模式以避免此供電電流消耗。 ADC 輸入引腳應配置為模擬輸入就是這種情況。
- 任何浮空的輸入引腳都可能由於外部電磁噪聲,成為中間電平或意外切換。為防止浮空引腳相關的電流消耗,它們必須配置為模擬模式,或內部強制為確定的數字值。這可通過使用上拉 / 下拉電阻或將引腳配置為輸出模式做到。
綜上考慮,不使用的引腳設置為模擬模式,懸空即可。
15.8 總結
本章節就為大家講解這么多,其中GPIO功能模式小節(本章15.3)最重要,大家務必要掌握。