Linux系统下使用的C++类实现对GPIO的读、写操作封装

背景

嵌入式编程中对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大牛攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值