一、首先编写一个脚本文件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