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
相关推荐
2601_949146538 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
wdfk_prog9 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
盟接之桥9 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
忆~遂愿10 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
湘-枫叶情缘10 小时前
1990:种下那棵不落叶的树-第6集 圆明园的对话
linux·系统架构
知南x10 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
Fcy64811 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满11 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠11 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Gary Studio11 小时前
rk芯片驱动编写
linux·学习