蜂鸣器常用于电脑、打印机、报警器、电子玩具等电子产品,常用的蜂鸣器有两种:
有源蜂鸣器和无源蜂鸣器,这里有源不是电源,而是震荡源,有源蜂鸣器内部有震荡源,所以有源蜂鸣器只要通电就会叫。无源蜂鸣器内部无冲击源,直接由直流电驱动,需要 2K-5K 方波驱动。 I.MX6U-ALPHA 有源蜂鸣器用于开发板,只要供电,就会工作。 I.MX6U-ALPHA 开发板使用的有源蜂鸣器如图所示:
有源蜂鸣器
有源蜂鸣器只要通电就会叫,所以我们可以做一个电源电路, 这个供电电路可以由一个电路制成 IO为了控制其通断,通常使用三极管来建造电路。为什么我们不能控制控制 LED 灯一样,直接将GPIO 接收蜂鸣器的负极,通过 IO 控制蜂鸣器的通断。蜂鸣器工作的电流比LED 大灯,直接接收蜂鸣器 I.MX6U 的 GPIO 它可能会被烧毁 IO,因此,我们需要通过三极管间接控制蜂鸣器的通断,相当于增加一层隔离。本章我们就驱动 I.MX6U-ALPHA 开发板上的有源蜂鸣器使其周期性滴、滴、滴…..”鸣叫。
蜂鸣器硬件原理图如图所示:
蜂鸣器原理图
通过图中的一个 PNP 型的三极管 8550 驱动蜂鸣器,通过 SNVS_TAMPER1 这个 IO控制三极管 Q1 的导通,当 SNVS_TAMPER1 输出低电平的时候 Q1 导通相当于蜂鸣器的正极连接 DCDC_3V三、蜂鸣器形成通路,因此蜂鸣器会鸣叫。同理,当 SNVS_TAMPER输出高电平时 Q2 如果不导通,蜂鸣器就不会形成通路,所以蜂鸣器也不会鸣叫。新文件夹6_beep然后把前一篇文章,《
工程文件夹
新建 VSCode 项目、项目创建完成后 bsp 文件夹下的新名称是beep文件夹,蜂鸣器驱动文件放在beep文件夹里面。
新建 beep.h 文件,保存到 bsp/beep 文件夹里面,在 beep.h 输入以下内容:
1 #ifndef __BSP_BEEP_H
2 #define __BSP_BEEP_H
3
4#include "imx6ul.h"
5
6 /* 函数声明 */
7 void beep_init(void);
8 void beep_switch(int status);
9 #endif
beep.h 函数声明很简单。新文件。 beep.c,然后在 beep.c 里面输入如下内容:
1 #include "bsp_beep.h"
2
3/*
4 * @description : 初始化蜂鸣器对应 IO
5 * @param : 无
6 * @return : 无
7 */
8 void beep_init(void)
9{
10 /* 1、初始化 IO 复用,复用 GPIO5_IO01 */
11 IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);
12
13 /* 2、、配置 GPIO1_IO03 的 IO 属性 */
14 IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0X10B0);
15
16 /* 3、初始化 GPIO,GPIO5_IO01 设置为输出 */
17 GPIO5->GDIR |= (1 << 1);
18
19 /* 4、设置 GPIO5_IO01 输出高电平,关闭蜂鸣器 */
20 GPIO5->DR |= (1 << 1);
21 }
22
23 /*
24 * @description : 蜂鸣器控制函数,控制蜂鸣器打开或关闭
25 * @param - status : 关闭蜂鸣器, 1 打开蜂鸣器
26 * @return : 无
27 */
28 void beep_switch(int status)
29{
30 if(status == ON)
31 GPIO5->DR &= ~(1 << 1); /* 打开蜂鸣器 */
32 else if(status == OFF)
33 GPIO5->DR |= (1 << 1); /* 关闭蜂鸣器 */
}
beep.c 文件有两个函数: beep_init 和 beep_switch, 其中 beep_init 用来初始化 BEEP 所使用的 GPIO,也就是 SNVS_TAMPER一、重用为 GPIO5_IO01,和上一章 LED 灯的初始化函数相同。 beep_switch 控制函数 BEEP 开关,即设置 GPIO5_IO01 高低电平,很简单。
最后在 main.c 函数中输入以下内容:1 #include "bsp_clk.h"
2 #include "bsp_delay.h"
3 #include "bsp_led.h"
4 #include "bsp_beep.h"
5 6
/*
7 * @description : main 函数
8 * @param : 无
9 * @return : 无
10 */
11 int main(void)
12{
13 clk_enable(); /* 所有时钟 */
14 led_init(); /* 初始化 led */
15 beep_init(); /* 初始化 beep */
16
17 while(1)
18 {
19 /* 打开 LED0 和蜂鸣器 */
20 led_switch(LED0,ON);
21 beep_switch(ON);
22 delay(500);
23
24 /* 关闭 LED0 和蜂鸣器 */
25 led_switch(LED0,OFF);
26 beep_switch(OFF);
27 delay(500);
28 }
29
30 return 0;
31 }
main.c中只有一个 main函数,main函数首先使所有外设时钟初始化 LED和 BEEP。最终在 while(1)循环中周期性开关 LED 灯和蜂鸣器的周期约为 500ms, main.c 内容也比较简单。
Makefile 使用上一篇文章的通用性 Makefile,修改变量 TARGET 为 beep,在变量 INCDIRS和 SRCDIRS 中追加“bsp/beep修改完成后如下 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 TARGET ?= beep
3
4 /* 省略其他代码... */
5
6INCDIRS := imx6ul \
7 bsp/clk \
8 bsp/led \
9 bsp/delay \
10 bsp/beep
11
12 SRCDIRS := project \
13 bsp/clk \
14 bsp/led \
15 bsp/delay \
16 bsp/beep
17
18 /* 省略其他代码... */
19
20 clean:
21 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
第 2 修改目标的名称为beep”。
第10 行在变量 INCDIRS 中添加蜂鸣器驱动头文件路径,也就是文件 beep.h 的路径。
第 16 行在变量 SRCDIRS 中添加蜂鸣器驱动文件路劲,也就是文件 beep.c 的路径。
链接脚本就使用上一篇文章中的链接脚本文件 imx6ul.lds 即可。