Pyboard基础功能探索---按键、GPIO

摘要:
在pyboard中,只定义了一个用户密钥。GPIO的按钮和LED实际上代表了使用GPIO的两种最基本的方法:输入和输出。这里是GPIO使用的完整介绍。获取Pin类˃˃帮助对象同种类型init-value--off-on--irq--1low-1high-˃名称--2ames-af_List--˃端口--3pin--5gpio--mode--˂function>pull-af--mapper--direct中的方法和相关类--debug--板--cpu-构造X1引脚和相关操作方法˃˃X1=pyb的实例。Pin˃˃x1Pin˃˃x1.init˃˃x1Pin˃˃在上述代码中,x1是Pin类的实例或对象,“x1”是此GPIO的别名,其芯片定义的名称为Pin.cpu.A0,即“A0”。

板载按键KEY 

 1.获取板载按键引脚名称

>>> help(pyb.Pin.board)
object <class 'board'> is of type type
...
 SW -- Pin(Pin.cpu.B3, mode=Pin.IN, pull=Pin.PULL_UP)
...

板载用户按键别名:SW,芯片定义的名称是B3.

2.获取Switch类里面的方法

>>> help(pyb.Switch)
object <class 'Switch'> is of type type
  value -- <function>
  callback -- <function>

 3.基本用法

>>> switch = pyb.Switch()  #构造一个Switch的对象
>>> switch()  #等价于switch.value()
False
>>> switch()
True
>>> switch.value()  #获取按键当前状态,True表示按下,False表示没有按下
False
>>> switch.value()
True
>>> switch.callback(lambda:pyb.LED(1).toggle())  #匿名函数
>>> def toggle_led():  #定义用于回调的函数
...     if switch.value():
...         pyb.delay(10)
...         if switch.value():
...             pyb.LED(2).toggle()
...             while switch.value():pass
...
...
...
>>> switch.callback(toggle_led)  #此处用于回调的函数里面是没有括号的

 switch.callback()是回调函数,功能类似C语言里的中断函数,当按下按键时将自动执行这个回调函数。

在pyboard中,只定义了一个用户按键。如果开发板上有多个按键,就需要自己去控制,而不能使用pyb.Switch()了。具体方法学习下面GPIO知识点就会了。

 GPIO的使用

按键和LED其实就代表了GPIO的两种最基本的使用方法:输入和输出,下面就完整地介绍GPIO的使用。

首先我们需要导入pyb中的Pin模块,然后就可以定义一个Pin对象,及其使用的引脚和功能。

获取Pin类里面的方法和相关的类

>>> help(pyb.Pin)
object <class 'Pin'> is of type type
  init -- <function>
  value -- <function>
  off -- <function>
  on -- <function>
  irq -- <function>
  low -- <function>
  high -- <function>
  name -- <function>
  names -- <function>
  af_list -- <function>
  port -- <function>
  pin -- <function>
  gpio -- <function>
  mode -- <function>
  pull -- <function>
  af -- <function>
  mapper -- <classmethod>
  dict -- <classmethod>
  debug -- <classmethod>
  board -- <class 'board'>
  cpu -- <class 'cpu'>

 构造一个X1引脚的实例以及相关的操作方法

>>> x1 = pyb.Pin('X1')  
>>> x1
Pin(Pin.cpu.A0, mode=Pin.IN)
>>> x1.init(pyb.Pin.OUT)
>>> x1
Pin(Pin.cpu.A0, mode=Pin.OUT)
>>>

上面代码中,x1就是Pin类的一个实例或者叫做一个对象,'X1'是这个GPIO的别名,它的芯片定义的名称是Pin.cpu.A0也就是'A0'。我们使用这个Pin类里面的方法,x1.init(pyb.Pin.OUT)引脚的初始化操作也就是将引脚设置成输入或输出。

在MicroPython中,可以用init()函数的功能:将GPIO设置输入或者输出模式,其中的输入可以设置内部的上拉下拉电阻状态,而输出还可以设置推挽方式输出和开漏输出:

>>> x1.init(pyb.Pin.OUT_PP)  #设置为推挽方式输出
>>> x1.init(pyb.Pin.OUT_OD)  #设置为开漏方式输出
>>> x1.init(pyb.Pin.IN)  #设置为输入
>>> x1.init(pyb.Pin.IN,pull=pyb.Pin.PULL_UP)  #设置为输入并使用内部上拉电阻
>>> x1.init(pyb.Pin.IN,pull=pyb.Pin.PULL_DOWN) #设置为输入并使用内部下拉电阻

 上面的Pin可以用from pyb import Pin导入,这样子做的好处:使代码简洁。

>>> from pyb import Pin
>>> x1 = Pin('A0')
>>> x1

Pin(Pin.cpu.A0, mode=Pin.IN)
>>> x1.init(Pin.OUT_PP)

>>> x1
Pin(Pin.cpu.A0, mode=Pin.OUT)

>>> x1.init(Pin.IN)

>>> x1
Pin(Pin.cpu.A0, mode=Pin.IN)

>>> x1.init(Pin.IN,Pin.PULL_UP)
>>> x1
Pin(Pin.cpu.A0, mode=Pin.IN, pull=Pin.PULL_UP)
>>>

需要下拉电阻时设置pull参数为:pull=PULL_DOWN,而不需要上拉下拉电阻时就设置pull=PULL_NONE。

上面是将 GPIO 的定义和模式分开设置的,这样比较好理解。但是通常情况下,我们会将它们放在一起定义,这样更加简洁高效,如:

>>> from pyb import Pin
>>> x1 = Pin(Pin.cpu.A0,Pin.OUT_PP)

>>> x1
Pin(Pin.cpu.A0, mode=Pin.OUT)

>>> x1 = Pin(Pin.cpu.A0,Pin.IN,pull=Pin.PULL_UP)

>>> x1
Pin(Pin.cpu.A0, mode=Pin.IN, pull=Pin.PULL_UP)

对于GPIO的输出值(1/0)我们可以控制其高低电平,而输入是不可以的(除非你设置它的内部上拉电阻和下拉电阻):

>>> x1 = Pin('X1',Pin.IN)
>>> x1
Pin(Pin.cpu.A0, mode=Pin.IN)
>>> x1.high()
>>> x1
Pin(Pin.cpu.A0, mode=Pin.IN)
>>> x1.value()
0
>>> x1.init(Pin.OUT)
>>> x1
Pin(Pin.cpu.A0, mode=Pin.OUT)
>>> x1.high()
>>> x1.value()
1

 GPIO的输入测试部分

>>> x5 = Pin('X5',Pin.IN)
>>> x5.value()
0
>>> x5.value()
1
>>> x5.value()
0
>>> x5.value()
0
>>> x5.value()
0
>>> x5.value()
0
>>> x5.value()
0
>>> x5.value()
0
>>> x5.value()
1
>>> x5.value()
0
>>> x5.init(Pin.IN,pull=Pin.PULL_UP)
>>> x5()
1
>>> x5()
1
>>> x5()
1
>>> x5()
1
>>> x5()
1
>>> x5()
1
>>> x5()
1
>>> x5()
1
>>> x5.init(Pin.IN,pull=Pin.PULL_DOWN)
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5.init(Pin.IN,pull=Pin.PULL_NONE)
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
1
>>> x5()
0
>>> x5()
1
>>> x5()
0

 结论:对于输入模式下的通用输入引脚(Pin.IN)的电平状态是不确定的,而使用上拉电阻时电平状态一直是高电平状态,使用下拉电阻时就一直是低电平,而Pin.PULL_NONE和通用输入是一样的,引脚的电平状态也无法确定。(高阻态)

GPIO的输出测试部分

>>> x5 = Pin('X5',Pin.OUT)
>>> x5
Pin(Pin.cpu.A4, mode=Pin.OUT)
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5.init(Pin.OUT_PP)
>>> x5
Pin(Pin.cpu.A4, mode=Pin.OUT)
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5.high()
>>> x5()
1
>>> x5.low()
>>> x5()
0
>>> x5.on()
>>> x5()
1
>>> x5.off()
>>> x5()
0
>>> x5.init(Pin.OUT_OD)
>>> x5
Pin(Pin.cpu.A4, mode=Pin.OPEN_DRAIN)
>>> x5()
0
>>> x5.high()
>>> x5()
1
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
0
>>> x5()
1
>>> x5()
0
>>> x5()
0
>>> x5()
1
>>> x5()
0
>>> x5()
0
>>> x5()
0

 结论:GPIO输出模式通用模式时的输出电平一直为低电平,相关输出操作方法(GPIO输出相关的方法:x1.high()、x1.low()、x1.on()、x1.off())也是可以直接使用的,但是在开漏模式下输出引脚的电平状态是不确定的,需要外接一个上拉电阻,才可以输出稳定的高电平。

推挽输出:可以输出高、低电平。

开漏输出:输出端相当于三极管的集电极,要得到稳定的电平状态只能是依靠上拉电阻得到稳定的高电平,电压取决于你的上拉电阻,所有好处是可以输出可以调节的电压。

