【MYS-6ULX-IOT试用体验】Go语言与GPIO: 3 使用periph包操作GPIO - 问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

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

刘 刚 ( 楼主 ) 2017-7-6 10:01:06  显示全部楼层
本文以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
已学习!                  
您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /6 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-3-29 18:46 , Processed in 0.480072 second(s), Total 68, Slave 49 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表