首页 > 系统相关 >在linux中无需修改内核驱动就能操作GPIO口的示例

在linux中无需修改内核驱动就能操作GPIO口的示例

时间:2024-03-24 20:03:35浏览次数:27  
标签:示例 linux sys start time GPIO gpio class

一、首先编写一个脚本文件init.sh

#!/bin/bash
echo 2 > /sys/class/gpio/export
sleep 1
echo 3 > /sys/class/gpio/export
sleep 1
echo out > /sys/class/gpio/gpio3/direction
echo 1 > /sys/class/gpio/gpio3/value

这段代码是在Linux系统中使用shell脚本语言编写的。让我们逐行解释:

1. `echo 2 > /sys/class/gpio/export`: 这一行将数字2写入了`/sys/class/gpio/export`文件中。在Linux系统中,GPIO(通用输入输出)设备通过/sys/class/gpio目录暴露给用户空间。将数字写入export文件相当于请求系统启用对应的GPIO引脚。在这里,数字2表示要启用的GPIO引脚编号。

2. `sleep 1`: 这一行是让脚本暂停执行1秒钟,这么做是为了确保前面的GPIO引脚启用操作已经完成。

3. `echo 3 > /sys/class/gpio/export`: 类似于第一行,这里将数字3写入`/sys/class/gpio/export`文件中,请求系统启用另一个GPIO引脚,这次是引脚编号3。

4. `sleep 1`: 再次使用了`sleep`命令,暂停1秒钟。

5. `echo out > /sys/class/gpio/gpio3/direction`: 这一行将字符串"out"写入`/sys/class/gpio/gpio3/direction`文件中,告诉系统将GPIO引脚3设置为输出模式。

6. `echo 1 > /sys/class/gpio/gpio3/value`: 最后一行将数字1写入了`/sys/class/gpio/gpio3/value`文件中,这会将GPIO引脚3的值设置为高电平(1),这样就向这个引脚输出了一个逻辑高电平信号。

综上所述,这段代码的作用是在Linux系统中通过shell脚本操作GPIO引脚,启用并设置了两个GPIO引脚(编号2和3),并将GPIO引脚3设置为输出模式,并向其输出高电平信号。

 二、将该脚本文件放到linux系统中的启动文件(例如、etc/init.d/rcS)

三、可以在程序中对GPIO进行操作

该程序是对GPIO2与GPIO3的程序操作示例


#define GPIO_PATH3 "/sys/class/gpio/gpio3/value"
#define GPIO_PATH2 "/sys/class/gpio/gpio2/value"
int open_gpio3() {
    int fd = open(GPIO_PATH3, O_WRONLY);
    if (fd == -1) {
        perror("Error opening file");
        return -1;
    }
    return fd;
}
void close_gpio(int fd) {
    close(fd);
}

int write_gpio(int fd, char value_char) {
    if (write(fd, &value_char, 1) < 1) {
        perror("Error writing to file");
        return -1;
    }
    return 0;
}

void blink_led(float interval_seconds, float duration_seconds) {
    int fd = open_gpio3();
    if (fd == -1) {
        return;
    }

    char value_char;
    float total_time = 0;

    while (total_time < duration_seconds) {
        // 亮
        value_char = '1';
        if (write_gpio(fd, value_char) == -1) {
            break;
        }
        usleep((unsigned int)(interval_seconds * 1e6));  // 将秒转换为微秒

        // 灭
        value_char = '0';
        if (write_gpio(fd, value_char) == -1) {
            break;
        }
        usleep((unsigned int)(interval_seconds * 1e6));  // 将秒转换为微秒

        total_time += 2 * interval_seconds;  // 亮和灭各占用一个 interval_seconds
    }

    close_gpio(fd);
}
void *thr_LEDTask(void *cookie)
{
	while (pthread_isrun)
	{
		
		if(_plcinfo.InitWhiteFlag == 2)
		{
			printf ("test\n");
			blink_led(5,120);
			if(_plcinfo.bundsuccess==3)
			{
				printf ("test1\n");
				blink_led(1,5);
				turn_on_led();
			}
			else if (_plcinfo.bundsuccess ==2 || _plcinfo.bundsuccess==1)
			{
				blink_led(3,18);
				blink_led(1,100);

			}
		}
		switch (_pebinfo.start_wifi) {
			case 10:
				printf("开始配网\n");
				printf("start_wifi=%d\n", _pebinfo.start_wifi);
				blink_led(2, 30);
				printf("start_wifi=%d\n", _pebinfo.start_wifi);
				break;

			case 20:
				printf("配网成功\n");
				turn_on_led();
				printf("start_wifi=%d\n", _pebinfo.start_wifi);
				_pebinfo.start_wifi = 0;
				break;

			case 30:
				printf("配网失败\n");
				blink_led(1, 100);
				printf("start_wifi=%d\n", _pebinfo.start_wifi);
				_pebinfo.start_wifi = 0;
				break;

			default:
				break;
		}


	sleep(1);
		
	}
	printf("-------------thr_databaseTask end\n");
	fflush(stdout);
}

