1 io口 stm32_从STM32分享各种硬件以及总线之GPIO简介
今天有網(wǎng)友私信我,問(wèn)我怎么沒(méi)有更新文章,我有點(diǎn)慚愧沒(méi)有能夠及時(shí)更新文章。因?yàn)槎紱](méi)有太多時(shí)間準(zhǔn)備,所以更新的有點(diǎn)慢,但是我還是決定每天給大家分享一點(diǎn)知識(shí)。之前我們講了STM32的時(shí)鐘,講完時(shí)鐘之后我開(kāi)始為大家講一些外設(shè)我們從最基本的GPIO開(kāi)始講。我們打開(kāi)STM32的手冊(cè)(由于STM32的手冊(cè)網(wǎng)上很多,大家可以自己找,如果沒(méi)有的朋友也可以私信我,我會(huì)及時(shí)反饋并將資料給到你),我們看第9章 General-purpose and alternate-function I/Os (GPIOs and AFIOs)。這節(jié)主要講STM32的通用IO與復(fù)用IO相關(guān)知識(shí),我們看任何一款芯片一定要把官方給的參考手冊(cè)看透,這樣才能對(duì)芯片了如指掌。首先我們來(lái)了解一下IO口的模式以及該模式的一些相關(guān)知識(shí):
輸入:浮空輸入 ─ 上拉輸入 ─ 下拉輸入 ─ 模擬輸入
輸出:開(kāi)漏輸出 ─ 推挽輸出 ─ 開(kāi)漏復(fù)用輸出 ─ 開(kāi)漏復(fù)用輸出
針對(duì)這些我們逐一分析:
首先是浮空輸入,什么是浮空輸入:就是IO的電平狀態(tài)是不確定的,完全由外部輸入決定,如果在該引腳懸空的情況下,讀取該端口的電平是不確定的,這種輸入一般用作按鍵的檢測(cè)。
上拉輸入,很明顯就是在元器件的內(nèi)部加上了一個(gè)上拉電阻,由于內(nèi)部有上拉電阻,能夠起到限流的作用,是我們使用過(guò)程中也比較常見(jiàn)的情況。
下拉輸入 - 就是元器件的內(nèi)部將該引腳通過(guò)電阻鏈接到GND上面了,將該引腳的電平默認(rèn)設(shè)置為低電平,作用與上拉有點(diǎn)相似。
模擬輸入 - 這個(gè)輸入口主要用于檢測(cè)IO口輸入的電平的電壓。其實(shí)對(duì)于輸出來(lái)講已經(jīng)算是很清楚了,從字面意思我們都可以很清楚的了解到,在使用的過(guò)程中我們也可以根據(jù)實(shí)際情況來(lái)進(jìn)行設(shè)置,比如你有一個(gè)IO口外部忘記接上啦電阻,而你又想當(dāng)外部沒(méi)有輸入的情況下默認(rèn)是高電平,你就可以設(shè)置為上拉輸入。看完輸入我們?cè)賮?lái)看輸出,輸出就有點(diǎn)講究:
開(kāi)漏輸出:
我們從圖中可以看出,當(dāng)我們外部IO口沒(méi)有電壓的時(shí)候其實(shí)這個(gè)功能是失效的,根本沒(méi)用,所以再我們?cè)O(shè)置開(kāi)漏的時(shí)候外部一定要接上拉電阻,這樣我們就可以通過(guò)控制CTRL端控制外部的輸入。
推挽輸出:
上圖就是推挽輸出,當(dāng)我們的CTRL信號(hào)為高電平的時(shí)候,Q1導(dǎo)通、Q3截至,IO口輸出高電平,當(dāng)CTRL信號(hào)輸出低電平的時(shí)候,Q1截至Q3導(dǎo)通,IO口輸出低電平。
而復(fù)用推挽輸出以及復(fù)用開(kāi)漏其實(shí)是作為第二功能時(shí)的配置說(shuō)明,使用方法與此方法一致。
講完了IO口的模式,我們?cè)賮?lái)講講STM32IO口的相關(guān)的寄存器,我們從下圖文檔中:
可以看出,每個(gè)通用IO口都有2個(gè)32位的配置寄存器,2個(gè)32位的數(shù)據(jù)寄存器,一個(gè)32位的置位/復(fù)位寄存器,一個(gè)16位的復(fù)位寄存器以及一個(gè)32位鎖存寄存器。我們先看通用IO口,在通用IO口的復(fù)位期間以及剛復(fù)位后,復(fù)用功能未開(kāi)啟狀態(tài),IO口是被設(shè)置成為浮空輸入的,所以這點(diǎn)我們要注意,在設(shè)計(jì)的時(shí)候一定要考慮到開(kāi)機(jī)的時(shí)候這些IO的狀態(tài)會(huì)不會(huì)影響我們的設(shè)計(jì),我之前在設(shè)計(jì)的時(shí)候就碰到過(guò)這樣的情況。我們看手冊(cè)中,有些特定的總線手冊(cè)給了我們一些GPIO的模式配置,這些配置在第9章的9.1.11章節(jié)中,我們以后配置的時(shí)候一定要看清楚是否與是按照這些配置來(lái)配置的,千萬(wàn)不要搞錯(cuò)了。
我們正式進(jìn)入GPIO寄存器相關(guān)知識(shí),我們先看GPIOx_CRL和GPIOx_CRH這兩個(gè)寄存器,這兩個(gè)寄存器是IO口配置寄存器,主要配置IO是輸入還是輸出以及IO口的速度。
我們先看復(fù)位的值,我們將0x4444 4444分解為二進(jìn)制,他的值就是0100 0100 0100 0100 0100 0100 0100 0100,我們將這些數(shù)字一一對(duì)應(yīng)帶入該寄存器的對(duì)應(yīng)位,我們拿MODE0和CNF0作為對(duì)象,可以知道CNF0[1:0] = 01 ,MODE0[1:0] = 00,通過(guò)這兩個(gè)數(shù)值然后根據(jù)下面的圖示查詢可以得出,默認(rèn)的狀態(tài)是InputMode,01:Floating Input狀態(tài),與我們之前手冊(cè)上的一致,這就是我們分析GPIOx_CRL與GPIOx_CRH寄存器的方法。
由于我們的引腳有16個(gè)引腳,而每個(gè)寄存器只能配置8個(gè)引腳,所以我們需要兩個(gè)寄存器來(lái)配置這些引腳。GPIOx_CRL配置的低8個(gè)引腳,而GPIOx_CRH配置的高8個(gè)的引腳。
分析完模式,我們?cè)賮?lái)分析端口輸入寄存器GPIOx_IDR。
我們從圖中可以看出,該寄存器的高16位作為預(yù)留位置未使用,而使用了低16位。該寄存器的IDR0~IDR15對(duì)應(yīng)的就是引腳0~15的輸入值,而高16位都是0,這些位只能是只讀的模式并且只能以字的形式讀出。
看完端口輸入寄存器我們?cè)賮?lái)看看端口輸出寄存器GPIO_ODR:
與GPIO_IDR相識(shí),端口輸出寄存器的高16位也是保留的,而只用了低16位,每一位都可以讀也可以寫(xiě)。ODR0控制這GPIOx_Pin0,ODR15控制這GPIOx_Pin15,這些位也只能以字(16位)的形式進(jìn)行操作。今天有點(diǎn)晚了,該休息了,明天接著寫(xiě),謝謝大家,大家晚安!!!!!
也希望大家勞逸結(jié)合,身體健康,喜歡我的朋友給我加個(gè)關(guān)注,有需要什么資料的也可以找我,我盡我所能給大家?guī)椭?#xff0c;謝謝大家了!!!!
總結(jié)
以上是生活随笔為你收集整理的1 io口 stm32_从STM32分享各种硬件以及总线之GPIO简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java8 lambda maplist
- 下一篇: simulink方框_4.4设计Simu