本文目录
- 一、基础
- 1. 命令控制
- 方式一:使用 GPIO序号来控制。
- 方式二:使用 GPIO组号来控制。
- 2. 代码控制
一、基础
我们先要通过查询开发板手册,来获取引脚口信息。这里我们以开发板OreangpiAIPro为例。查询官方手册如下:
1. 命令控制
以GPIO物理引脚号为12的引脚举例。我们将蜂鸣器的I/O口连接到该引脚上。(蜂鸣器低电平触发)控制GPIO口来控制蜂鸣器的响灭。
方式一:使用 GPIO序号来控制。
(1)首先我们先cd到GPIO控制器目录下:cd /sys/class/gpio/
(2)使用export导出GPIO,相当于初始化。这里我们要使用GPIO序号来导出对应的GPIO口。例如:echo 227 > export
,完成之后我们发现多了一个文件夹。
(3)进入文件夹。发现里面有很多文件。这些文件用于控制和查看 GPIO 引脚的状态和配置。
- active_low : 是否电平逻辑取反。1:取反,0:不取反。
- device : 该文件是一个符号链接,指向与 GPIO 引脚关联的设备。
- direction: 设置GPIO方向,out:输出,in:输入。
- edge:配置引脚的中断边沿检测。可以是 none(无边沿检测)、rising(上升沿)、falling(下降沿)或 both(双边沿)。
- power :管理 GPIO 引脚的电源设置。
- subsystem :该文件是一个符号链接,指向该 GPIO 引脚所属的子系统。
- uevent :用于与用户空间工具(如 udev)进行交互,通常不直接操作。
- value :GPIO电平值。
这里我们常用的只有direction和value 。
(4)配置GPIO为输出模式,电平为0。(即触发蜂鸣器)
配置输出模式:echo out > direction
,查看是否配置成功cat direction
。
配置电平为低电平:echo 0 > value
。配置完成后,我们发现蜂鸣器响了。说明我们操作成功!
(5)注销GPIO :echo GPIO序号 > unexport
方式二:使用 GPIO组号来控制。
注意使用方法二之前要把方法一中的gpio注销掉,不然设置不成功。
使用命令:gpio_operate -h
,查看支持命令。
(1)设置GPIO方向
gpio_operate set_direction 7 3 1
(2)设置GPIO的电平值
gpio_operate set_value 7 3 0
设置完毕后,发现蜂鸣器依旧相应。
2. 代码控制
我们通过命令控制方法一发现其实本质都是在操作文件。那么我们就可以通过代码的方式来操作GPIO。代码如下:
gpio.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include "gpio.h"//设置GPIO 导出还是销毁。
int GPIO_Modle(char *gpio_num, int model)
{int file;switch (model){case EXPORT:{file= open("/sys/class/gpio/export", O_WRONLY);if(file< 0){perror("open error\n");return -1;}write(file, gpio_num, strlen(gpio_num));close(file);break;}case UNEXPORT:{file= open("/sys/class/gpio/unexport", O_WRONLY);if(file< 0){perror("open error\n");return -1;}write(file, gpio_num, strlen(gpio_num));close(file);break;}} return 0;
} int GPIO_Set(char *gpio_num, char *filename, char *value)
{char File_path[64];int file;int ret;sprintf(File_path,"/sys/class/gpio/gpio%s/%s", gpio_num, filename);file= open(File_path, O_WRONLY);if(ret< 0){perror("open error\n");return -1;}ret=write(file, value, strlen(value));if(ret<0){perror("write error\n");return -1;}close(file);return 0;
}
gpio.h
#ifndef __GPIO_H
#define __GPIO_H#define EXPORT 1
#define UNEXPORT 0int GPIO_Modle(char *gpio_num, int model);
int GPIO_Set(char *gpio_num, char *filename, char *value);#endif
main.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "gpio.h"int main()
{
//注意:最好先配置方向,在配置值GPIO_Modle("227", EXPORT); //导出序号为227的GPIOGPIO_Set("227","direction","out"); //设置方向GPIO_Set("227","value","0"); //设置电平值sleep(2);GPIO_Set("227","value","1"); //设置电平值GPIO_Modle("227", UNEXPORT); //注销GPIO
}