linux应用开发 —— GPIO控制_linux 应用控制gpio

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

给大家整理的电子书资料:

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

EDGE_FALLING,
EDGE_BOTH,

};
typedef uint8_t edge_t;

int gpio_export(int gpio);
int gpio_unexport(int gpio);

int gpio_set_active(int gpio, active_level_t active);
int gpio_active_low(int gpio);
int gpio_active_high(int gpio);

int gpio_set_edge(int gpio, edge_t edge);
int gpio_edge_none(int gpio);
int gpio_edge_rising(int gpio);
int gpio_edge_falling(int gpio);
int gpio_edge_both(int gpio);

int gpio_set_direction(int gpio, gpio_dir_t dir);
int gpio_direction_input(int gpio);
int gpio_direction_output(int gpio);

void gpio_set_value(int gpio, int value);
int gpio_get_value(int gpio);

#endif /* __GPIO_H__ */


**gpio.c:**



#include “gpio.h”
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

/*
gpio 编号计算
index = GPIOn_IOx = (n-1)*32 + x
例如蜂鸣器使用的引脚编号为:index = GPIO1_19 = (1-1)*32 +19 = 19。
又例如GPIO4_IO20的编号为:index = GPIO4_IO20 = (4-1)*32+20=116。
*/
int gpio_export(int gpio)
{
int fd;
char gpio_path[100] = {0};

/* GPIO目录路径 */
sprintf(gpio_path, “/sys/class/gpio/gpio%d”, gpio);
/* 判断GPIO目录是否存在 */
if (access(gpio_path, F_OK) == 0) return 0;

if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) 
{ 
    perror("open error"); 
    return -1;
} 

/\* 导出 gpio \*/
char gpio_str[10] = {0};
sprintf(gpio_str, "%d", gpio);
int len = strlen(gpio_str);
if (len != write(fd, gpio_str, len))  
{
    perror("write error"); 
    return -2;
} 

return 0;

}

int gpio_unexport(int gpio)
{
int fd;
fd = open(“/sys/class/gpio/unexport”, O_WRONLY);
if(fd < 0)
return -1;

char gpio_str[10] = {0};
sprintf(gpio_str, "%d", gpio);
write(fd, gpio_str, strlen(gpio_str));
close(fd);
return 0;

}

static int gpio_cfg_attr(int gpio, char *attr, char *val)
{
int fd;
char path[100] = {0};
sprintf(path, “/sys/class/gpio/gpio%d/%s”, gpio, attr);
if (0 > (fd = open(path, O_WRONLY)))
{
perror(“open error”);
return -1;
}

int len = strlen(val); 
if (len != write(fd, val, len)) 
{ 
    perror("write error"); 
    close(fd); 
    return -2; 
} 

close(fd);  
return 0; 

}

int gpio_set_direction(int gpio, gpio_dir_t dir)
{
char dirs[10] = {0};
if (dir == GPIO_DIR_OUTPUT)
{
sprintf(dirs, “%s”, “out”);
}
else
{
sprintf(dirs, “%s”, “in”);
}
return gpio_cfg_attr(gpio, “direction”, dirs);
}

int gpio_direction_output(int gpio)
{
return gpio_set_direction(gpio, GPIO_DIR_OUTPUT);
}

int gpio_direction_input(int gpio)
{
return gpio_set_direction(gpio, GPIO_DIR_INPUT);
}

int gpio_set_active(int gpio, active_level_t active)
{
char active_str[10] = {0};

if (active == ACTIVE_LOW)
{
    gpio\_cfg\_attr(gpio, "active\_low", "0");
}
else
{
    gpio\_cfg\_attr(gpio, "active\_low", "1");
}

}

int gpio_active_low(int gpio)
{
return gpio_cfg_attr(gpio, “active_low”, “0”);
}

int gpio_active_high(int gpio)
{
return gpio_cfg_attr(gpio, “active_low”, “1”);
}

int gpio_set_edge(int gpio, edge_t edge)
{
int ret;
edge_t edge_index[4] = {EDGE_NONE, EDGE_RISING, EDGE_FALLING, EDGE_BOTH};
char str_edge_index[4][10] = {{“none”}, {“rising”}, {“falling”}, {“both”}};
for (int i = 0; i < 4; i++)
{
if (edge == edge_index[i])
{
ret = gpio_cfg_attr(gpio, “edge”, str_edge_index[i]);
break;
}
}
return ret;
}

