本文以J3第4脚为例说明,网络名为ENET2_TX0,对应的引脚名为ENET2_TX_DATA0,通过IMX6ULLRM.pdf可知该脚为GPIO2的IO11,所以该脚在Linux中对应为GPIO43(32+11=43).
使用命令控制GPIO
Linux支持应用程序通过sysfs在用户空间进行GPIO的控制或读取状态。
在用户空间使用GPIO- $ echo 43 > /sys/class/gpio/export
设置方向为输入- $ echo "in" > /sys/class/gpio43/direction
获取引脚电平- $ cat /sys/class/gpio43/value
设置方向为输出- $ echo "out" > /sys/closs/gpio43/direction
端口输出高点平- $ echo 1 > /sys/closs/gpio43/value
端口输出低点平- $ echo 0 > /sys/closs/gpio43/value
查看GPIO- $ cat /sys/kernel/debug/gpio
使用第三方包periph包操作GPIOperiph包通过sysfs控制硬件, 提供了GPIO,I²C,SPI,1-wire等硬件接口,和apa102, bme280, ds18b20, ds248x, lepton, ssd1306, tm1637等芯片的驱动,这里只介绍对GPIO部分。
使用Go的第三方包前需要先下载包的源码,使用以下命令即可下载
- $ go get periph.io/x/periph
使用时在Go代码中 import "periph.io/x/periph/xxx 即可引入。
控制LED
- import (
- "fmt"
- "os"
- "time"
- "periph.io/x/periph/conn/gpio"
- "periph.io/x/periph/host"
- "periph.io/x/periph/host/sysfs"
- )
先引入需要的包
使用periph包前需要初始化
- led, err := sysfs.LEDByName("user")
在开发板的D12在Linux中名字为user
关闭LED
点亮LED
完整代码如下
- package main
- import (
- "fmt"
- "os"
- "time"
- "periph.io/x/periph/conn/gpio"
- "periph.io/x/periph/host"
- "periph.io/x/periph/host/sysfs"
- )
- func main() {
- _, err := host.Init()
- check(err)
- led, err := sysfs.LEDByName("user")
- check(err)
- go func() {
- for {
- led.Out(gpio.Low)
- time.Sleep(time.Second)
- led.Out(gpio.High)
- time.Sleep(time.Second)
- }
- }()
- fmt.Println("Press enter key to exit")
- var b [1]byte
- os.Stdin.Read(b[:])
- led.Out(gpio.Low)
- }
- func check(err error) {
- if err != nil {
- panic(err)
- }
- }
控制GPIO这里使用GPIO43
- import (
- "log"
- "time"
- "fmt"
- "periph.io/x/periph/conn/gpio"
- "periph.io/x/periph/conn/gpio/gpioreg"
- "periph.io/x/periph/host"
- )
引入相关包
- func input(num int) {
- host.Init()
- p := gpioreg.ByNumber(num)
- if err := p.In(gpio.PullNoChange, gpio.FallingEdge); err != nil {
- log.Fatal(err)
- }
- fmt.Printf("%s is %sn", p, p.Read())
- for p.WaitForEdge(-1) {
- fmt.Printf("%s went %sn", p, gpio.Low)
- }
- }
获取端口状态, 参数num为端口号
- func output(num int, level gpio.Level) {
- host.Init()
- gpioreg.ByNumber(num).Out(level)
- if level {
- fmt.Println("output high")
- } else {
- fmt.Println("output low")
- }
- }
控制端口,num为端口号,level为端口状态,取值为gpio.High或gpio.Low
GPIO43输出高电平
- func blink(num int) {
- host.Init()
- p := gpioreg.ByNumber(num)
- for l := gpio.Low; ; l = !l {
- p.Out(l)
- time.Sleep(500 * time.Millisecond)
- }
- }
控制端口持续输出高低电平,num为端口号.