單片機STM32的幾種輸入模式以及外部中斷的配置
最近做畢業(yè)設(shè)計,需要用按鍵來觸發(fā)外部中斷。實驗的時候是正常的,但是換了個核心板以及用上自己做的PCB電路板后,出現(xiàn)了一些問題。問題如下:
要求:將連接按鍵的IO口配置為上拉輸入,按鍵一端接IO口,一端接地,即當按鍵按下后,該IO口會產(chǎn)生一個下降沿,觸發(fā)下降沿中斷。
問題:將相應(yīng)的IO口配置好后,測了引腳的的電壓,并不是3.3V左右,而是0.1V左右。于是猜想:
1. 外圍電路對IO口產(chǎn)生了影響。
2. STM32內(nèi)部上拉能力較弱,一次只能上拉一個IO口。
于是開始從這兩個想法著手解決。首先第一個,很容易就排除了。將外圍電路撤掉,我用的是杜邦線,直接拔掉測量引腳上的電壓,依然是0.1V左右,于是第1個猜想排除。
第二個,查看萬能的參考手冊,發(fā)現(xiàn)每一個IO口都是有獨立的驅(qū)動電路,這樣第2個也排除了。
最后各種糾結(jié),然后發(fā)現(xiàn):在主函數(shù)的開頭部分初始化的時候,我把初始化的那個函數(shù)給注釋掉了。低級錯誤,見笑了。
現(xiàn)在總結(jié)一下:
STM32的輸入有4種輸入模式:
模擬輸入 GPIO_AIN
用于AD轉(zhuǎn)換
浮空輸入 GPIO_IN_FLOATING
引腳處于浮空模式,電平狀態(tài)是不確定的。外部信號輸入什么,IO口就是什么狀態(tài)。
上拉輸入 GPIO_IPU
防止IO口出現(xiàn)不確定的狀態(tài),比如,當IO口懸空時,就會通過內(nèi)部的上拉電阻將該點鉗位在高電平。
下拉輸入 GPIO_IPD
功能與上拉電阻類似,防止IO口出現(xiàn)不確定的狀態(tài),比如,當IO口懸空時,就會通過內(nèi)部的下拉電阻將該點鉗位在低電平。
STM32中空的I/O管腳是高電平還是低電平取決于具體情況。
1、IO端口復(fù)位后處于浮空狀態(tài),也就是其電平狀態(tài)由外圍電路決定。
2、STM32上電復(fù)位瞬間I/O口的電平狀態(tài)默認是浮空輸入,因此是高阻。做到低功耗。
3、STM32的IO管腳配置口默認為浮空輸入,把選擇權(quán)留給用戶,這是一個很大的優(yōu)勢:一方面浮空輸入確保不會出現(xiàn)用戶不希望的默認電平(此時電平取決于用戶的外圍電路);另一方面降低了功耗,因為不管是上拉還是下拉都會有電流消耗。從另一個角度來看,不管I/O管腳的默認配置如何,還是需要在輸出的管腳外加上拉或下拉,這是為了保證芯片上電期間和復(fù)位時輸出的管腳始終處于已知的電平。
4、在沒有任何操作的情況下,STM32通用推挽輸出模式的引腳默認低電平,也就是有電的狀態(tài)。所以在配置的時候通常會先把引腳的電平設(shè)置拉高,讓電路不產(chǎn)生電流。有電到?jīng)]電這一過程也就是引腳電平從低到高的過程。
5、STM32的I/O管腳有兩種:TTL和CMOS,所有管腳都兼容TTL和CMOS電平。也就是說從輸入識別電壓上看,所有管腳不管是TTL管腳還是CMOS管腳都可以識別TTL或CMOS電平。
編輯:admin 最后修改時間:2018-05-19