嵌入式Linux如何用C读写gpio
时间: 2024-06-10 11:10:48 浏览: 39
嵌入式Linux可以使用C语言来读写GPIO。以下是一个简单的GPIO读取程序示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#define GPIO_BASE 0x3F200000
#define GPIO_SIZE 0xB4
#define GPIO_IN(g) (*(gpio + ((g)/10)) &= ~(7<<(((g)%10)*3)))
#define GPIO_OUT(g) (*(gpio + ((g)/10)) |= (1<<(((g)%10)*3)))
#define GPIO_SET(g) (*(gpio + 7) = 1<<(g))
#define GPIO_CLR(g) (*(gpio + 10) = 1<<(g))
int main(int argc, char **argv) {
int fd;
void *gpio_map;
volatile unsigned *gpio;
if ((fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0) {
perror("open");
exit(1);
}
gpio_map = mmap(NULL, GPIO_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE);
if (gpio_map == MAP_FAILED) {
perror("mmap");
exit(1);
}
gpio = (volatile unsigned*)gpio_map;
GPIO_IN(17);
GPIO_OUT(18);
GPIO_CLR(18);
GPIO_SET(18);
if (*(gpio + 13) & (1<<17)) {
printf("GPIO 17 is high\n");
} else {
printf("GPIO 17 is low\n");
}
munmap(gpio_map, GPIO_SIZE);
close(fd);
return 0;
}
```
该程序将GPIO17设置为输入模式,GPIO18设置为输出模式,并设置GPIO18为高电平。然后它检查GPIO17的状态,如果它是高电平,则输出“GPIO 17 is high”,否则输出“GPIO 17 is low”。
该程序使用了mmap函数将GPIO映射到内存中,然后使用指针来访问GPIO寄存器。该程序的主要函数包括:
- GPIO_IN(g):将GPIO g设置为输入模式。
- GPIO_OUT(g):将GPIO g设置为输出模式。
- GPIO_SET(g):将GPIO g设置为高电平。
- GPIO_CLR(g):将GPIO g设置为低电平。
请注意,该程序需要在root权限下运行。
阅读全文