博客專欄

        EEPW首頁 > 博客 > GPIO詳解-以STM32F103 為例

        GPIO詳解-以STM32F103 為例

        發(fā)布人:yingjian 時間:2023-02-28 來源:工程師 發(fā)布文章

        GPIO是通用輸入/輸出端口的簡稱,是STM32可控制的引腳。GPIO的引腳與外部硬件設(shè)備連接,可實現(xiàn)與外部通訊、控制外部硬件或者采集外部硬件數(shù)據(jù)的功能。

        STM32F103ZET6芯片為144腳芯片,包括7個通用目的的輸入/輸出口(GPIO)組,分別為GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同時每組GPIO口組有16個GPIO口。通常簡略稱為PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x為0-15。STM32的大部分引腳除了當GPIO使用之外,還可以復(fù)用為外設(shè)功能引腳(比如串口),這部分在【STM32】STM32端口復(fù)用和重映射(AFIO輔助功能時鐘) 中有詳細的介紹。

        2 簡介
        2.1 GPIO內(nèi)部結(jié)構(gòu)

        圖片

        幾點需要注意的地方:

        1. 保護二極管:IO引腳上下兩邊兩個二極管用于防止引腳外部過高、過低的電壓輸入。當引腳電壓高于VDD時,上方的二極管導(dǎo)通;當引腳電壓低于VSS時,下方的二極管導(dǎo)通,防止不正常電壓引入芯片導(dǎo)致芯片燒毀。但是盡管如此,還是不能直接外接大功率器件,須加大功率及隔離電路驅(qū)動,防止燒壞芯片或者外接器件無法正常工作。

        2. P-MOS管和N-MOS管:由P-MOS管和N-MOS管組成的單元電路使得GPIO具有“推挽輸出”和“開漏輸出”的模式。這里的電路會在下面很詳細地分析到。3. TTL肖特基觸發(fā)器:信號經(jīng)過觸發(fā)器后,模擬信號轉(zhuǎn)化為0和1的數(shù)字信號。但是,當GPIO引腳作為ADC采集電壓的輸入通道時,用其“模擬輸入”功能,此時信號不再經(jīng)過觸發(fā)器進行TTL電平轉(zhuǎn)換。ADC外設(shè)要采集到的原始的模擬信號。這里需要注意的是,在查看《STM32中文參考手冊V10》中的GPIO的表格時,會看到有“FT”一列,這代表著這個GPIO口是兼容3.3V和5V的;如果沒有標注“FT”,就代表著不兼容5V。

        2.2 GPIO工作模式

                                                                                  

        GPIO支持4種輸入模式(浮空輸入、上拉輸入、下拉輸入、模擬輸入)和4種輸出模式(開漏輸出、開漏復(fù)用輸出、推挽輸出、推挽復(fù)用輸出)。同時,GPIO還支持三種最大翻轉(zhuǎn)速度(2MHz、10MHz、50MHz)。

        每個I/O口可以自由編程,但I/O口寄存器必須按32位字被訪問。

        • GPIO_Mode_AIN 模擬輸入

        • GPIO_Mode_IN_FLOATING 浮空輸入

        • GPIO_Mode_IPD 下拉輸入

        • GPIO_Mode_IPU 上拉輸入

        • GPIO_Mode_Out_OD 開漏輸出

        • GPIO_Mode_Out_PP 推挽輸出

        • GPIO_Mode_AF_OD 復(fù)用開漏輸出

        • GPIO_Mode_AF_PP 復(fù)用推挽輸出

        3 八種工作模式

        3.1 輸入模式


        3.1.1 浮空輸入

        圖片

        浮空輸入模式下,I/O端口的電平信號直接進入輸入數(shù)據(jù)寄存器。也就是說,I/O的電平狀態(tài)是不確定的,完全由外部輸入決定;如果在該引腳懸空(在無信號輸入)的情況下,讀取該端口的電平是不確定的。

        3.1.2 上拉輸入

        圖片

        上拉輸入模式下,I/O端口的電平信號直接進入輸入數(shù)據(jù)寄存器。但是在I/O端口懸空(在無信號輸入)的情況下,輸入端的電平可以保持在高電平;并且在I/O端口輸入為低電平的時候,輸入端的電平也還是低電平。

        3.1.3 下拉輸入

        圖片

        下拉輸入模式下,I/O端口的電平信號直接進入輸入數(shù)據(jù)寄存器。但是在I/O端口懸空(在無信號輸入)的情況下,輸入端的電平可以保持在低電平;并且在I/O端口輸入為高電平的時候,輸入端的電平也還是高電平。


        3.1.4 模擬輸入

        圖片

        模擬輸入模式下,I/O端口的模擬信號(電壓信號,而非電平信號)直接模擬輸入到片上外設(shè)模塊,比如ADC模塊等等。


        3.2 輸出模式


        3.2.1 開漏輸出

        圖片

        開漏輸出模式下,通過設(shè)置位設(shè)置/清除寄存器或者輸出數(shù)據(jù)寄存器的值,途經(jīng)N-MOS管,最終輸出到I/O端口。

        這里要注意N-MOS管,當設(shè)置輸出的值為高電平的時候,N-MOS管處于關(guān)閉狀態(tài),此時I/O端口的電平就不會由前面設(shè)置輸出的高低電平?jīng)Q定,而是由I/O端口外部的上拉或者下拉決定;

        當設(shè)置輸出的值為低電平的時候,N-MOS管處于開啟狀態(tài),此時I/O端口的電平就是低電平。同時,I/O端口的電平也可以通過輸入電路進行讀取;

        注意,讀取到的I/O端口的電平不一定是設(shè)置的輸出電平。


        3.2.2 開漏復(fù)用功能

        圖片

        開漏復(fù)用輸出模式,與開漏輸出模式很是類似。只是輸出的高低電平的來源,不是讓CPU直接寫輸出數(shù)據(jù)寄存器,取而代之利用片上外設(shè)模塊的復(fù)用功能輸出來決定的。


        3.2.3 推挽式輸出

        圖片

        推挽輸出模式下,通過設(shè)置位設(shè)置/清除寄存器或者輸出數(shù)據(jù)寄存器的值,途經(jīng)P-MOS管和N-MOS管,最終輸出到I/O端口。這里要注意P-MOS管和N-MOS管。

        當設(shè)置輸出的值為高電平的時候,P-MOS管處于開啟狀態(tài),N-MOS管處于關(guān)閉狀態(tài),此時I/O端口的電平就由P-MOS管決定:高電平;

        當設(shè)置輸出的值為低電平的時候,P-MOS管處于關(guān)閉狀態(tài),N-MOS管處于開啟狀態(tài),此時I/O端口的電平就由N-MOS管決定:低電平。同時,I/O端口的電平也可以通過輸入電路進行讀取;注意,此時I/O端口的電平一定是輸出的電平。


        3.2.4 推挽式復(fù)用功能

        圖片

        推挽復(fù)用輸出模式,與推挽輸出模式很是類似。只是輸出的高低電平的來源,不是讓CPU直接寫輸出數(shù)據(jù)寄存器,取而代之利用片上外設(shè)模塊的復(fù)用功能輸出來決定的。

        4 引申

        第三節(jié)詳細介紹了STM32F103ZET6的GPIO的八種工作模式,我們再引申闡述一下推挽輸出和開漏輸出的區(qū)別、開漏輸出的特點,以及“線與”的概念。
        4.1 推挽輸出和開漏輸出的區(qū)別

        圖片

        推挽輸出等效電路圖

        推挽輸出電路由兩個MOS管組成(上方的P-MOS和下方N-MOS),而開漏輸出則由上拉電阻和一個N-MOS管組成。推挽輸出的工作原理是:當需要輸出高電平時,上方P-MOS管導(dǎo)通,下方N-MOS管關(guān)閉。而若要輸出低電平時,下方的N-MOS管導(dǎo)通,上方的P-MOS管關(guān)閉。當引腳高低電平切換時,兩個MOS管輪流導(dǎo)通,一個負責(zé)灌電流,另一個負責(zé)拉電流,使得負載能力和開關(guān)速度都有很大的提高。

        圖片

        開漏輸出等效電路圖


        開漏輸出的工作原理是:若要輸出低電平,則N-MOS管導(dǎo)通,輸出接地,輸出低電平。若要輸出高電平時,N-MOS管關(guān)閉,則既不輸出高電平又不輸出低電平,為高阻態(tài)。所以,需要外接上拉電阻,讓上拉電阻提供高電平的驅(qū)動能力。因為內(nèi)部管腳為高阻狀態(tài),所以,其具有“線與”特性,即將多個開漏極直接直接相連,只有所有的開漏極都是高阻狀態(tài),輸出才為高電平,否則,為低電平。


        4.2 開漏輸出的特點

        開漏形式的電路有以下幾個特點:

        1. 利用外部電路的驅(qū)動能力,減少IC內(nèi)部的驅(qū)動。當IC內(nèi)部MOSFET導(dǎo)通時,驅(qū)動電流是從外部的VCC流經(jīng)Rpull-up ,MOSFET到GND。IC內(nèi)部僅需很小的柵極驅(qū)動電流。

        2. 一般來說,開漏是用來連接不同電平的器件,匹配電平用的,因為開漏引腳不連接外部的上拉電阻時,只能輸出低電平,如果需要同時具備輸出高電平的功能,則需要接上拉電阻,很好的一個優(yōu)點是通過改變上拉電源的電壓,便可以改變傳輸電平。比如加上上拉電阻就可以提供TTL/CMOS電平輸出等。(上拉電阻的阻 決定了邏輯電平轉(zhuǎn)換的沿的速度 。阻 越大,速度越低功耗越小,所以負載電阻的選擇要兼顧功耗和速度)。

        3. OPEN-DRAIN提供了靈活的輸出方式,但是也有其弱點,就是帶來上升沿的延時。因為上升沿是通過外接上拉無源電阻對負載充電,所以當電阻選擇小時延時就小,但功耗大;反之延時大功耗小。所以如果對延時有要求,則建議用下降沿輸出。

        4. 可以將多個開漏輸出的Pin,連接到一條線上。通過一只上拉電阻,在不增加任何器件的情況下,形成“與邏輯”關(guān)系。這也是I2C、SMBus等總線判斷總線占用狀態(tài)的原理。


        4.3 “線與”

        再補充一下“線與”的知識點!
        在一個結(jié)點(線)上, 連接一個上拉電阻到電源 VCC  和 n 個 NPN 的集電極C 或 NMOS晶體管的漏極D, 這些晶體管的****極E或源極S都接到地線上,只要有一個晶體管飽和, 這個結(jié)點(線)就被拉到地線電平上。

        圖片

        因為這些晶體管的基極注入電流(NPN)或柵極加上高電平(NMOS),晶體管就會飽和, 所以這些基極或柵極對這個結(jié)點(線)的關(guān)系是或非 NOR 邏輯. 如果這個結(jié)點后面加一個反相器, 就是或 OR 邏輯。

        其實可以簡單地理解為:在所有引腳連在一起時,外接一上拉電阻,如果有一個引腳輸出為邏輯0,相當于接地,與之并聯(lián)的回路“相當于被一根導(dǎo)線短路”,所以外電路邏輯電平便為0,只有都為高電平時,與的結(jié)果才為邏輯1。


        *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



        關(guān)鍵詞: GPIO STM32F103

        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 武宁县| 霸州市| 陆河县| 凤凰县| 新乡市| 虎林市| 荔波县| 金溪县| 越西县| 广河县| 正镶白旗| 莱芜市| 双峰县| 南漳县| 上思县| 甘孜县| 荆州市| 丰县| 东至县| 辽源市| 徐州市| 会宁县| 大荔县| 叶城县| 自治县| 湛江市| 永和县| 内江市| 大安市| 大足县| 庐江县| 周至县| 保亭| 湖口县| 凤凰县| 射洪县| 志丹县| 江达县| 长阳| 新闻| 清水河县|