pyboard
的GPIO
操作,通过pyb.Pin
类完成。上篇博客介绍了PIN
类。本次就来看看GPIO
的具体使用例子。首先说明,在pyb.Pin
类中定了所有的引脚名,而且有两种方式,pyb.Pin.cpu.Name
和pyb.Pin.board.Name
,说说这两种方式的区别。
- pyb.Pin.cpu.Name
:顾名思义,针对cpu
定义的。例如,pyb.Pin.cpu.A0
为芯片GPIO
的A0
输出口。
- pyb.Pin.board.Name
:顾名思义,针对pyboard
定义的。例如,pyb.Pin.board.X1
表示是pyboard
板子上的X1
接口,该X1
接口实际连接在芯片GPIO
的A0
输出口。所以pyb.Pin.cpu.A0
和pyb.Pin.board.X1
是同一个接口。
好了,来看看具体是怎么定义引脚的:
import pyb
x1_pin = pyb.Pin.board.X1
g = pyb.Pin(pyb.Pin.board.X1, pyb.Pin.IN)
所以上面的g
定义为pyboard
上面的X1
引脚,实际上就是芯片的A0
引脚,并且设置为输入模式。也可以简单地写为:
import pyb
g = pyb.Pin('X1', pyb.Pin.OUT_PP) # 底层是通过 'Pin.dict([fun])' 实现的
或者
import pyb
g = pyb.Pin('pyb.Pin.cpu.A0', pyb.Pin.OUT_PP)
自定义引脚名称可以通过字典方式,即Pin.dict([dict])
和映射函数方式Pin.mapper([fun])
,这两个函数都是Pin
类的静态函数。
import pyb
MyMapperDict = { 'LeftMotorDir' : pyb.Pin.cpu.C12 }
pyb.Pin.dict(MyMapperDict)
g = pyb.Pin("LeftMotorDir", pyb.Pin.OUT_OD)
字典方式很简单,只需要定义一个python
字典,键为自己取得名字,值为对应的引脚名,可以采用pyb.Pin.cpu.Name
和pyb.Pin.board.Name
。这个和C
语言中的宏定义差不多。当然,也可以查询自定义的引脚名称:
pin = pyb.Pin("LeftMotorDir")
import pyb
def MyMapper(pin_name):
if pin_name == "LeftMotorDir":
return pyb.Pin.cpu.A0
pyb.Pin.mapper(MyMapper)
g = pyb.Pin("LeftMotorDir", pyb.Pin.OUT_OD)
映射函数方式的套路都是一样的,用if
判断完成。调用pyb.Pin()
,会将第一个参数传入映射函数中,获取真正对应的引脚。概括一下,指定引脚总共5种方式:
pyb.Pin.cpu.Name
和pyb.Pin.board.Name
'X1'
cpu
符号的字符串,例如'A0'
可以使用pyb.Pin.debug(True)
这个去查看Pin是怎么通过映射找到对应的引脚的。
Pin.PULL_UP
和Pin.PULL_DOWN
如果使能,则相当于通过一个40k
欧姆的电阻分别上拉到3.3V
和下拉到GND
。但是引脚Y5
是通过11k
欧姆电阻上下拉的。
每当GPIO
引脚上出现下降缘时,就会执行回调。注意:机械按钮有“抖动”,按下或释放开关往往会产生多个边缘。这个也是在嵌入式开发中最基本的问题,需要进行消抖。