说明
由于开发板上并没有板载程序可以控制的LED灯,因此这里使用蜂鸣器作简单的GPIO控制。
开发板配套的用户手册有蜂鸣器的控制说明,使用的是脚本的方式,那本次我将编写程序来控制蜂鸣器,并编写一个通用的Makefile文件使用make工具进行编译。
确定端口
通过查看开发板原理图可以确认,蜂鸣器是接在端口P0_3的,因此我们控制P0_3即可。
![图片.png](//file.elecfans.com/web2/M00/84/6F/poYBAGOe9AGAYXN7AABmPJGv2q8832.png)
GPIO操作
在Linux里面操作GPIO的方式与单片机不一样,对于单片机来说我们可以字节操作GPIO对应的寄存器即可实现对个gpio引脚的控制,但是,在Linux里面并不能直接对实际的物理地址进行操作,通常需要用操作文件的方式来控制设备,因为在Linux里面一切皆文件。
在Linux的/sys/class 目录下面有很多的设备,其中就有个gpio
![图片.png](//file.elecfans.com/web2/M00/84/6F/poYBAGOe9kuAMCjoAABLyL3IgOY055.png)
再进去里面看看:
有三个文件:
![图片.png](//file.elecfans.com/web2/M00/84/6F/poYBAGOe9omAL_P3AAARORGJJes604.png)
可以使用用户手册的使用方法控制gpio:
![图片.png](//file.elecfans.com/web2/M00/84/6F/poYBAGOe99yARkKLAADGkkBbJBc981.png)
这样确实也是能实现对蜂鸣器的控制的。
程序控制
这里我将编写应用程序来控制蜂鸣器。
主要有是个文件:
1、beep.c
2、beep.h
3、main.c
4、Makefile
![图片.png](//file.elecfans.com/web2/M00/84/F9/pYYBAGOe-dKAf4WVAACvvrHX8YM422.png)
beep.c文件内容:
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include "beep.h"
char dir_buf[50];
int beep_init(char *port)
{
int fd;
fd = open("/sys/class/gpio/export",O_WRONLY);
if(fd < 0)
{
return 1;
}
write(fd, BEEP_GPIO_INDEX, strlen(BEEP_GPIO_INDEX));
close(fd);
sprintf(dir_buf,"/sys/class/gpio/%s/direction",port);
fd = open(dir_buf,O_WRONLY);
if(fd < 0)
{
return 2;
}
write(fd,"out",strlen("out"));
close(fd);
return 0;
}
int beep_deinit(void)
{
int fd;
fd = open("/sys/class/gpio/unexport",O_WRONLY);
if(fd < 0)
{
return 1;
}
write(fd, BEEP_GPIO_INDEX, strlen(BEEP_GPIO_INDEX));
close(fd);
return 0;
}
int beep_on(char *port)
{
int fd;
sprintf(dir_buf,"/sys/class/gpio/%s/value",port);
fd = open(dir_buf,O_WRONLY);
if(fd < 0)
{
return 1;
}
write(fd, "1", 1);
close(fd);
return 0;
}
int beep_off(char *port)
{
int fd;
sprintf(dir_buf,"/sys/class/gpio/%s/value",port);
fd = open(dir_buf,O_WRONLY);
if(fd < 0)
{
return 1;
}
write(fd, "0", 1);
close(fd);
return 0;
}
beep.h文件内容:
#ifndef __BEEP_H__
#define __BEEP_H__
#define BEEP_GPIO_INDEX "363"
int beep_init(char *port);
int beep_deinit(void);
int beep_on(char *port);
int beep_off(char *port);
#endif
main.c文件内容:
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include "beep.h"
int main(int argc, char *argv[])
{
char buf[10];
int res;
if(argc != 2)
{
printf("please input a PORT parameter.(example:P0_3)\n");
return 0;
}
printf("Hello beep\n");
res = beep_init(argv[1]);
if(res)
{
printf("beep init error, code = %d\n",res);
}
while(1)
{
printf("please input the value: 0--off,1--on q--exit\n");
scanf("%10s",buf);
switch(buf[0])
{
case '0':
beep_off(argv[1]);
break;
case '1':
beep_on(argv[1]);
break;
case 'q':
beep_deinit();
printf("exit\n");
return 0;
break;
default:
break;
}
}
return 0;
}
Makefile文件内容:
TARGET=beep
BUILD_DIR=build
SRC_DIR=source
INC_DIR=include
CFLAGS=$(patsubst %,-I%,$(INC_DIR))
INCLUDES=$(foreach dir,$(INC_DIR),$(wildcard $(dir)/*h))
SOURCES=$(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))
OBJS=$(patsubst %.c,$(BUILD_DIR)/%.o,$(notdir $(SOURCES)))
VPATH=$(SRC_DIR)
$(BUILD_DIR)/$(TARGET):$(OBJS)
$(CC) $^ -o $@
echo "$(CC)"
$(BUILD_DIR)/%.o:%.c $(INCLUDES) | create_build
$(CC) -c $< -o $@ $(CFLAGS)
.PHONY:clean create_build
clean:
rm -r $(BUILD_DIR)
create_build:
mkdir -p $(BUILD_DIR)
编译&运行
使用make命令进行编译
![图片.png](//file.elecfans.com/web2/M00/84/F9/pYYBAGOe_E6AX4JEAAJLTKDCMBo654.png)
将beep文件上传到开发板中并运行:
![图片.png](//file.elecfans.com/web2/M00/84/F9/pYYBAGOe_VWAC7rdAAC3OVDTk70043.png)
![图片.png](//file.elecfans.com/web2/M00/84/F9/pYYBAGOe_buAd3pfAACMI3t1pZA943.png)
结论
该程序运行后得到了预期的效果,下次将分享更多其它内容,欢迎阅读评论