Linux-Ubuntu裸机之开发蜂鸣器和按键
一,蜂鸣器与按键
1.相关配置
蜂鸣器:配置寄存器,设置电气属性,配置GDIR为输出,GPIO5-IO01,低电平响。
按键:配置寄存器,设置电气属性,配置GDIR为输入,GPIO1-IO18,按键按下,低电平。
2.软件
按键按下,实现闪灯并且蜂鸣器响:
蜂鸣器:
c
#include "beep.h"
void beep_init(void)
{
IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);//设置为复用功能
IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0x10b0);//电器属性
GPIO5->GDIR=GPIO5->GDIR|(1<<1);//设置输出模式
GPIO5->DR=GPIO5->DR|(1<<1);
}
void beep_mode(unsigned char status)
{
if(status==ON)//打开
{
GPIO5->DR=GPIO5->DR& ~(1<<1);
}else GPIO5->DR=GPIO5->DR|(1<<1);
}
按键,实现消抖:
c
#include "dsp_key.h"
#include "dsp_delay.h"
#include "dsp_gpio.h"
void key_init(void)//寄存器初始化,复用,电器属性,设置为输入模式
{
gpio_config_t key_config;
key_config.section= gpio_in;
IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0);
IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0Xf080);
// GPIO1->GDIR &= ~(1 << 18);//0 in 1 out
gpio_init(GPIO1,18,&key_config);
}
int key_value(void)
{
int value=0;
static int key_relase=1;//
value = gpio_read(GPIO1,18);
if( key_relase=1 && value==0 )
{
key_relase=0;
delay(10);
if(value==0)
{
value=0;
}
}else {
key_relase=1;
value=1;
}
return value;
}
其中,GPIO可以定义一个通用的函数,来进行初始化:
c
#include "dsp_gpio.h"
typedef enum gpio_in_out{
gpio_in = 0U,
gpio_out =1U,
}gpio_in_out_t;
typedef struct gpio_config{
gpio_in_out_t section;
unsigned int mode;
}gpio_config_t;
void gpio_init(GPIO_Type *base,int wei,gpio_config_t *gpio_config_init)//相当于设置GDIR和判断DR,输入的话,读取DR值,输出,给DR值
{
if(gpio_config_init->section==gpio_in)//设置为输入
{
base->GDIR &=~(1<<wei);//输入设置为0
}else
{
base->GDIR |=(1<<wei);//设置为输出,进行写0 或者写1
gpio_write(base,wei,gpio_config_init->mode);
}
}
void gpio_write(GPIO_Type *base,int wei,int write_value)
{
if(write_value==0)
{
base->DR &= ~(1<<wei);//写0
}else
{
base->DR |= (1<<wei);//写1
}
}
unsigned int gpio_read(GPIO_Type *base,int wei)//记录读的是0还是1
{
return (base->DR>>wei)&0x01;
}
定义的结构体gpio_config_t包含枚举类型结构体gpio_in_out_t 和整形变量。gpio_init函数主要是对GDIR结构体进行定义,说明其输入还是输出,如果为输入,读取输入的值,利用函数gpio_read,如果想输出,直接在进行写0或1。具体使用的时候,要带入函数的实参,即知道是输入输出,然后放到函数里面,让gpio_init函数对GDIR进行赋值以及相关操作。
主函数:
cpp
#include "main.h"
#include "dsp_clk.h"
#include "dsp_led.h"
#include "dsp_delay.h"
#include "beep.h"
#include "dsp_key.h"
int main(void)
{
int key_status=1;
key_init();
clk_enable();
beep_init();
led_init();
while(1)
{
key_status = key_value();
if(key_status==0)
{
led_on();
beep_mode(ON);
delay(1000);
}else {
beep_mode(OFF);
led_off();
delay(1000);
}
}
return 0;
}
Makefile文件:INCDIRS头文件目录,SRCDIRS源文件目录。
bash
CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET ?=main
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
INCDIRS := imx6ul \
bsp/clk \
bsp/led \
bsp/delay \
bsp/beep \
bsp/key \
bsp/gpio \
project
SRCDIRS := project \
bsp/clk \
bsp/led \
bsp/delay \
bsp/key \
bsp/gpio \
bsp/beep
INCLUDE := $(patsubst %, -I %, $(INCDIRS))
SFIEES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.S))
CFIEES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c))
SFILENDIR :=$(notdir $(SFIEES))
CFILENDIR :=$(notdir $(CFIEES))
SOBJS :=$(patsubst %,obj/%,$(SFILENDIR:.S=.o))
COBJS :=$(patsubst %,obj/%,$(CFILENDIR:.c=.o))
OBJS :=$(SOBJS) $(COBJS)
VPATH :=$(SRCDIRS)
.PHONY :clean
$(TARGET).bin : $(OBJS)
$(LD) -Timux6u.lds -o $(TARGET).elf $^
$(OBJCOPY) -O binary -S $(TARGET).elf $@
$(OBJDUMP) -D -m arm $(TARGET).elf>$(TARGET).dis
$(SOBJS) : obj/%.o : %.S
$(CC) -Wall -nostdlib -c $(INCLUDE) -o $@ $<
$(COBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -c $(INCLUDE) -o $@ $<
clean:
rm -rf $(TARGET).bin $(TARGET).dis $(TARGET).elf $(OBJS) load.imx
run:
sudo ./uuu load.imx