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
相关推荐
Nerd Nirvana1 小时前
软考—系统架构设计(案例 | 论文)
linux·系统架构·软件工程·软考·计算机基础
勤奋的凯尔森同学2 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
月光水岸New3 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
莫忘初心丶3 小时前
在 Ubuntu 22 上使用 Gunicorn 启动 Flask 应用程序
python·ubuntu·flask·gunicorn
李白同学4 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
楼台的春风5 小时前
【MCU驱动开发概述】
c语言·驱动开发·单片机·嵌入式硬件·mcu·自动驾驶·嵌入式
打不了嗝 ᥬ᭄7 小时前
Linux的权限
linux
落幕7 小时前
C语言-进程
linux·运维·服务器
深度Linux7 小时前
C++程序员内功修炼——Linux C/C++编程技术汇总
linux·项目实战·c/c++
风静如云8 小时前
OpenBMC:BmcWeb定义service
linux