1)实验平台:正原子阿尔法Linux开发板 2)平台采购地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码 手册 视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)正点原子Linux感兴趣的学生可以加入小组讨论:935446741 4)关注正点原子微信官方账号,获取最新信息更新
第十四章蜂鸣器试验
前几章测试中的驱动LED灯亮灭属于GPIO本章将巩固输出控制I.MX6U的GPIO输出控制,在I.MX6U-ALPHA开发板上有一个有源蜂鸣器IO蜂鸣器的开关可以通过输出高低电平来控制,本质上也属于GPIO输出控制。 14.2有源蜂鸣器简介 蜂鸣器常用于电脑、打印机、报警器、电子玩具等电子产品。常用的蜂鸣器有两种:有源蜂鸣器和无源蜂鸣器。这里的源不是电源,而是震荡源。有源蜂鸣器内部有震荡源,所以有源蜂鸣器只要通电就会叫。无源蜂鸣器内部没有冲击源,直接由直流电驱动,需要2K-5K方波驱动。I.MX6U-ALPHA有源蜂鸣器用于开发板,只要供电,就会工作。I.MX6U-ALPHA开发板使用的有源蜂鸣器如图14所示.2.1所示:
图14.2.1有源蜂鸣器 只要有源蜂鸣器通电,就会叫,所以我们可以做一个供电电路,这个供电电路可以由一个供电电路制成IO为了控制其通断,通常使用三极管来建造电路。为什么我们不能控制控制LED灯一样,直接将GPIO接收蜂鸣器的负极,通过IO控制蜂鸣器的通断。蜂鸣器工作的电流比LED大灯,直接接收蜂鸣器I.MX6U的GPIO它可能会被烧毁IO,因此,我们需要通过三极管间接控制蜂鸣器的通断,相当于增加一层隔离。我们由我们驱动I.MX6U-ALPHA开发板上的有源蜂鸣器使其周期性滴、滴、滴……”鸣叫。 14.三是硬件原理分析 蜂鸣器硬件原理图如图14所示.3.1所示:
图14.3.蜂鸣器原理图1 图14.3.1中通过一个PNP通过8550型三极管驱动蜂鸣器,SNVS_TAMPER1这个IO控制三极管Q1的导通,当SNVS_TAMPER输出低电平时Q1导通相当于蜂鸣器的正极连接DCDC_3V三、蜂鸣器形成通路,因此蜂鸣器会鸣叫。同理,当SNVS_TAMPER输出高电平时Q如果不导通,蜂鸣器就不会形成通路,所以蜂鸣器也不会鸣叫。 14.3.编写测试程序 本实验对应的例程路径为:开发板光盘-> 1、裸机例程->6_beep。 新建文件夹“6_beep然后将上一章试验中的所有内容复制到新建的6_beep其中,复制完成后的项目如图13所示.3.1所示:
图13.3.1工程文件夹 新建VSCode项目、项目创建完成后bsp文件夹下的新名称是beep文件夹,蜂鸣器驱动文件放在beep文件夹里面。 新建beep.h文件,保存到bsp/beep在文件夹里,在beep.h输入以下内容:
示例代码13.3.1 beep.h文件代码 1 #ifndef __BSP_BEEP_H 2 #define __BSP_BEEP_H 3 4 #include "imx6ul.h" 5 6/* 函数声明 */ 7void beep_init(void); 8void beep_switch(int status); 9 #endif beep.h函数声明很简单。新文件。beep.c,然后在beep.c输入以下内容: 示例代码13.3.2 beep.c文件代码 1 #include "bsp_beep.h" 2 3/* 4 * @description : 初始化蜂鸣器对应IO 5 * @param : 无 6 * @return : 无 7 */ 8void 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_GPO5_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 */
28void beep_switch(int status)
29{
30 if(status == ON)
31 GPIO5->DR &=~(1<<1);/* 打开蜂鸣器 */
32 elseif(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函数中输入如下所示内容:
示例代码13.3.3 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 */
11int main(void)
12{
13 clk_enable(); /* 使能所有的时钟 */
14 led_init(); /* 初始化led */
15 beep_init(); /* 初始化beep */
16
17while(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
30return0;
31}
main.c中只有一个main函数,main函数先使能所有的外设时钟,然后初始化LED和BEEP。最终在while(1)循环中周期性的开关LED灯和蜂鸣器,周期大约为500ms,main.c的内容也比较简单。
14.4 编译下载验证 14.4.1编写Makefile和链接脚本 Makefile使用第十三章编写的通用Makefile,修改变量TARGET为beep,在变量INCDIRS和SRCDIRS中追加“bsp/beep”,修改完成以后如下所示:
示例代码13.4.1.1Makefile文件代码
1 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 TARGET ?=beep
3
4 /* 省略掉其它代码...... */
5
6 INCDIRS := 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即可。 14.4.2编译下载 使用Make命令编译代码,编译成功以后使用软件imxdownload将编译完成的beep.bin文件下载到SD卡中,命令如下: chmod 777 imxdownload //给予imxdownload可执行权限,一次即可 ./imxdownload beep.bin /dev/sdd //烧写到SD卡中 烧写成功以后将SD卡插到开发板的SD卡槽中,然后复位开发板。如果代码运行正常的话LED灯亮的时候蜂鸣器鸣叫,当LED灯灭的时候蜂鸣器不鸣叫,周期大概为500ms。通过本章的例程,我们进一步巩固了I.MX6U的IO输出控制,下一章我们学习如何实现I.MX6U的IO输入控制。