GPIO编号在mygpio.h中
GPIO文件句柄只在末尾多了个f
在同一个目录下
建一个头文件
vi mygpio.h 内容如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
//GPIO编号
#define GPIO18 "370"
#define GPIO19 "371"
#define GPIO20 "372"
#define GPIO21 "373"
#define GPIO22 "374"
#define GPIO23 "375"
#define GPIO25 "377"
#define GPIO26 "378"
#define GPIOA14 "494"
#define GPIOA15 "495"
#define GPIOA16 "496"
#define GPIOA17 "497"
#define GPIOA22 "502"
#define GPIOA23 "503"
#define GPIOA24 "504"
#define GPIOA25 "505"
#define GPIOA26 "506"
#define GPIOA27 "507"
#define GPIOA28 "508"
#define GPIOA29 "509"
#define GPIOC9 "425"
#define GPIOC10 "426"
//GPIO编号
#define out "out"
#define in "in"
//a为GPIO文件句柄,b为临时存储数组
#define gpio_writeh(a) write(a, "1", 2)
#define gpio_writel(a) write(a, "0", 2)
#define gpio_read(a,b) read(a,b,2)
//GPIO文件句柄
int GPIO18f,GPIO19f,GPIO20f,GPIO21f,GPIO22f,GPIO23f,GPIO25f,GPIO26f;
int GPIOA14f,GPIOA15f,GPIOA16f,GPIOA17f,GPIOA22f,GPIOA23f,GPIOA24f,GPIOA25f,GPIOA26f,GPIOA27f,GPIOA28f,GPIOA29f;
int GPIOC9f,GPIOC10f;
//GPIO文件句柄
int gpio_init(char * mystr)//参数一:GPIO编号 例如GPIOC9
{
int fd;
fd = open("/sys/class/gpio/export", O_WRONLY);
write(fd, mystr, sizeof(mystr));
close(fd);
return 0;
}
int gpio_close(char * mystr,int gpiof)//参数一:例如GPIOC9 参数二:例如GPIOC9f 卸载gpio和关闭gpio文件句柄
{
int fd;
fd = open("/sys/class/gpio/unexport", O_WRONLY);
write(fd, mystr, sizeof(mystr));
close(fd);
close(gpiof);
return 0;
}
int gpio_setd(char * mystr,int * gpiof,char * myset)//1:GPIO编号 2.GPIO文件句柄 例如GPIOC9f 3.为输入或输出 例如out或in
{
int fd;
char str1[]="/sys/class/gpio/gpio";
char str2[]="/direction";
char str4[]="/value";
char str3[50];
str3[0]='\0';
strcat(str3,str1);
strcat(str3,mystr);
strcat(str3,str2);
fd = open(str3, O_WRONLY);
write(fd, myset, sizeof(myset));
close(fd);
str3[0]='\0';
strcat(str3,str1);
strcat(str3,mystr);
strcat(str3,str4);
if(sizeof(gpiof) == 4)
{
*gpiof = open(str3, O_WRONLY);
}
else
{
*gpiof = open(str3, O_RDWR);
}
return 0;
}
建一个头文件
vi main.c 内容如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include "mygpio.h"
int main()
{
char lishi[2];
gpio_init(GPIOA28);//初始GPIOA28
gpio_setd(GPIOA28,&GPIOA28f,out);//1:GPIO编号 2.GPIO文件句柄 例如GPIOC9f 3.为输入或输出 例如out或in
while(1)
{
gpio_writeh(GPIOA28f);//将GPIOA28设为高
usleep(100000);
gpio_writel(GPIOA28f);//将GPIOA28设为低
usleep(100000);
}
gpio_read(GPIOA28f,lishi);//在gpio_setd设置为in 输入时 lishi存储gpio的值 lishi[0]-30 为 0 或 1
gpio_close(GPIOA28,GPIOA28f);//卸载gpio和关闭gpio文件句柄
return 0;
}
编译为:
[root@milkv]~# riscv64-unknown-linux-gnu-gcc -static -o main main.c
然后将main上传milkv
我这里是在电脑上建立Nginx服务器 把文件放到服务器上
运行 wget 192.168.42.159/main 下载到milkv ip为电脑ip
运行 chmod +x main
运行 ./main 就正常运行了
下面是linux组号计算:
GPIOA linux组号值为480 + 偏移 为GPIO编号
GPIOC linux组号值为416
GPIO linux组号值为352
例如GPIOA15 GPIO编号为 480+15=495
例如GPIOC9 GPIO编号为 416+9=425
例如GPIO23 GPIO编号为 352+23=375