目的
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