(推薦先看文章:《 嵌入式-32單片機-GPIO推挽輸出和開漏輸出》)
下文圖都是從參考手冊借閱:STM32F10xxx(中文),大概頁數(shù)是110/775左右
一:GPIO輸入輸出原理
GPIO(General Purpose Input Output)通用輸入輸出口
可配置為8種輸入輸出模式
引腳電平:0V~3.3V,部分引腳可容忍5V(有FT標(biāo)識)
輸出模式下可控制端口輸出高低電平,用以驅(qū)動LED、控制蜂鳴器、模擬通信協(xié)議輸出時序等
輸入模式下可讀取端口的高低電平或電壓,用于讀取按鍵輸入、外接模塊電平信號輸入、ADC電壓采集、模擬通信協(xié)議接收數(shù)據(jù)等
二:GPIO基本結(jié)構(gòu)
上圖是GPIO的基本結(jié)構(gòu)圖。在Stm32中,所有的GPIO都掛載在APB2外設(shè)總線上。每個GPIO模塊內(nèi),包括有寄存器、驅(qū)動器、引腳等 寄存器就是一段特殊的存儲器,內(nèi)核可以通過APB2總線對寄存器進行讀寫,從而完成輸出電平和讀取電平的功能。該寄存器的每一位都對應(yīng)一個引腳,由于STM32是32位的單片機,所以所有的寄存器都是32位的,也就是說只有寄存器的低16位對應(yīng)上了相應(yīng)的GPIO口(好多時候高16位置0,低16位才真正控制寄存器)
驅(qū)動器就是增加信號的驅(qū)動能力的。
注意:stm32F103c8t6芯片上48個引腳,除了基本的電源和晶振等維持系統(tǒng)外,分別包括PA0~PA15、PB0-PB15、PC0 ~PC15。
三:GPIO位結(jié)構(gòu)
上圖分為輸入部分和輸出部分,看虛線框
輸入部分:
- 整個框架從左往右依次是寄存器、驅(qū)動器、IO引腳,從上到下分為“輸入”、“輸出”。
- 最右側(cè)的IO引腳上兩個保護二極管,其作用是對IO引腳的輸出電壓進行限幅在0~3.3V之間,進而可以避免過高的IO引腳輸入電壓對電路內(nèi)部造成傷害。Vdd = 3.3V,Vss = 0V。
- 過壓保護:當(dāng)I引腳輸入10V時,電壓從輸入引腳到保護二極管再到Vdd,有電壓差就能流通,這叫過壓保護。
- 低壓保護:當(dāng)I引腳輸入低于0V時,這叫做負(fù)電壓,此時,電流流向為:從Vss →I引腳,這叫低壓保護。
輸入驅(qū)動器的上、下拉電阻(圖中像彈簧那兩根):相應(yīng)的開關(guān)可以通過程序進行配置,分別有上拉輸入模式(上開關(guān)導(dǎo)通,下開關(guān)斷開)、下拉輸入模式(下開關(guān)導(dǎo)通&上開關(guān)斷開)、浮空輸入模式(兩個開關(guān)都斷開)。
下拉電阻的作用幾時給引腳輸入提供一個默認(rèn)的輸入電平,進而避免引腳懸空導(dǎo)致的不確定。都屬于弱上拉,弱下拉。輸入驅(qū)動器的觸發(fā)器:這里是用肖特基管構(gòu)成的施密特觸發(fā)器。只有高于上限、低于下限電壓才進行變化,作用是對輸入電壓進行整形,可以消除電壓波紋、使電壓的上升沿/下降沿更加陡峭。也就是說,stm32的GPIO的端口會自動對輸入的數(shù)字電壓進行整形。比如像那種方波在變化的那個瞬間進行消抖,20ms.
“模擬輸入”、“復(fù)用功能輸入”:都是連接到片上外設(shè)的一些端口,前者用于ADC等需要模擬輸入的外設(shè),后者用于串口輸入引腳等需要數(shù)字量的外設(shè)。
輸出部分:
- 輸出數(shù)據(jù):可以由輸出數(shù)據(jù)寄存器(普通的IO口輸出)、片上外設(shè)來指定,數(shù)據(jù)選擇器控制數(shù)據(jù)來源。
- 位設(shè)置/清除寄存器:單獨操作輸出數(shù)據(jù)的某一位,而不影響其他位。
- 驅(qū)動器中的MOS管:MOS管相當(dāng)于一種開關(guān),輸出信號來控制這兩個MOS管的開啟狀態(tài),進而輸出信號。可以選擇推挽、開漏、關(guān)閉三種輸出方式(推薦先看文章:《嵌入式-32單片機-GPIO推挽輸出和開漏輸出》),P-MOS相當(dāng)于Q1,N-MOS相當(dāng)于Q2
- 推挽輸出模式:兩個MOS管均有效,stm32對IO口有絕對的控制權(quán),也稱為強推輸出模式。
- 開漏輸出模式:P-MOS無效。只有低電平有驅(qū)動能力,高電平輸出高阻。
- 關(guān)閉模式:兩個MOS管均無效,端口電平由外部信號控制。
補充說明:stm32如何將數(shù)據(jù)寫入寄存器?
通過軟件的方式。由于stm32的寄存器只能進行整體讀寫,所以可以先將數(shù)據(jù)全部讀出,然后代碼中用&= 清零、|= 置位的方式改變單獨某一位的數(shù)據(jù),再將該寫后的數(shù)據(jù)寫回寄存器。此方法比較麻煩,效率不高,對于IO口進行操作不合適(這就是基于寄存器開發(fā)的麻煩之處,所以有了基于標(biāo)準(zhǔn)庫的開發(fā))
通過位設(shè)置/清除寄存器。若對某一位 置1,只需對位設(shè)置寄存器的相應(yīng)位值1;若對某一位 清零,則對清除寄存器相應(yīng)位 清零。這種方式通過內(nèi)置電路完成操作,一步到位。
通過讀寫stm32中的“位帶”區(qū)域。在stm32中,專門分配有一段地址區(qū)域,該區(qū)域映射了RAM和外設(shè)寄存器所有的位。讀寫這段地址中的數(shù)據(jù),就相當(dāng)于讀寫所映射位置的某一位。整體流程與51單片機中的位尋址作用差不多。本教程不涉及。
四:GPIO的八種模式
模式名稱 | 性質(zhì) | 特征 |
---|---|---|
浮空輸入 | 數(shù)字輸入 | 可讀取引腳電平,若引腳懸空則電平不確定,容易受外界影響所以需要連續(xù)驅(qū)動源 |
上拉輸入 | 數(shù)字輸入 | 可讀取引腳電平,內(nèi)部連接上拉電阻,懸空時默認(rèn)高電平 |
下拉輸入 | 數(shù)字輸入 | 可讀取引腳電平,內(nèi)部連接下拉電阻,懸空時默認(rèn)低電平 |
模擬輸入 | 模擬輸入 | GPIO無效,會關(guān)閉數(shù)字輸入開啟模擬輸入,引腳直接接入內(nèi)部ADC(ADC專屬配置) |
開漏輸出 | 數(shù)字輸出 | 可輸出引腳電平,高電平為高阻態(tài),低電平接Vss |
推挽輸出 | 數(shù)字輸出 | 可輸出引腳電平,高電平接VDD,低電平接Vss |
復(fù)用開漏輸出 | 數(shù)字輸出 | 由片上外設(shè)控制,高電平為高阻態(tài),低電平接Vss |
復(fù)用推挽輸出 | 數(shù)字輸出 | 由片上外設(shè)控制,高電平接VDD,低電平接Vss |
上表給出了GPIO的八種模式,通過配置GPIO的端口配置寄存器即可選擇相應(yīng)的模式。
- 每一個端口的模式由四位進行控制,16個端口就需要64位,所以這里的配置寄存器有兩個(一個是端口低配置寄存器,一個是端口配置高寄存器),也就是兩個32位寄存器,即端口配置低寄存器、端口配置高寄存器。
- 輸入模式下,輸出無效;而輸出模式下,輸入有效。這是因為一個端口只能有一個輸出,但可以有多個輸入,所以直接將輸出信號輸入回去也沒問題。
3.端口配置低寄存器低16位對應(yīng)16個引腳,高16位沒有使用;端口配置高寄存器,同樣是低16位對應(yīng)16個引腳,高16位沒有使用。
端口位設(shè)置/清除寄存器的高16位進行位清除的,低16位是進行位設(shè)置的
寄存器:暫時記錄數(shù)據(jù)的模塊。
復(fù)用開漏/推挽輸出:引腳的控制權(quán)轉(zhuǎn)移到了片上外設(shè)
stm32串口默認(rèn)是半雙工的。
三極管可看成兩個二極管構(gòu)成(背靠背)文章來源:http://www.zghlxwxcb.cn/news/detail-797241.html
參考:B站STM32江協(xié)自動化&【哈工大虎慕】文章來源地址http://www.zghlxwxcb.cn/news/detail-797241.html
道友:相信別人,更要一百倍地相信自己。
到了這里,關(guān)于嵌入式-Stm32-江科大基于標(biāo)準(zhǔn)庫的GPIO通用輸入輸出口的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!