Linux-Ubuntu裸机之开发蜂鸣器和按键

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
相关推荐
BD_Marathon1 分钟前
Ubuntu下Tomcat的配置
linux·ubuntu·tomcat
pumpkin845144 分钟前
Rust 调用 C 函数的 FFI
c语言·算法·rust
饥饿的半导体25 分钟前
Linux快速入门
linux·运维
BD_Marathon35 分钟前
Ubuntu:Tomcat里面的catalina.sh
linux·ubuntu·tomcat
BD_Marathon35 分钟前
设置LInux环境变量的方法和区别_Ubuntu/Centos
linux·ubuntu·centos
Me4神秘39 分钟前
Linux国产与国外进度对垒
linux·服务器·安全
2401_858286111 小时前
125.【C语言】数据结构之归并排序递归解法
c语言·开发语言·数据结构·算法·排序算法·归并排序
zhaowangji1 小时前
ubuntu 20.04 安装中文输入法 (sougou pin yin)
linux·ubuntu
两斤半2 小时前
Debian TTY环境乱码
linux·debian
双叶8362 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++