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
相关推荐
Takoony2 分钟前
理解 Python ProcessPoolExecutor 的序列化问题:为什么线程锁(threading.Lock)会导致异常?
linux·开发语言·python
Crime_man14 分钟前
Ubuntu系统安装MySQL
mysql·ubuntu·adb
qq_3344078115 分钟前
docker安装mysql5.7
linux·mysql·docker·容器
vvw&33 分钟前
如何在 Ubuntu 22.04 上安装 JupyterLab 环境教程
linux·运维·服务器·ubuntu·jupyter·开源·python3.11
zengshitang52043 分钟前
Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程
linux·windows·ubuntu
~狂想家~1 小时前
使用C语言库函数格式化输入时格式类型与数据类型不匹配导致程序异常
c语言·开发语言
a0023450011 小时前
指针的深入讲解
c语言
路星辞*2 小时前
TCP 三次握手四次挥手
linux·服务器·网络
爱吃西瓜的小菜鸡2 小时前
【C语言】贪心吃糖
c语言·开发语言·学习·算法
m0_541034842 小时前
Linux shell脚本练习(七)
linux