1.有源蜂鸣器简介
蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中,常用的蜂鸣器有两种:
有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源,有源蜂鸣器内部带有震荡
源,所以有源蜂鸣器只要通电就会叫。无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起
来的,需要
2K-5K
的方波去驱动。
I.MX6U-ALPHA
开发板使用的是有源蜂鸣器,因此只要给其
供电就会工作,I.MX6U-ALPHA 开发板所使用的有源蜂鸣器如图
2.硬件原理分析
![](https://i-blog.csdnimg.cn/blog_migrate/92163dd252e4dd21b6807e4933b14c89.png)
有源蜂鸣器只要通电就会叫,所以我们可以做一个供电电路,这个供电电路可以由一个
IO
来控制其通断,一般使用三极管来搭建这个电路。为什么我们不能像控制
LED
灯一样,直接将
GPIO
接到蜂鸣器的负极,通过
IO
输出高低来控制蜂鸣器的通断。因为蜂鸣器工作的电流比
LED
灯要大,直接将蜂鸣器接到
I.MX6U
的
GPIO
上有可能会烧毁
IO
,所以我们需要通过一个
三极管来间接的控制蜂鸣器的通断,相当于加了一层隔离。
2.硬件原理分析![](https://i-blog.csdnimg.cn/blog_migrate/ea92b9e89624f24840ee06fd225ecea9.png)
通过一个
PNP
型的三极管
8550
来驱动蜂鸣器,通过
SNVS_TAMPER1
这个
IO
来控制三极管
Q1
的导通,当
SNVS_TAMPER1
输出低电平的时候
Q1
导通,相当于蜂鸣器的正
极连接到
DCDC_3V3
,蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。同理,当
SNVS_TAMPER1
输出高电平的时候
Q1
不导通,那么蜂鸣器就没有形成一个通路,因此蜂鸣器也就不会鸣叫。
3.试验程序编写
1.初始化SNVS_TAMPER1这个IO复用为GPIO
2.设置SNVS_TAMPER1这个IO的电气属性
3.初始化GPIO
4.控制GPIO输出高低电平
新建文件夹“6_beep”,然后将上一章试验中的所有内容拷贝到刚刚新建的“6_beep”里面,
拷贝完成以后的工程如图
![](https://i-blog.csdnimg.cn/blog_migrate/347552f4a87142a80647f9908004a790.png)
新建
VSCode
工程,工程创建完成以后在
bsp
文件夹下新建名为“
beep
”的文件夹,蜂鸣
器驱动文件都放到“
beep
”文件夹里面。
新建
beep.h
文件,保存到
bsp/beep
文件夹里面,在
beep.h
里面输入如下内容:
#ifndef __BSP_BEEP_H
#define __BSP_BEEP_H
#include "imx6ul.h"
/* 函数声明 */
void beep_init(void);
void beep_switch(int status);
#endif
新建文件
beep.c
,然后在
beep.c
里面输入如下内容:
#include "bsp_beep.h"
#include "imx6ul.h"
/*
* @description : 初始化蜂鸣器对应的 IO
* @param : 无
* @return : 无
*/
void beep_init(void)
{
/* 1、初始化 IO 复用,复用为 GPIO5_IO01 */
IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);
/* 2、配置 GPIO1_IO03 的 IO 属性 */
IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0X10B0);
/* 3、初始化 GPIO,GPIO5_IO01 设置为输出 */
GPIO5->GDIR |= (1 << 1);
/* 4、设置 GPIO5_IO01 输出高电平,关闭蜂鸣器 */
GPIO5->DR |= (1 << 1);
}
/*
* @description : 蜂鸣器控制函数,控制蜂鸣器打开还是关闭
* @param - status : 0,关闭蜂鸣器,1 打开蜂鸣器
* @return : 无
*/
void beep_switch(int status)
{
if(status == ON)
GPIO5->DR &= ~(1 << 1); /* 打开蜂鸣器 */
else if(status == OFF)
GPIO5->DR |= (1 << 1); /* 关闭蜂鸣器 */
}
beep.c
文件一共有两个函数:
beep_init
和
beep_switch
,其中
beep_init
用来初始化
BEEP
所
使用的
GPIO
,也就是
SNVS_TAMPER1
,将其复用为
GPIO5_IO01
,和上一章的
LED
灯初始化
函数一样。
beep_switch
函数用来控制
BEEP
的开关,也就是设置
GPIO5_IO01
的高低电平,很
简单。 最后在 main.c
函数中输入如下所示内容:
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
/*
* @description : main 函数
* @param : 无
* @return : 无
*/
int main(void)
{
clk_enable(); /* 使能所有的时钟 */
led_init(); /* 初始化 led */
beep_init(); /* 初始化 beep */
while(1)
{
/* 打开 LED0 和蜂鸣器 */
led_switch(LED0,ON);
beep_switch(ON);
delay(300);
/* 关闭 LED0 和蜂鸣器 */
led_switch(LED0,OFF);
beep_switch(OFF);
delay(300);
}
return 0;
}
编译下载验证
通用
Makefile
,修改变量
TARGET
为
beep
,在变量
INCDIRS
和
SRCDIRS
中追加“
bsp/beep
”,修改完成以后如下所示:
CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET ?= beep
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
SRCDIRS := project \
bsp/clk \
bsp/led \
bsp/delay \
bsp/beep
INCLUDE := $(patsubst %, -I %, $(INCDIRS))
SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
SFILENDIR := $(notdir $(SFILES))
CFILENDIR := $(notdir $(CFILES))
SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS := $(SOBJS) $(COBJS)
VPATH := $(SRCDIRS)
.PHONY: clean
$(TARGET).bin : $(OBJS)
$(LD) -Timx6ul.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 -O2 $(INCLUDE) -o $@ $<
$(COBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
clean:
rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
编译下载
使用
Make
命令编译代码,编译成功以后使用软件
imxdownload
将编译完成的
beep.bin
文
件下载到
SD
卡中,命令如下: