问答
直播中

刘 刚

10年用户 42经验值
擅长:6933
私信 关注

【MYS-6ULX-IOT试用体验】Go语言与GPIO: 3 使用periph包操作GPIO

本文以J3第4脚为例说明,网络名为ENET2_TX0,对应的引脚名为ENET2_TX_DATA0,通过IMX6ULLRM.pdf可知该脚为GPIO2的IO11,所以该脚在Linux中对应为GPIO43(32+11=43).

使用命令控制GPIO
Linux支持应用程序通过sysfs在用户空间进行GPIO的控制或读取状态。
在用户空间使用GPIO
  1. $ echo 43 > /sys/class/gpio/export

设置方向为输入
  1. $ echo "in" > /sys/class/gpio43/direction

获取引脚电平
  1. $ cat /sys/class/gpio43/value

设置方向为输出
  1. $ echo "out" > /sys/closs/gpio43/direction

端口输出高点平
  1. $ echo 1 > /sys/closs/gpio43/value

端口输出低点平
  1. $ echo 0 > /sys/closs/gpio43/value

查看GPIO
  1. $ cat /sys/kernel/debug/gpio

使用第三方包periph包操作GPIO
periph包通过sysfs控制硬件, 提供了GPIO,I²C,SPI,1-wire等硬件接口,和apa102, bme280, ds18b20, ds248x, lepton, ssd1306, tm1637等芯片的驱动,这里只介绍对GPIO部分。
使用Go的第三方包前需要先下载包的源码,使用以下命令即可下载
  1. $ go get periph.io/x/periph

使用时在Go代码中 import "periph.io/x/periph/xxx 即可引入。

控制LED
periph支持使用LED设备名控制LED,这里重新实现 Go语言与GPIO: 1 控制用户LED中的例子


  1. import (
  2.     "fmt"
  3.     "os"

  4.     "time"

  5.     "periph.io/x/periph/conn/gpio"
  6.     "periph.io/x/periph/host"
  7.     "periph.io/x/periph/host/sysfs"
  8. )
先引入需要的包

  1. _, err := host.Init()
使用periph包前需要初始化

  1. led, err := sysfs.LEDByName("user")
开发板的D12在Linux中名字为user

关闭LED
  1. led.Out(gpio.Low)

点亮LED
  1. led.Out(gpio.High)

完整代码如下
  1. package main

  2. import (
  3.     "fmt"
  4.     "os"

  5.     "time"

  6.     "periph.io/x/periph/conn/gpio"
  7.     "periph.io/x/periph/host"
  8.     "periph.io/x/periph/host/sysfs"
  9. )

  10. func main() {
  11.     _, err := host.Init()
  12.     check(err)
  13.     led, err := sysfs.LEDByName("user")
  14.     check(err)

  15.     go func() {
  16.         for {
  17.             led.Out(gpio.Low)
  18.             time.Sleep(time.Second)
  19.             led.Out(gpio.High)
  20.             time.Sleep(time.Second)
  21.         }
  22.     }()
  23.     fmt.Println("Press enter key to exit")
  24.     var b [1]byte
  25.     os.Stdin.Read(b[:])
  26.     led.Out(gpio.Low)
  27. }

  28. func check(err error) {
  29.     if err != nil {
  30.         panic(err)
  31.     }
  32. }

控制GPIO
这里使用GPIO43
  1. import (
  2.     "log"
  3.     "time"

  4.     "fmt"

  5.     "periph.io/x/periph/conn/gpio"
  6.     "periph.io/x/periph/conn/gpio/gpioreg"
  7.     "periph.io/x/periph/host"
  8. )
引入相关包

  1. func input(num int) {
  2.     host.Init()
  3.     p := gpioreg.ByNumber(num)
  4.     if err := p.In(gpio.PullNoChange, gpio.FallingEdge); err != nil {
  5.         log.Fatal(err)
  6.     }
  7.     fmt.Printf("%s is %sn", p, p.Read())

  8.     for p.WaitForEdge(-1) {
  9.         fmt.Printf("%s went %sn", p, gpio.Low)
  10.     }
  11. }
获取端口状态, 参数num为端口号

  1. func output(num int, level gpio.Level) {
  2.     host.Init()
  3.     gpioreg.ByNumber(num).Out(level)
  4.     if level {
  5.         fmt.Println("output high")
  6.     } else {
  7.         fmt.Println("output low")
  8.     }
  9. }
控制端口,num为端口号,level为端口状态,取值为gpio.High或gpio.Low
  1. output(43, gpio.High)
GPIO43输出高电平


  1. func blink(num int) {
  2.     host.Init()
  3.     p := gpioreg.ByNumber(num)
  4.     for l := gpio.Low; ; l = !l {
  5.         p.Out(l)
  6.         time.Sleep(500 * time.Millisecond)
  7.     }
  8. }
控制端口持续输出高低电平,num为端口号.



回帖(1)

jinglixixi

2018-4-19 08:43:28
已学习!                  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分