单片机/MCU论坛
直播中

xiaopeng

11年用户 224经验值
擅长:嵌入式技术,处理器/DSP
私信 关注
[文章]

【HD-G2UL-EVM开发板体验】蜂鸣器控制

说明

由于开发板上并没有板载程序可以控制的LED灯,因此这里使用蜂鸣器作简单的GPIO控制。
开发板配套的用户手册有蜂鸣器的控制说明,使用的是脚本的方式,那本次我将编写程序来控制蜂鸣器,并编写一个通用的Makefile文件使用make工具进行编译。

确定端口

通过查看开发板原理图可以确认,蜂鸣器是接在端口P0_3的,因此我们控制P0_3即可。

图片.png

GPIO操作

在Linux里面操作GPIO的方式与单片机不一样,对于单片机来说我们可以字节操作GPIO对应的寄存器即可实现对个gpio引脚的控制,但是,在Linux里面并不能直接对实际的物理地址进行操作,通常需要用操作文件的方式来控制设备,因为在Linux里面一切皆文件。

在Linux的/sys/class 目录下面有很多的设备,其中就有个gpio
图片.png

再进去里面看看:
有三个文件:

图片.png

可以使用用户手册的使用方法控制gpio:

图片.png

这样确实也是能实现对蜂鸣器的控制的。

程序控制

这里我将编写应用程序来控制蜂鸣器。
主要有是个文件:

1、beep.c
2、beep.h
3、main.c
4、Makefile

图片.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;
	//index config
	fd = open("/sys/class/gpio/export",O_WRONLY);
	if(fd < 0)
	{
		return 1;
	}
	write(fd, BEEP_GPIO_INDEX, strlen(BEEP_GPIO_INDEX));
	close(fd);
	
	//direction config
	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__

//beep port:P0_3
//360+0*8+3 = 363
#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");   //打印输出Hello World
    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

将beep文件上传到开发板中并运行:

图片.png

图片.png

结论

该程序运行后得到了预期的效果,下次将分享更多其它内容,欢迎阅读评论

更多回帖

发帖
×
20
完善资料,
赚取积分