void *thr_KEYTask(void *cookie)
{
	int button_state;
	time_t start_time, end_time;

	while (pthread_isrun) {
		while ((button_state = read_gpio_value()) != 1) {
			// 等待按键按下
			usleep(500000);  // 每 500 毫秒检测一次
		}
		time(&start_time);
		printf("Button pressed, start_time: %ld\n", start_time);  // 添加调试信息

		do {
			usleep(500000);  // 每 500 毫秒检测一次
			time(&end_time);
			button_state = read_gpio_value();  // 重新读取按钮状态
		} while (button_state == 1 && difftime(end_time, start_time) < 10);

		printf("Button released, end_time: %ld\n", end_time);  // 添加调试信息

		if (difftime(end_time, start_time) >= 10 && difftime(end_time, start_time) <= 15) {
			printf("Button pressed for 10 seconds.\n");
			system("/usr/sbin/create_ap_ubuntu.sh");
			blink_led(0.2, 10);
		}

		if (difftime(end_time, start_time) > 15) {
			printf("Button pressed for more than 15 seconds.\n");
			//system("/usr/sbin/wifi_sta.sh");
			blink_led(1, 20);
		}

		sleep(1);
	}



	printf("-------------thr_databaseTask end\n");
	fflush(stdout);
}

标签:示例,linux,sys,start,time,GPIO,gpio,class
From: https://blog.csdn.net/m0_67545273/article/details/136808446

相关文章

  • Linux学习记录13——shell脚本
    一.学习的内容    shell终端解释器提供了诸如循环、分支等高级编程语言才有的控制结构。shell脚本命令的工作方式有下面两种:    交互式:用户每输入一条命令就立即执行        批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本......
  • linux 下安装mysql redis
    查看是否安装mysql:rpm-qa|grepmysql获取mysql版本:wget-i-chttp://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm安装:rpm-ivhmysql-community-release-el7-5.noarch.rpmyuminstallmysql-community-serversystemctlstartmysqldsystemctlrest......
  • 【Linux应用开发】gcc编译过程
            gcc是一个c编译器,​可以将源代码转换为可执行程序。编译过程包括了预处理、编译、汇编和链接这四个阶段。预处理(Preprocessing):在预处理阶段,源代码会经过预处理器的处理,包括展开宏定义、包含头文件、条件编译等操作。预处理器会生成一个经过预处理的中间文件......
  • Linux收到一个网络包是怎么处理的?
    目录摘要​编辑1从网卡开始2硬中断,有点短2.1GameOver3接力——软中断3.1NET_RX_SOFTIRQ软中断的开始3.2数据包到了协议栈3.3网络层处理3.4传输层处理4应用层的处理5总结摘要    一个网络包的接收始于网卡,经层层协议栈的解析,终于应用层。......
  • Docker的Linux网络基础
    Docker技术依赖于近年来Linux内核虚拟化技术的发展,所以Docker对Linux内核有很强的依赖。本文将Docker使用到的与Linux网络有关的主要技术进行简单介绍。 一、网络命名空间为了支持网络协议栈的多个实例,Linux在网络栈中引入了网络命名空间,这些独立的协议......
  • mysql索引设计的注意事项(大量示例,收藏再看)
    mysql索引设计的注意事项(大量示例,收藏再看) 开发技术  开发技术 2019-03-29 8362次浏览目录一、索引的重要性二、执行计划上的重要关注点(1).全表扫描,检索行数(2).key,usingindex(覆盖索引)(3).通过key_len确定究竟使用了复合索引的几个索引字段(4)orderby和U......
  • linux curl p12请求
    ##查看curl版本curl-V##查看curl指令curl--help#--cert证书#--cert-typeTYPECertificatefiletype(DER/PEM/ENG)(SSL)由此可看出linux下curl暂不支持p12证书由p12生成pem证书##生成时如果p12证书有密码,需要输入密码##生成key文件命令opensslpkcs12......
  • 「Linux系列」Shell 流程控制if-else/for循环/While循环/until循环/case语句/跳出循环
    文章目录一、Shell流程控制二、If语句三、For循环四、While循环五、Until循环六、Case语句七、跳出循环break/continue八、相关链接一、Shell流程控制Shell脚本中的流程控制结构允许你根据条件执行不同的代码块,或者重复执行某些代码块。这些结构包括if语句......
  • 【C++】Linux多线程开发
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录3.1线程概述3.2创建线程3.3、线程终止3.4连接已经终止线程3.5线程的分离3.6线程取消3.7线程属性3.8线程同步3.9互斥锁3.10死锁3.11读写锁3.12生产者和消费者模型3.13条件......
  • Linux:网络套接字的认识和基本实现通信
    文章目录UDP和TCP协议网络字节序socket编程常见的接口套接字本篇总结的是对于网络套接字的基本认识UDP和TCP协议在谈网络套接字前,必须先对于UDP和TCP这两个协议有一个基本的认识,这两个协议都是隶属于传输层的协议,并且这两个协议距离用户来说是最近的,所以一般以数据......