Linux驱动应用编程(二)控制GPIO

发布于:2024-06-04 ⋅ 阅读:(142) ⋅ 点赞:(0)


  

一、基础

我们先要通过查询开发板手册,来获取引脚口信息。这里我们以开发板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 0

int 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的GPIO
    GPIO_Set("227","direction","out"); //设置方向
    GPIO_Set("227","value","0"); //设置电平值
    sleep(2);
    GPIO_Set("227","value","1"); //设置电平值
    GPIO_Modle("227", UNEXPORT); //注销GPIO
}

网站公告

今日签到

点亮在社区的每一天
去签到