ARM技术论坛
直播中

jf_50393217

4年用户 200经验值
擅长:可编程逻辑 嵌入式技术
私信 关注

【触觉智能 Purple Pi开发板试用】2、使用Golang语言点灯

IMG_5257

用户空间使用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已被正常点亮和熄灭,如下图所示
led_on.png

编写Golang点灯程序

点灯程序需要引用三个库,fmt(print输出功能),OS(系统文件访问功能),time(定时和判断时间的功能)。程序如下

package main

import (
	"fmt"
	"os"
	"time"
)

func main() {
	//  打开 gpio5,gpio49,gpio50的控制文件
	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) // 定义一个1秒间隔的定时器
	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
upload.png

最后在开发板的终端运行已上传的main程序

/mnt/main

led_blink.png

使用该程序时应先打开gpio5,gipo49,gpio50的sysfs节点,否则无法运行成功。程序成功运行后,效果如视频所示。


参考资料

SSD20x-GPIO使用参考
golang操作gpio

回帖(1)

jf_50393217

2022-11-30 22:55:56
顺便测试了一下,Golang使用sysfs方式,IO翻转的效率,实测在80KHz这样,中间有少量的波形停顿。
代码如下
  1. package main

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

  6. func main() {
  7.         //  打开 gpio5,gpio49,gpio50的控制文件
  8.         redLed, _ := os.OpenFile("/sys/class/gpio/gpio5/value", os.O_RDWR, 6)
  9.         blueLed, _ := os.OpenFile("/sys/class/gpio/gpio50/value", os.O_RDWR, 6)
  10.         greennLed, _ := os.OpenFile("/sys/class/gpio/gpio49/value", os.O_RDWR, 6)
  11.         fmt.Println("open gpio ctrl files.")

  12.         // 延后释放资源
  13.         defer redLed.Close()
  14.         defer blueLed.Close()
  15.         defer greennLed.Close()
  16.         for {
  17.                 redLed.Write([]byte{'0'})
  18.                 redLed.Write([]byte{'1'})
  19.         }
  20. }


测试波形照片如下
gpio.png
举报

更多回帖

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