前几篇博文试验中的驱动 LED 灯亮灭属于 GPIO 的输出控制,本章再巩固一下 I.MX6U 的 GPIO输出控制,在 I.MX6U-ALPHA 开发板上有一个有源蜂鸣器,通过 IO 输出高低电平即可控制蜂鸣器的开关,本质上也属于 GPIO 的输出控制
1、有源蜂鸣器简介
蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中,常用的蜂鸣器有两种:有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源,有源蜂鸣器内部带有震荡源,所以有源蜂鸣器只要通电就会叫。无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起来的,需要 2K-5K 的方波去驱动。 I.MX6U-ALPHA 开发板使用的是有源蜂鸣器,因此只要给其供电就会工作, I.MX6U-ALPHA 开发板所使用的有源蜂鸣器如图 14.2.1 所示:
有源蜂鸣器只要通电就会叫,所以我们可以做一个供电电路, 这个供电电路可以由一个 IO来控制其通断,一般使用三极管来搭建这个电路。为什么我们不能像控制 LED 灯一样,直接将GPIO 接到蜂鸣器的负极,通过 IO 输出高低来控制蜂鸣器的通断。因为蜂鸣器工作的电流比LED 灯要大,直接将蜂鸣器接到 I.MX6U 的 GPIO 上有可能会烧毁 IO,所以我们需要通过一个三极管来间接的控制蜂鸣器的通断,相当于加了一层隔离。本章我们就驱动 I.MX6U-ALPHA 开发板上的有源蜂鸣器,使其周期性的“滴、滴、滴……”鸣叫。
2、硬件原理分析
通过一个 PNP 型的三极管 8550 来驱动蜂鸣器,通过 SNVS_TAMPER1 这个 IO来控制三极管 Q1 的导通,当 SNVS_TAMPER1 输出低电平的时候 Q1 导通,相当于蜂鸣器的正极连接到 DCDC_3V3,蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。同理,当 SNVS_TAMPER1输出高电平的时候 Q2 不导通,那么蜂鸣器就没有形成一个通路,因此蜂鸣器也就不会鸣叫。
3、实验程序的编写
本实验在上一次(BSP实验)实验的基础上再做修改,把BSP实验的工程文件复制一份,
新建 VSCode 工程,工程创建完成以后在 bsp 文件夹下新建名为“beep”的文件夹,蜂鸣器驱动文件都放到“beep”文件夹里面。
3.1、在写驱动之前要找到对应的寄存器设置好属性
3.11、复用为GPIO
再找到头文件中对应的宏
3.12、找到其设置电器属性并配置电器属性
*bit 16:0 HYS 关闭
*bit [15:14]: 00 默认下拉
*bit [13]: 0 kepper 功能
*bit [12]: 1 pull/keeper 使能
*bit [11]: 0 关闭开路输出
*bit [7:6]: 10 速度 100Mhz
*bit [5:3]: 110 R0/6 驱动能力
*bit [0]: 0 低转换率
3.2、beep.h
#ifndef __BEEP_H
#define __BEEP_H
#include "imx6ul.h"
void init_beep(void);
void beep_switch(int status);
#endif // !__BEEP_H
3.3、beep.c
#include "beep.h"
/*初始化蜂鸣器*/
void init_beep(void)
{
IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0); /*复用为GPIO*/
/*
*bit 16:0 HYS 关闭
*bit [15:14]: 00 默认下拉
*bit [13]: 0 kepper 功能
*bit [12]: 1 pull/keeper 使能
*bit [11]: 0 关闭开路输出
*bit [7:6]: 10 速度 100Mhz
*bit [5:3]: 110 R0/6 驱动能力
bit [0]: 0 低转换率
*/
IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0x10b0);/*设置其电器属性*/
/*GPIO初始化*/
GPIO5->GDIR |= (1<<1); /*设置为输出*/
GPIO5->DR |= (1<<1); /*蜂鸣器默认关闭*/
}
/*蜂鸣器控制*/
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 的高低电平,很简单。
3.4、把头文件包含进main.h中
3.4.1、修改.vscode文件把beep文件夹路径加入到.vscode
3.4.2、修改main.h
3.5、调用驱动和蜂鸣器执行函数
main.c
#include "main.h"
int main()
{
clk_enable(); //使能外设时钟
led_init(); //初始化LED
init_beep();//初始化蜂鸣器
while(1)
{
led_off();
beep_switch(OFF);
delay(1000);
led_on();
beep_switch(ON);
delay(1000);
}
return 0;
}
main.c中只有一个main函数, main函数先使能所有的外设时钟,然后初始化LED和BEEP。最终在 while(1)循环中周期性的开关 LED 灯和蜂鸣器,周期大约为 1000ms
4、编译下载和验证
4.1、修改Makefile文件
主要修改目标文件和头文件路径和源码路径
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)
第 2 行修改目标的名称为“beep”。
第 10 行在变量 INCDIRS 中添加蜂鸣器驱动头文件路径,也就是文件 beep.h 的路径。
第 16 行在变量 SRCDIRS 中添加蜂鸣器驱动文件路劲,也就是文件 beep.c 的路径
4.2、编译下载
使用 Make 命令编译代码,编译成功以后使用软件 imxdownload 将编译完成的 beep.bin 文
件下载到 SD 卡中,命令如下:
chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload beep.bin /dev/sdd //烧写到 SD 卡中
烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板。如果代码运行正常的话 LED 灯亮的时候蜂鸣器鸣叫,当 LED 灯灭的时候蜂鸣器不鸣叫,周期大概为 1000ms。
上一篇:Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入)
下一篇:Linux之ARM(IMX6U)BSP工程管理实验
推荐阅读
史海拾趣
All Sensors在传感器技术领域一直保持着世界领先的地位。公司掌握着核心的MEMS传感器技术,如独有的CoBeam2 TM传感器技术等。这些技术的应用使得All Sensors的传感器在精度、稳定性和寿命等方面都达到了行业领先水平。同时,公司还不断投入研发,推出更多创新产品,满足不断变化的市场需求。
随着公司业务的不断发展,辰颐电子开始积极拓展市场。他们通过参加各种行业展会、举办产品发布会等方式,加强与客户的沟通和交流,提升品牌知名度和影响力。同时,公司还注重线上线下的渠道建设,通过电商平台、实体店等多种方式,将产品推向更广阔的市场。这些努力使辰颐电子在市场中树立了良好的品牌形象和口碑。
品质是CST的生命线。为了确保产品质量的稳定性和可靠性,公司建立了完善的质量管理体系,严格执行ISO9001质量体系及ISO14001环境体系。同时,公司还注重员工的培训和教育,提高员工的质量意识和操作技能。这些措施使得CST的产品质量得到了客户的广泛认可。
康奈特一直致力于拓展全球市场。公司通过参加国际展会、与海外经销商建立合作关系等方式,不断提升品牌在国际市场的知名度和影响力。同时,公司还针对不同国家和地区的市场需求和文化差异,推出了定制化的产品和服务。这些举措不仅帮助公司成功进入了多个海外市场,也为公司带来了丰厚的利润回报。
随着电子行业的快速发展,康奈特意识到单一的镜片业务已经无法满足市场需求。于是,公司开始积极布局多元化战略,通过收购和合作的方式,拓展了眼镜框、眼镜配件等相关业务。同时,公司还加大了对智能眼镜、VR/AR眼镜等新兴领域的研发投入,为未来的市场竞争打下了坚实基础。
EUCHNER公司一直将产品创新视为其核心竞争力。公司不断投入研发资源,推出了一系列具有创新性的产品,如安全限位开关CES-CMFS系列、机械式安全开关MGB系列以及多光束安全栅ESPE系列等。这些产品在汽车制造、轨道交通、环保监测等领域得到了广泛应用,并赢得了客户的广泛赞誉。通过产品创新和市场拓展,EUCHNER公司的市场份额逐年提升。
免费样片申请全集(全网最全最有效) 以下是本人通过搜索引擎\\站内厂商列表搞出来的,页面看了上千个,那个辛苦啊.......T_T\',强烈要求版主加精. 看了的兄弟帮忙回个帖,可以让更多的人看到. 1、推荐铁电存储器(未见量的限制,据说最多有人申请了 ...… 查看全部问答∨ |
超声设备的“死机”故障如同计算机常碰到的“死机”故障一样,有时会通过关机,然后再开机,机器就会正常工作。但有时“死机”现象无论通过什么应急手段都排除不了,在这种清况下,维修工作者切不可心急,应耐心细致的去查找“死机”故障形成的原因 ...… 查看全部问答∨ |
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 最近查阅一些智能卡读卡机具,了解到NXP 的几款非接触式通信中高集成读卡 IC 。 MF RC500 是应用 ...… 查看全部问答∨ |
delphi 中 如何通过DDE或者其他简单的方法 获取 组态王中的变量,谢谢 我在做一个小东西,我想在delphi 中通过DDE或者其他简单的方法 获取 组态王中的变量,请哪位大师指导一下,谢谢了… 查看全部问答∨ |