用户空间使用gpio原理
根据文档的说明,默认烧录的镜像提供了goio子系统的sysfs访问方式。可以通过echo 命令配置gpio。
注:sysfs是linux系统下一个基于内存的文件系统,主要功能是将设备(device)和驱动(driver)内容通过文件的方式从内核空间映射到用户空间,方便用户对设备和驱动进行访问和设置。
使用串口测试sysfs
在开发板的背面可以找到40pin引脚对应的gpio。经过测试,这里使用gpio5,gipo49,gpio50分别控制RGB三个LED灯。
使用USB线连接开发板,打开终端。
打开gpio5的设备节点
echo 5 > /sys/class/gpio/export
打开gpio49的设备节点
echo 49 > /sys/class/gpio/export
打开gpio50的设备节点
echo 50 > /sys/class/gpio/export
将gpio50设置为高电平输出
echo high > /sys/class/gpio50/direction
将gpio50设置为低电平输出
echo low > /sys/class/gpio50/direction
可以看到LED已被正常点亮和熄灭,如下图所示
编写Golang点灯程序
点灯程序需要引用三个库,fmt(print输出功能),OS(系统文件访问功能),time(定时和判断时间的功能)。程序如下
package main
import (
"fmt"
"os"
"time"
)
func main() {
redLed, _ := os.OpenFile("/sys/class/gpio/gpio5/value", os.O_RDWR, 6)
blueLed, _ := os.OpenFile("/sys/class/gpio/gpio50/value", os.O_RDWR, 6)
greennLed, _ := os.OpenFile("/sys/class/gpio/gpio49/value", os.O_RDWR, 6)
fmt.Println("open gpio ctrl files.")
defer redLed.Close()
defer blueLed.Close()
defer greennLed.Close()
ticker := time.Tick(time.Second)
var second = 0
for i := range ticker {
second = i.Second()
if second%2 == 0 {
redLed.Write([]byte{'1'})
fmt.Println("Set red high")
} else {
redLed.Write([]byte{'0'})
}
if (second/5)%2 == 0 {
blueLed.Write([]byte{'1'})
fmt.Println("Set blue high")
} else {
blueLed.Write([]byte{'0'})
}
if (second/10)%2 == 0 {
greennLed.Write([]byte{'1'})
fmt.Println("Set green high")
} else {
greennLed.Write([]byte{'0'})
}
}
}
编译并上传
运行以下命令编译程序
GOOS=linux GOARCH=arm go build main.go
运行以下命令上传可执行文件main(需要替换板子的ip地址)
scp main root@192.168.50.244:/mnt
最后在开发板的终端运行已上传的main程序
/mnt/main
使用该程序时应先打开gpio5,gipo49,gpio50的sysfs节点,否则无法运行成功。程序成功运行后,效果如视频所示。
参考资料
SSD20x-GPIO使用参考
golang操作gpio