完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1)实验平台:正点原子Linux开发板 2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》关注官方微信号公众号,获取更多资料:正点原子 第十四章蜂鸣器试验 前几章试验中的驱动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.3硬件原理分析 蜂鸣器的硬件原理图如图14.3.1所示: 图14.3.1蜂鸣器原理图 图14.3.1中通过一个PNP型的三极管8550来驱动蜂鸣器,通过SNVS_TAMPER1这个IO来控制三极管Q1的导通,当SNVS_TAMPER1输出低电平的时候Q1导通,相当于蜂鸣器的正极连接到DCDC_3V3,蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。同理,当SNVS_TAMPER1输出高电平的时候Q2不导通,那么蜂鸣器就没有形成一个通路,因此蜂鸣器也就不会鸣叫。 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_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 */ 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输入控制。 |
|
相关推荐
|
|
753 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2714 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1368 浏览 0 评论
1955 浏览 0 评论
1523 浏览 0 评论
74959 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 03:13 , Processed in 0.455192 second(s), Total 61, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号