1 初學者重要提示
本文主要是以stm32H7系列為主。
GPIO的速度等級高的時候,最好使能IO補償單元。
2 GPIO功能簡介
STM32H7的GPIO特性如下:
輸出狀態:開漏/推挽 + 上拉/下拉電阻。
通過輸出數據寄存器(GPIOx_ODR)或者外設(GPIO設置為復用模式時)輸出數據。
GPIO速度等級設置。
輸入狀態:浮空,上拉/下拉,模擬。
通過輸入數據寄存器(GPIOx_IDR)或者外設(GPIO設置為復用模式)輸入數據。
通過寄存器GPIOx_BSRR實現對寄存器GPIOx_ODR的位操作。
通過配置寄存器GPIOx_LCKR的鎖機制,實現凍結IO口配置。
每兩個時鐘周期就可以翻轉一次IO。
高度靈活的引腳復用功能,允許IO引腳既可以做GPIO也可以做功能復用。
3 GPIO功能模式分析(重要)
STM32H7的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 模擬模式
3.1 推挽輸出
推挽電路是兩個參數相同的三極管或 MOSFET,以推挽方式存在于電路中。電路工作時,兩只對稱的開關管每次只有一個導通,導通損耗小、效率高。輸出既可以向負載灌電流,也可以從負載抽取電流。推拉式輸出級提高電路的負載能力。相對于開漏輸出模式,推挽輸出最大優勢是輸出高電平時,上升時間快,電壓驅動能力強。
3.2 開漏輸出
開漏端相當于 MOS 管的漏極(三極管的集電極),要得到高電平狀態必須外接上拉電阻才行,因此輸出高電平的驅動能力完全由外接上拉電阻決定,但是其輸出低電平的驅動能力很強。開漏形式的電路有以下幾個特點:
輸出高電平時利用外部電路的驅動能力,減少 IC 內部的驅動。
開漏是用來連接不同電平的器件,匹配電平用的,因為開漏引腳不連接外部的上拉電阻時,只能輸出低電平。如果需要同時具備輸出高電平的功能,則需要接上拉電阻,很好的一個優點是通過改變上拉電源的電壓,便可以改變傳輸電平。上拉電阻的阻值決定了邏輯電平轉換的速度。阻值越大,速度越低,功耗越小。
開漏輸出提供了靈活的輸出方式,但是也有其弱點,就是帶來上升沿的延時。因為上升沿是通過外接上拉無源電阻對負載充電,所以當電阻選擇小時延時就小,但功耗大;反之延時大功耗小。所以如果對延時有要求,則建議用下降沿輸出。
可以將多個開漏輸出連接到一條線上。通過一只上拉電阻,在不增加任何器件的情況下,形成“與邏輯”關系,即“線與”。可以簡單的理解為:在所有引腳連在一起時,外接一上拉電阻,如果有一個引腳輸出為邏輯 0,相當于接地,與之并聯的回路“相當于被一根導線短路”,所以外電路邏輯電平便為 0,只有都為高電平時,與的結果才為邏輯 1。
3.3 復用推挽和開漏
復用指的是GPIO切換到CPU內部設備(比如SPI,I2C,UART等電路),也就是GPIO不是作為普通IO使用,是由內部設備直接驅動。推挽和開漏的特征同上。
3.4 四種輸入模式
通過上面的引腳結構圖可以得到如下三種方式
浮空輸入:CPU內部的上拉電阻、下拉電阻均斷開的輸入模式。
下拉輸入:CPU內部的下拉電阻使能、上拉電阻斷開的輸入模式。
上拉輸入:CPU內部的上拉電阻使能、下拉電阻斷開的輸入模式。
而模擬輸入模式是GPIO引腳連接內部ADC。
4 GPIO的拉電流負載和灌電流負載能力
這里先普及點小知識,什么是拉電流負載,什么是灌電流負載。
拉電流負載:一種負載電流從驅動門流向外電路,稱為拉電流負載。比如使用STM32H7的GPIO直接驅動LED就是拉電流形式。
灌電流負載:負載電流從外電路流入驅動門,稱為灌電流負載。比如下面這種形式的LED驅動電路
有了上面這些知識后再來看STM32H7的IO驅動能力(截圖來自STM32H7參考手冊):
通過上面的截圖可知:STM32H7總的拉電流和灌電流不可超過140mA,單個引腳最大不可超過20mA,這個知識點,大家要知道。
5 IO補償單元,用于高速
IO補償單元用于控制I/O通信壓擺率(tfall/ trise)以此來降低I/O噪聲。當前STM32H7的速度等級可以配置為以下四種:
/** @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 */
使用后兩種速度等級的話,最好使能IO補償單元。
6 GPIO兼容CMOS和TTL電平
CMOS和TTL電平兼容問題也是一個比較重要的知識點
7 不使用的引腳推薦設置為模擬模式
主要從功耗和防干擾考慮。
所有用作帶上拉電阻輸入的 I/O都會在引腳外部保持為低時產生電流消耗。此電流消耗的值可通過使用的靜態特性中給出的上拉 / 下拉電阻值簡單算出。
對于輸出引腳,還必須考慮任何外部下拉電阻或外部負載以估計電流消耗。
若外部施加了中間電平,則額外的 I/O 電流消耗是因為配置為輸入的 I/O。此電流消耗是由用于區分輸入值的輸入施密特觸發器電路導致。除非應用需要此特定配置,否則可通過將這些I/O 配置為模擬模式以避免此供電電流消耗。ADC 輸入引腳應配置為模擬輸入就是這種情況。
任何浮空的輸入引腳都可能由于外部電磁噪聲,成為中間電平或意外切換。為防止浮空引腳相關的電流消耗,它們必須配置為模擬模式,或內部強制為確定的數字值。這可通過使用上拉 / 下拉電阻或將引腳配置為輸出模式做到。
綜上考慮,不使用的引腳設置為模擬模式,懸空即可。
審核編輯:湯梓紅
-
寄存器
+關注
關注
31文章
5356瀏覽量
120564 -
STM32
+關注
關注
2270文章
10904瀏覽量
356425 -
GPIO
+關注
關注
16文章
1205瀏覽量
52156 -
stm32h7
+關注
關注
0文章
37瀏覽量
1753
原文標題:一文全面掌握stm32的GPIO知識
文章出處:【微信號:技術讓夢想更偉大,微信公眾號:技術讓夢想更偉大】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論