以函数的形式实现监测/sys/class/gpio/gpio2是否有中断发生C语言,中断触发条件可以选rising,fallin,both
时间: 2024-01-06 21:04:58 浏览: 140
好的,以下是以函数形式实现监测/sys/class/gpio/gpio2是否有中断发生的C语言代码,其中中断触发条件为both:
```c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <poll.h>
#define GPIO_PATH "/sys/class/gpio/gpio2/"
int gpio_init()
{
int fd, len;
char buf[64];
// 导出GPIO
fd = open("/sys/class/gpio/export", O_WRONLY);
if (fd < 0) {
perror("gpio export open failed");
return -1;
}
len = snprintf(buf, sizeof(buf), "%d", 2);
if (write(fd, buf, len) < 0) {
perror("gpio export write failed");
return -1;
}
close(fd);
// 设置GPIO方向为输入
fd = open(GPIO_PATH "direction", O_WRONLY);
if (fd < 0) {
perror("gpio direction open failed");
return -1;
}
if (write(fd, "in", 2) < 0) {
perror("gpio direction write failed");
return -1;
}
close(fd);
return 0;
}
int gpio_wait_for_interrupt(int edge)
{
int fd, ret;
char buf[64];
struct pollfd pfd;
fd = open(GPIO_PATH "value", O_RDONLY);
if (fd < 0) {
perror("gpio value open failed");
return -1;
}
// 设置中断触发条件
snprintf(buf, sizeof(buf), "%d", edge);
fd = open(GPIO_PATH "edge", O_WRONLY);
if (fd < 0) {
perror("gpio edge open failed");
return -1;
}
if (write(fd, buf, sizeof(buf)) < 0) {
perror("gpio edge write failed");
return -1;
}
close(fd);
// 等待中断事件
pfd.fd = fd;
pfd.events = POLLPRI;
while (1) {
ret = poll(&pfd, 1, -1);
if (ret < 0) {
perror("gpio poll failed");
return -1;
}
if (pfd.revents & POLLPRI) {
// 中断事件发生
lseek(fd, 0, SEEK_SET); // 重置文件指针
read(fd, buf, sizeof(buf)); // 清除中断标志
return 0;
}
}
}
int main()
{
int ret;
// 初始化GPIO
ret = gpio_init();
if (ret < 0) {
return -1;
}
// 监测中断事件
while (1) {
ret = gpio_wait_for_interrupt(2); // 2表示both
if (ret < 0) {
return -1;
}
printf("Interrupt occurred!\n");
}
return 0;
}
```
注意,该代码需要以root权限运行。同时,为了方便测试,该代码只监测了GPIO2的中断事件,如果需要监测其他GPIO的中断事件,需要修改相应的代码。
阅读全文