int gpio_edge_none(int gpio)
{
return gpio_set_edge(gpio, EDGE_NONE);
}

int gpio_edge_rising(int gpio)
{
return gpio_set_edge(gpio, EDGE_RISING);
}

int gpio_edge_falling(int gpio)
{
return gpio_set_edge(gpio, EDGE_FALLING);
}

int gpio_edge_both(int gpio)
{
return gpio_set_edge(gpio, EDGE_BOTH);
}

void gpio_set_value(int gpio, int value)
{
char val[10] = {0};
if (value == 0)
{
sprintf(val, “%d”, 0);
}
else
{
sprintf(val, “%d”, 1);
}

gpio\_cfg\_attr(gpio, "value", val);

}

int gpio_get_value(int gpio)
{
char gpio_path[100] = {0};
char vals[5] = {0};
int fd;

sprintf(gpio_path, "/sys/class/gpio/gpio%d/value", gpio);
if (0 > (fd = open(gpio_path, O_WRONLY))) 
{ 
    perror("open error"); 
    return -1;
} 

if (0 > read(fd, vals, sizeof(vals))) 
{ 
    perror("read error"); 
    close(fd); 
    return -1;
} 

int value = atoi(vals);

return value;

}


## 使用控制GPIO蜂鸣器


**GPIO编号的计算:**



index = GPIOn_IOx = (n-1)*32 + x

例如蜂鸣器使用的引脚编号为:index = GPIO1_19 = (1-1)*32 +19 = 19。

又例如GPIO4_IO20的编号为:index = GPIO4_IO20 = (4-1)*32+20=116。


**beep.h:**



#ifndef __BEEP_H__
#define __BEEP_H__

int beep_init(void);
int beep_on(void);
int beep_off(void);
int beep_deinit(void);

#endif /* __BEEP_H__ */


**beep.c:**



#include “gpio.h”
#include “beep.h”

#define BEEP_GPIO_INDEX 19

int beep_init(void)
{
int ret;
ret = gpio_export(BEEP_GPIO_INDEX);
ret = gpio_direction_output(BEEP_GPIO_INDEX);
return ret;
}

int beep_on(void)
{
gpio_set_value(BEEP_GPIO_INDEX, 1);
return 0;
}

int beep_off(void)
{
gpio_set_value(BEEP_GPIO_INDEX, 0);
return 0;
}

int beep_deinit(void)
{
gpio_set_value(BEEP_GPIO_INDEX, 0);
return gpio_unexport(BEEP_GPIO_INDEX);
}



#include “stdio.h”
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <poll.h>
#include <stdint.h>
#include <sys/select.h>

#include “beep.h”

void sleep_ms(unsigned int ms)
{
struct timeval delay;
delay.tv_sec = 0;
delay.tv_usec = ms * 1000;
select(0, NULL, NULL, NULL, &delay);
}

int main(int argc, char **argv)
{
beep_init();

int cnt = 0;
while (1)
{
    beep\_on();
    sleep\_ms(500);
    beep\_off();
    sleep\_ms(500);
    if (++cnt >= 40)
        break;
}

beep\_deinit();

return 0;

}


## 中断


对于使用中断可以使用poll多路复用IO监测中断是否触发,poll事件有POLLIN、POLLOUT、POLLERR、POLLPRI 等,其中 POLLIN 和 POLLOUT 表示普通优先级数据可读、可写。中断就是一种高优先级事件,需要使用 `POLLPRI` ,当中断触发时表示有高优先级数据可被读取。  


### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

![](https://img-blog.csdnimg.cn/img_convert/e888c7e2b3c6709969581f2ab602dd6f.png)

给大家整理的电子书资料:

  

![](https://img-blog.csdnimg.cn/img_convert/ccbeba887e0f2a1765e9da608bfd8a18.png)



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

# 资料预览

给大家整理的视频资料:

[外链图片转存中...(img-k2IgI6wG-1715807091591)]

给大家整理的电子书资料:

  

[外链图片转存中...(img-ZR1fXZjg-1715807091592)]



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值