linux gpio心跳点灯程序
时间: 2023-08-31 14:11:28 浏览: 152
下面是一个简单的Linux GPIO心跳点灯程序的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#define GPIO_BASE 0x3F200000 // 树莓派GPIO控制器的基地址
#define GPIO_LEN 0xB4 // 控制器的长度
// GPIO控制器的物理地址指针
volatile unsigned *gpio;
// GPIO输出引脚号
#define GPIO_PIN 17
// 定义GPIO寄存器的偏移量
#define GPFSEL1 0x04 // GPIO功能寄存器1
#define GPSET0 0x1C // GPIO输出寄存器(置1)
#define GPCLR0 0x28 // GPIO输出寄存器(清0)
#define GPPUD 0x94 // GPIO上下拉寄存器
#define GPPUDCLK0 0x98 // GPIO上下拉时钟寄存器
// GPIO功能寄存器的模式(输出)
#define GPIO_MODE_OUT 0b001
// 定义延时函数
void delay(int millis) {
usleep(millis * 1000);
}
// 初始化GPIO控制器
void setupGPIO() {
int fd = open("/dev/mem", O_RDWR | O_SYNC);
if (fd < 0) {
printf("无法打开/dev/mem,需要root权限运行\n");
exit(-1);
}
gpio = (unsigned *)mmap(NULL, GPIO_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_BASE);
close(fd);
if (gpio == MAP_FAILED) {
printf("mmap失败\n");
exit(-1);
}
}
// 设置GPIO引脚功能模式
void setGPIOFunction(int pin, int mode) {
int regnum = pin / 10;
int offset = (pin % 10) * 3;
unsigned mask = 0b111 << offset;
gpio[GPFSEL1 + regnum] = (gpio[GPFSEL1 + regnum] & ~mask) | (mode << offset);
}
// 将GPIO引脚置为高电平
void setGPIOHigh(int pin) {
gpio[GPSET0] = 1 << pin;
}
// 将GPIO引脚置为低电平
void setGPIOLow(int pin) {
gpio[GPCLR0] = 1 << pin;
}
// 配置GPIO引脚的上下拉电阻
void setGPIOPullUpDown(int pin, int pud) {
gpio[GPPUD] = pud;
delay(1);
gpio[GPPUDCLK0] = 1 << pin;
delay(1);
gpio[GPPUD] = 0;
gpio[GPPUDCLK0] = 0;
}
int main() {
setupGPIO();
setGPIOFunction(GPIO_PIN, GPIO_MODE_OUT);
setGPIOPullUpDown(GPIO_PIN, 0);
while (1) {
setGPIOHigh(GPIO_PIN);
delay(500);
setGPIOLow(GPIO_PIN);
delay(500);
}
return 0;
}
```
编译方法:
```bash
gcc -o gpio-led gpio-led.c
```
需要在root用户下运行,可以使用sudo命令执行。执行后,GPIO17引脚将会不停地闪烁。
阅读全文