|
本帖最后由 redworlf007 于 2022-2-16 13:16 编辑
go语言在Windows上写好,直接编译成arm v5的程序,放到开发板上跑,不用自己搭建交叉编译环境。
Linux系统做成glibc的库。
以下是GPIO相关的函数,做成了一个包。
package gpio
import (
"fmt"
"os"
"strconv"
)
//GpioMapSlice 定义一个切片map表
var GpioMapSlice = make([]map[byte]byte, 9)
//GpioMapInit 初始化GPIO编号和驱动编号的对应表。
//PA15:A对应0,PA15的驱动编号计算方式、:0*32+15
func GpioMapInit() {
for index, _ := range GpioMapSlice {
GpioMapSlice[index] = make(map[byte]byte, 1)
GpioMapSlice[index][byte(index)+65] = byte(index)
}
// for index, value := range GpioMapSlice {
// fmt.Printf("index:%d value:%v\n", index, value)
// for K2, value := range GpioMapSlice[index] {
// // if K2 == 'G' {
// fmt.Printf("K2:%c value:%v\n", K2, value)
// // }
//}
// }
}
//FindPinNum 查表计算驱动编号
func FindPinNum(p byte, a int) (Driver_number int) {
for index, _ := range GpioMapSlice {
//fmt.Printf("index:%d value:%v\n", index, value)
for K2, value := range GpioMapSlice[index] {
if K2 == p {
//fmt.Printf("K2:%c value:%v\n", K2, value)
Driver_number = int(value)*32 + a
return Driver_number
}
}
}
return -1
}
//GpioGetGpioNumber 检查输入的GPIO号是否正确
func GpioGetDriverNumber(Port_Name string) (Driver_number int) {
//fmt.Println(Port_Name)
Driver_number = -1
var Slice = make([]byte, 4, 8)
Slice = []byte(Port_Name)
if Slice[0] == 'P' {
if Slice[1] >= 'A' && Slice[1] <= 'I' {
var a, _ = strconv.Atoi(string(Slice[2:]))
if a >= 0 && a <= 31 {
Driver_number = FindPinNum(Slice[1], a)
return Driver_number
} else {
Driver_number = -1
fmt.Println("Port_Name错误-1")
}
} else {
fmt.Println("Port_Name错误-2")
Driver_number = -2
}
} else {
fmt.Println("Port_Name错误-3")
Driver_number = -3
}
return Driver_number
}
//InitGpio 生成Linux系统里面的gpio文件
func InitGpio(Port_Name string) {
num := GpioGetDriverNumber(Port_Name)
file, err := os.OpenFile("/sys/class/gpio/export", os.O_WRONLY, 0666)
if err != nil {
fmt.Println("open file failed, err:", err)
return
}
defer file.Close()
var str = fmt.Sprintf("%d", num)
//fmt.Println(str)
file.WriteString(str)
}
//SetGpioDirection 设置GPIO方向,in:输入,out:输出
func SetGpioDirection(Port_Name string, Direction string) {
num := GpioGetDriverNumber(Port_Name)
var strs = fmt.Sprintf("/sys/class/gpio/gpio%d/direction", num)
file, err := os.OpenFile(strs, os.O_RDWR, 0666)
if err != nil {
fmt.Println("open file failed, err:", err)
return
}
defer file.Close()
file.WriteString(Direction)
}
//WriteGpioValue 设置GPIO输出高低电平,1:高电平,0:低电平
func WriteGpioValue(Port_Name string, value byte) {
num := GpioGetDriverNumber(Port_Name)
var strs = fmt.Sprintf("/sys/class/gpio/gpio%d/value", num)
file, err := os.OpenFile(strs, os.O_RDWR, 0666)
if err != nil {
fmt.Println("open file failed, err:", err)
return
}
defer file.Close()
var str = fmt.Sprintf("%d", value)
//fmt.Println(str)
file.WriteString(str)
}
*************************************************************************************************************************
*************************************************************************************************************************
//以下是main文件
package main
import (
"fmt"
"gpio_test/gpio"
"sync"
"time"
)
var wg sync.WaitGroup
//Bee_PA8 蜂鸣器
func Bee_PA8() {
for i := 0; i < 6; i++ {
gpio.WriteGpioValue("PA8", 1)
time.Sleep(time.Millisecond * 500)
gpio.WriteGpioValue("PA8", 0)
time.Sleep(time.Millisecond * 500)
}
wg.Done()
}
//LED_PC13 绿色指示灯
func LED_PC13() {
for {
gpio.WriteGpioValue("PC13", 1)
time.Sleep(time.Millisecond * 500)
gpio.WriteGpioValue("PC13", 0)
time.Sleep(time.Millisecond * 500)
}
//wg.Done()
}
//LED_PC13 红色指示灯
func LED_PC14() {
for {
gpio.WriteGpioValue("PC14", 1)
time.Sleep(time.Millisecond * 1000)
gpio.WriteGpioValue("PC14", 0)
time.Sleep(time.Millisecond * 1000)
}
//wg.Done()
}
func main() {
gpio.GpioMapInit() //初始化IO映射表
gpio.InitGpio("PA8")
gpio.SetGpioDirection("PA8", "out")
gpio.InitGpio("PC13")
gpio.SetGpioDirection("PC13", "out")
gpio.InitGpio("PC14")
gpio.SetGpioDirection("PC14", "out")
wg.Add(1)
Bee_PA8()
wg.Add(1)
go LED_PC13()
wg.Add(1)
go LED_PC14()
wg.Wait()
fmt.Println("进程退出")
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|