要求:將連接按鍵的IO口配置為上拉輸入,按鍵一端接IO口,一端接地,即當按鍵按下后,該IO口會產生一個下降沿,觸發下降沿中斷。 問題:將相應的IO口配置好后,測了引腳的的電壓,并不是3.3V左右,而是0.1V左右。于是猜想: 1. 外圍電路對IO口產生了影響。 2. STM32內部上拉能力較弱,一次只能上拉一個IO口。 于是開始從這兩個想法著手解決。首先第一個,很容易就排除了。將外圍電路撤掉,我用的是杜邦線,直接拔掉測量引腳上的電壓,依然是0.1V左右,于是第1個猜想排除。 第二個,查看萬能的參考手冊,發現每一個IO口都是有獨立的驅動電路,這樣第2個也排除了。 最后各種糾結,然后發現:在主函數的開頭部分初始化的時候,我把初始化的那個函數給注釋掉了。低級錯誤,見笑了。 現在總結一下: STM32的輸入有4種輸入模式: 模擬輸入 GPIO_AIN 用于AD轉換 浮空輸入 GPIO_IN_FLOATING 引腳處于浮空模式,電平狀態是不確定的。外部信號輸入什么,IO口就是什么狀態。 上拉輸入 GPIO_IPU 防止IO口出現不確定的狀態,比如,當IO口懸空時,就會通過內部的上拉電阻將該點鉗位在高電平。 下拉輸入 GPIO_IPD 功能與上拉電阻類似,防止IO口出現不確定的狀態,比如,當IO口懸空時,就會通過內部的下拉電阻將該點鉗位在低電平。 STM32中空的I/O管腳是高電平還是低電平取決于具體情況。 1、IO端口復位后處于浮空狀態,也就是其電平狀態由外圍電路決定。 2、STM32上電復位瞬間I/O口的電平狀態默認是浮空輸入,因此是高阻。做到低功耗。 3、STM32的IO管腳配置口默認為浮空輸入,把選擇權留給用戶,這是一個很大的優勢:一方面浮空輸入確保不會出現用戶不希望的默認電平(此時電平取決于用戶的外圍電路);另一方面降低了功耗,因為不管是上拉還是下拉都會有電流消耗。從另一個角度來看,不管I/O管腳的默認配置如何,還是需要在輸出的管腳外加上拉或下拉,這是為了保證芯片上電期間和復位時輸出的管腳始終處于已知的電平。 4、在沒有任何操作的情況下,STM32通用推挽輸出模式的引腳默認低電平,也就是有電的狀態。所以在配置的時候通常會先把引腳的電平設置拉高,讓電路不產生電流。有電到沒電這一過程也就是引腳電平從低到高的過程。 5、STM32的I/O管腳有兩種:TTL和CMOS,所有管腳都兼容TTL和CMOS電平。也就是說從輸入識別電壓上看,所有管腳不管是TTL管腳還是CMOS管腳都可以識別TTL或CMOS電平。 免費試聽C語言、電子、PCB、STM32、Linux、FPGA、Python等。想學習的你和我聯系預約就可以免費聽課了宋工Q3/5/2/4/6/5/9/0/8/8 Tel/WX:1/7/3/1/7/9/5/1/9/0/8 |