背景
嵌入式编程中对GPIO的读写操作是最常见的应用的了,这里介绍一种C++类操作GPIO的方式,涉及代码,以源代码的形式提供,方便快速嵌入实际项目开发;这种操作GPIO的方法类似MCU,直接一行代码实现IO的读写,其实质是封装了/sys/class/gpio的读写。代码实现了GPIO初始化、读、写等操作,针对Linux下操作GPIO提供了一套标准流程,同时可以应用于多种Linux平台,最后以zynq平台做测试,但是该代码不单单应用于zynq,像其他运行Linux的芯片平台,都可以使用。
资源下载
本文使用的资源下载链接如下
https://download.youkuaiyun.com/download/li171049/90512148
应用层使用介绍
初始化GPIO
Gpioctl gpioctl;
while(1)
{
gpioctl.blink_test();
}
void Gpioctl::GpioctlInit(void)
{
PANEL_LED1_pin_mesg.pin = PANEL_LED1_PIN_NUM;
PANEL_LED1_pin_mesg.inout_flags = OUT;
gpio_export(&PANEL_LED1_pin_mesg);//生成gpio节点
gpio_direction(&PANEL_LED1_pin_mesg);//设置方向
gpio_write(&PANEL_LED1_pin_mesg, 0);
}
对GPIO的读写操作
int Gpioctl::gpio_write(struct pin_mesg* mesg, char value){
char path[64];
int fd;
char *value_str;
if(value == 1)
value_str = "1";
if(value == 0)
value_str = "0";
sprintf(path, "/sys/class/gpio/gpio%d/value", mesg->pin);
dbg_info("value path: %s, value = %s\n", path,value_str);
fd = open(path, O_RDWR);
if (fd < 0) {
perror("open value");
return -1;
}
int res = write(fd, value_str, sizeof(value_str));
if (res <= 0) {
perror("write value");
return -1;
}
close(fd);
return 0;
}
总结
上述对GPIO的操作主要通过Gpioctl::gpio_write完成,实现了类方式操作GPIO。
zynq平台测试
宏定义说明
首先对zynq的平台IO的宏定义,这里可以修改为自己开发板的IO编号,注意zynq平台的IO编号,参考文档
https://blog.youkuaiyun.com/li171049/article/details/130378930
这里要说明的是,每个平台的IO编号差异比较大,修改后要找到自己平台的IO编号。
#define MIO0_PIN_NUM (906)
#define PANEL_LED1_PIN_NUM (MIO0_PIN_NUM + +54 + 0)
测试函数
闪灯测试函数如下:
void Gpioctl::blink_test(void)
{
gpio_write(&PANEL_LED1_pin_mesg, 1);
usleep(200000);
gpio_write(&PANEL_LED1_pin_mesg, 0);
usleep(200000);
}
主函数中调用
int main(int argc, char* const argv[])
{
Gpioctl gpioctl;
while(1)
{
gpioctl.blink_test();
}
return 0;
}
makefile编写
EXEC = gpio
OBJS = Gpioctl.cpp main.cpp
CROSS = arm-linux-gnueabihf-
CC = $(CROSS)g++
STRIP = $(CROSS)strip
CFLAGS = -g -O2
all: clean $(EXEC)
$(EXEC):$(OBJS)
$(CC) $(CFLAGS) -o $@ $(OBJS) -lpthread
clean:
-rm -f $(EXEC) *.o
注意事项
- Sysfs接口需要文件系统操作权限(通常需要root)
- GPIO编号需要根据实际硬件平台确定
- 高频操作推荐使用libgpiod(性能更好)
资源下载
本文使用的资源下载链接如下
https://download.youkuaiyun.com/download/li171049/90512148