蜂鸣器实验

1.有源蜂鸣器简介

蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中,常用的蜂鸣器有两种:
有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源,有源蜂鸣器内部带有震荡
源,所以有源蜂鸣器只要通电就会叫。无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起
来的,需要 2K-5K 的方波去驱动。 I.MX6U-ALPHA 开发板使用的是有源蜂鸣器,因此只要给其
供电就会工作,I.MX6U-ALPHA 开发板所使用的有源蜂鸣器如图
有源蜂鸣器只要通电就会叫,所以我们可以做一个供电电路,这个供电电路可以由一个 IO
来控制其通断,一般使用三极管来搭建这个电路。为什么我们不能像控制 LED 灯一样,直接将
GPIO 接到蜂鸣器的负极,通过 IO 输出高低来控制蜂鸣器的通断。因为蜂鸣器工作的电流比
LED 灯要大,直接将蜂鸣器接到 I.MX6U GPIO 上有可能会烧毁 IO ,所以我们需要通过一个
三极管来间接的控制蜂鸣器的通断,相当于加了一层隔离

2.硬件原理分析

通过一个 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”里面,

拷贝完成以后的工程如图
新建 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 卡中,命令如下:

哥们又成功啦,虽然解决BUG到两点半,哈哈哈

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值