像上面电平一直浮动的状态叫做高阻态。

 Pyboard基础功能探索---按键、GPIO第1张

  详细说明地址:推挽输出和开漏输出

 引脚中断的方法:

Pin.irq(handler=None, trigger=(Pin.IRQ_FALLING | Pin.IRQ_RISING), priority=1, wake=None, hard=False)

 中断相关资料地址https://www.cnblogs.com/iBoundary/p/11508565.html

对于GPIO的引脚电平状态我们可以使用value()或者直接x1()读取

 af,当mode是Pin.AF_PP或Pin.AF_OD时,可以选择第二功能索引或名称

 af_list()

返回GPIO的第二功能列表,如:

>>> pyb.Pin.af_list(pyb.Pin('X1'))
[Pin.AF1_TIM2, Pin.AF1_TIM2, Pin.AF2_TIM5, Pin.AF3_TIM8, Pin.AF7_USART2, Pin.AF8_UART4]

 通过这个函数,我们可以具体查看一个GPIO有哪些第二功能。

af()

 返回GPIO第二功能索引值,如果没有使用第二功能将返回0,否则返回实际的索引值。

 注意这个索引值并不是对应af_list()函数返回的列表,而是控制器手册中的第二功能映射表。PYB V10使用的控制器是STM32F405RG,可以参考它的数据手册第61页的“Table 9.Alternate function mapping”。

如,PA11是AF10_OTG_FS_DM功能:

>>> pyb.Pin.af_list(pyb.Pin('A11'))
[Pin.AF1_TIM1, Pin.AF7_USART1, Pin.AF9_CAN1]
>>> pyb.Pin.af(pyb.Pin('A11'))
10

SCPyboard基础功能探索---按键、GPIO第2张

 手册地址https://www.st.com/resource/en/datasheet/stm32f405rg.pdf

gpio()

当前GPIO关联寄存器的基本地址。

mode()

设置或获取GPIO的模式,mode含义可以参考init()函数中相关参数的说明。

name()

返回GPIO的名称。

names()

返回GPIO和别名。

pin()

返回引脚在端口中的序号。

port()

返回端口序号。

>>> sw.port()
1

端口A的序号是0,端口B的序号是1,端口C的序号是2,以此类推。按键sw对应的引脚是B3,因此返回值是1。

pull()

引脚的上拉状态。具体参数含义参考init()函数中pull参数。

免责声明:文章转载自《Pyboard基础功能探索---按键、GPIO》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python 绘图---2D、3D散点图、折线图、曲面图【转】用Python实现各种排序算法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

openwrt的GPIO控制

为什么有些GPIO可以在/sys/class/gpio中控制,而有些不行呢? 先来看一看普通不需要C程序而是使用脚本的控制方法(Linux普遍适用): First step is making GPIO available inLinux: echo "29" > /sys/class/gpio/export then you need to d...

基于335X的UBOOT网口驱动分析

基于335X的UBOOT网口驱动分析     一、软硬件平台资料 1、  开发板:创龙AM3359核心板,网口采用RMII形式 2、  UBOOT版本:U-Boot-2016.05,采用FDT和DM。 参考链接: https://blog.csdn.net/hahachenchen789/article/details/53339181   二、网口相关代...

ESP8266-12F

读者可以把ESP8266当做Arduino+WiFi功能来开发   ESP8266模块支持STA/AP/STA+AP 三种工作模式: STA 模式:ESP8266模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制 AP模式:ESP8266模块作为热点,实现手机或电脑直接与模块通信,实现局域网无线控制 ESP8266-12F引脚图:  分...

几个串口协议学习整理

一、UART UART是一个大家族,其包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范。它们的主要区别在于其各自的电平范围不相同。 嵌入式设备中常常使用到的是TTL、TTL转RS232的这种方式。常用的就三根引线:发送线TX、接收线RX、电平参考地线GND。  1.1    电路示意图   1.2    通信协议...

[Android6.0][RK3399] 电池系统(三)电量计 CW2015 驱动流程分析【转】

本文转载自:http://blog.csdn.net/dearsq/article/details/72770295 Platform: RK3399OS: Android 6.0Kernel: 4.4Version: v2017.04IC: TI BQ25700、RK808 已知问题 驱动分析函数调用链 已知问题 cw2015 的代码默认是 r...

基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(1)

作者:彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台tiny4412 ADK Linux-4.9   概述前面几篇博文列举了在有设备树的时候,gpio中断的用法示例。下面我们尝试分析一下Linux内核是如何做到的,如果哪写的有问题,欢迎大家批评指正,谢谢。 还是以GPIO中断为例分析,对于tiny4412,gpi...