[fireflyP] GPIO使用

本帖最后由 zhansb 于 2016-7-26 11:33 编辑

模块安装请参考:http://developer.t-firefly.com/thread-10503-1-2.html

fireflyP的GPIO使用独立于内核的gpio接口,即两边的控制互相独立。所以在控制GPIO时,要注意内核是否申请和控制了该GPIO,重复控制会导致不可预计的问题。

在python中使用help(Gpio)可以打印Gpio使用的方法,主要的接口有:
| init()
| Init GPIO function
| implement it before using Gpio
|
| get_level(self)
| Returns the level of the pin for input direction
| or return setting of the DR register for output gpios.
|
| set_dir(self, dir)
| set GPIO direction
| :dir: refer to GpioDir
|
| set_drv(self, drv)
| set GPIO drv
| :drv: refer to GpioDrv
|
| set_level(self, level)
| set GPIO output signal
| :level: refer to GpioLevel
|
| set_mux(self, mux)
| set GPIO mux
| :mux: refer to GpioMux
|
| set_pull(self, pull)
| set GPIO pull
| :pull: refer to GpioPull

GPIO使用的流程大致如下:
1.初始化Gpio:Gpio.init()
2.申请使用的GPIO,如:pin=Gpio(‘GPIO0B5’)
3.输入输出的控制:
3.1.设置成输出:
配置GPIO为输出,参数为Gpio.OUTPUT,如:pin.set_dir(Gpio.OUTPUT)
设置输出的电平,输出高电平参数为Gpio.HIGH,低电平为Gpio.LOW,如:pin.set_level(Gpio.HIGH)
3.2.设置成输入:
配置GPIO为输入,参数为Gpio.INPUT,如:pin.set_dir(Gpio.INPUT)
读取输入的电平,如:pin.get_level(),高电平时返回值为Gpio.HIGH,低电平为Gpio.LOW

其他接口介绍:

  • set_drv:设置GPIO的驱动能力,drv参数为Gpio.E_2MA,Gpio.E_4MA,Gpio.E_8MA,Gpio.E_12MA

  • set_mux:设置IO的复用功能,复用为GPIO时,mux参数为Gpio.MUX_GPIO(set_dir包含了set_mux(Gpio.MUX_GPIO),所以不需要再次调用)。mux其他值的意义具体可以参考RK3288 datesheet中“7.3.2 Detail Register Description ”的GRF_GPIOXX_IOMUX 寄存器的描述,比如gpio7a1,:

      gpio7a1_sel
      GPIO7A[1] iomux select
      1'b0: gpio
      1'b1: pwm_1
      因此pin.set_mux(Gpio.MUX_1)为设置gpio7a1功能为PWM1
    
  • set_pull:设置GPIO的上拉下拉,参数为Gpio.NORAML,Gpio.UP,Gpio.DOWN,Gpio.BUS_HOLD。分别对应RK3288 datesheet中的:

      2'b00: Z(Noraml operaton)
      2'b01: weak 1(pull-up)
      2'b10: weak 0(pull-down)
      2'b11: Repeater(Bus keeper)
    

下面讲个简单例子,用于控制开发板上黄色LED:
先看看黄色LED灯对应的引脚,如红色框内所示为GPIO8A2:

找到GPIO引脚定义后,我们就可以开始编写控制代码:

$sudo python
>>> from fireflyP import Gpio
>>> Gpio.init()
>>> LED_YELLOW="GPIO8A2"
>>> led_yellow=Gpio(LED_YELLOW)
>>> led_yellow.set_dir(Gpio.OUTPUT)  #set_dir 已经包含set_mux(Gpio.MUX_GPIO)
>>> led_yellow.set_level(Gpio.LOW)    #打开黄色LED

如下图红框所示,黄色LED灯已经点亮

>>> led_yellow.set_level(Gpio.HIGH)   #关闭黄色LED

关闭后的效果:

完整的demo可以参考github上的demo/gpio_test.py

赞,大赞

学习了

学习了!感谢

不错,学习学习

学习学习

感谢大神。看到这个python 的库受益匪浅。
另外问一下,看到所有的C、/C++教程都是针对内核编译,来控制GPIO(LED)的。
有没有对应的C/c++的库,来实现应用层控制GPIO的方法啊?

13920513512 发表于 2017-11-23 14:25
感谢大神。看到这个python 的库受益匪浅。
另外问一下,看到所有的C、/C++教程都是针对内核编译,来控制GP …

目前没有C/C++,可以参考python写一个,比较类似

zhansb 发表于 2017-11-23 14:28
目前没有C/C++,可以参考python写一个,比较类似

用C/C++,写应用层的时候,除了用read(),write()函数还有什么好的方法吗?

zhansb 发表于 2017-11-23 14:28
目前没有C/C++,可以参考python写一个,比较类似

用C/C++,写应用层的时候,除了用read(),write()函数还有什么好的方法吗?

"7.3.2 Detail Register Description " datasheet里面哪来这个章节? 你用的是哪个版本的datasheet,我的最多4.2

链接打不开啊,版主求助python库

AIO-RK3288 ubuntu
我设置set_pull时 系统直接死掉 怎么回事

不错 赞

正好在学这个,有点用~ 谢谢楼主

感谢大神的分享。。。。

无法使用 会提示这样的错误

系统版本为 RK3288-UBUNTU16.04

学习

运行 gpio_test.py 无效~ 灯状态无任何反应~