系列文章目录
I.MX6ULL的蜂鸣器实验
I.MX6ULL的蜂鸣器实验
- 系列文章目录
- 一、前言
- 二、有源蜂鸣器简介
- 三、硬件原理分析
- 四、程序编写
- 4.1程序编写前提工作
- 4.2程序编写
- 五、编译下载验证
- 5.1编写 Makefile 和链接脚本
- 5.2编译下载
一、前言
在 I.MX6U-ALPHA 开发板上有一个有源蜂鸣器,通过 IO 输出高低电平即可控制蜂
鸣器的开关,本质上也属于 GPIO 的输出控制。
二、有源蜂鸣器简介
蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中,常用的蜂鸣器有两种:
有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源,有源蜂鸣器内部带有震荡源,所以有源蜂鸣器只要通电就会叫。无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起来的,需要 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_3V3,蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。同理,当 SNVS_TAMPER1输出高电平的时候 Q1 不导通,那么蜂鸣器就没有形成一个通路,因此蜂鸣器也就不会鸣叫。
四、程序编写
1、初始化SNVS_TAMPER1这个IO复用为GPIO5_IO01
2、设置SNVS_TAMPER1这个IO的电气属性。
3、初始化GPIO
4、控制GPIO输出高低电平。
4.1程序编写前提工作
新建文件夹“6_beep”,然后将bsp试验中的所有内容拷贝到刚刚新建的“6_beep”里面,拷贝完成以后的工程如图所示:
新建 VSCode 工程,工程创建完成以后在 bsp 文件夹下新建名为“beep”的文件夹,蜂鸣
器驱动文件都放到“beep”文件夹里面。
4.2程序编写
新建 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.c,然后在 beep.c 里面输入如下内容:
其中:IOMUXC_SetPinMux和IOMUXC_SetPinConfig参考文章
其中寄存器参考,寄存器参考文章
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 : 0,关闭蜂鸣器,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_TAMPER1,将其复用为 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
五、编译下载验证
5.1编写 Makefile 和链接脚本
Makefile 使用该文章编写的通用 Makefile,修改变量 TARGET 为 beep,在变量 INCDIRS和 SRCDIRS 中追加“bsp/beep”,修改完成以后如下所示:
第 2 行修改目标的名称为“beep”。
第 10 行在变量 INCDIRS 中添加蜂鸣器驱动头文件路径,也就是文件 beep.h 的路径。
第 16 行在变量 SRCDIRS 中添加蜂鸣器驱动文件路劲,也就是文件 beep.c 的路径。
链接脚本就使用第十三章试验中的链接脚本文件 imx6ul.lds 即可。
5.2编译下载
使用 Make 命令编译代码,编译成功以后使用软件 imxdownload 将编译完成的 beep.bin 文件下载到 SD 卡中,命令如下:
chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload beep.bin /dev/sdd //烧写到 SD 卡中,不能烧写到/dev/sda 或 sda1 设备里面!
烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板。如果代码运行正常的话 LED 灯亮的时候蜂鸣器鸣叫,当 LED 灯灭的时候蜂鸣器不鸣叫,周期大约为500ms。
END