目的
GPIO口操作是微處理器上最常用的功能,這裏就對相關使用做個說明。
GPIO口基礎說明
MicroPython for ESP32 GPIO主要說明如下:
- 可以用的IO爲
0-19, 21-23, 25-27, 32-39
; 1
和3
分別爲UART0的TX和RX,即燒寫和默認調試用的端口;6~11
不推薦使用,因爲這幾個口接了燒錄程序用的flash;34~39
只能設置爲輸入模式,並且沒有內部上拉電阻;
這個地方說明其實和官方文檔有點出入,原因是使用的ESP32芯片具體型號差生的差異。這裏列出的信息適用於型號爲 ESP32-D0WD 的芯片。更詳細的信息可以參考樂鑫官方《ESP32 技術規格書》。
題外話:請注意ESP32的IO12,這個IO口上上電時的電平會決定外部flash(存放程序的那顆)的工作電壓,上電時該腳爲高則認爲flash工作於1.8V,爲低則認爲flash工作於3.3V。常用的像是Wroom-32系列模塊該腳內部已下拉,即flash是工作於3.3V的,若外部電路接強上拉則可能導致模塊工作異常。
函數說明
MicroPython中使用GPIO口主要是用到了 machine
模塊中的 Pin
類,具體函數說明如下:
class machine.Pin(id, mode=-1, pull=-1, *, value)
構造函數,用於聲明與初始化GPIO口對象:
id:GPIO編號,如使用GPIO13則此處填寫13;
mode:模式,可選Pin.IN
、Pin.OUT
、Pin.OPEN_DRAIN
;
pull:使用內部上下拉電阻,可選None
、Pin.PULL_UP
、Pin.PULL_DOWN
,部分IO口可以設置爲PULL_HOLD
模式,可以在深度睡眠時保持其狀態;
value:輸出或開漏模式下端口值,0爲低(off)、1爲高(on);Pin.init(mode=-1, pull=-1, *, value, drive, alt)
重新初始化GPIO口;Pin.value([x])
不填寫參數使用時返回端口的值,參數填寫0(False)、1(True)改變端口值;Pin.on()
輸出或開漏模式下將端口設置爲高;Pin.off()
輸出或開漏模式下將端口設置爲低;Pin.irq(handler=None, trigger=(Pin.IRQ_FALLING | Pin.IRQ_RISING), *,wake=None)
用於設置外部中斷:
handler:中斷觸發回調函數;
trigger:中高端觸發源可選下降沿上升沿或是一起使用;
wake:使能外部中斷喚醒睡眠,可設置爲WAKE_LOW
、WAKE_LOW
、WAKE_HIGH
;
使用演示
使用下面代碼進行測試:
# 將GPIO22和GPIO23用導線相連
from machine import Pin # 導入Pin模塊
import time # 導入Time模塊
p22 = Pin(22, Pin.OUT, value=0) # 初始化GPIO22
print('p22 value:%d'%p22.value()) # 打印GPIO22端口值
p23 = Pin(23, Pin.IN, Pin.PULL_DOWN) # 初始化GPIO23
print('p23 value:%d'%p23.value()) # 打印GPIO23端口值
def p23icb(self): # 中斷回調函數
print('irq - p23 value:%d'%p23.value()) # 打印GPIO23端口值
p23.irq(p23icb, Pin.IRQ_RISING) # GPIO23設置上升沿觸發中斷
while True:
time.sleep(1)
print('p22 turn off')
p22.off()
time.sleep(1)
print('p22 turn on')
p22.on() # 該動作會在GPIO23上產生上升沿,觸發中斷
總結
GPIO口的使用主要就這些,更多內容可以參考下面鏈接:
http://docs.micropython.org/en/latest/esp32/quickref.html#pins-and-gpio
http://docs.micropython.org/en/latest/library/machine.Pin.html