文章目录
前言
通过 IO 输出高低电平即可控制蜂鸣器(有源)的开关,本质上也属于 GPIO 的输出控制
一、硬件原理分析

- 该电路使用 PNP 型三极管 8550 驱动蜂鸣器,由
SNVS_TAMPER1引脚控制。 - 当
SNVS_TAMPER1输出低电平时,三极管导通,蜂鸣器通电鸣叫。 - 当
SNVS_TAMPER1输出高电平时,三极管截止,蜂鸣器断电停止鸣叫
二、程序编写
新建vscode工程6_BEEP,把上一次的工程拷贝过来,并新建bsp_beep.c以及bsp_beep.h文件到beep目录,最终目录如下:

beep.h文件输入如下代码:
#ifndef __BSP_BEEP_H
#define __BSP_BEEP_H
#include "fsl_iomuxc.h"
#include "fsl_common.h"
#include "MCIMX6Y2.h"
void beep_switch(int status);
void beep_init(void);
#endif
这个文件很简单,就是定义一些函数声明
再新建文件beep.c,然后在此文件输入以下内容:
#include "bsp_beep.h"
#include "cc.h"
/* BEEP初始化 */
void beep_init(void)
{
/* 1、初始化IO复用,复用为GPIO5_IO01 */
IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);
/* 2、、配置GPIO5_IO03的IO属性
*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);
/* 3、初始化GPIO,设置GPIO5_IO01设置为输出 */
GPIO5->GDIR |= (1 << 1);
/* 4、设置GPIO1_IO05输出高电平,关闭蜂鸣器 */
GPIO5->DR |=(1 << 1);
}
/*
* @description : 蜂鸣器控制函数,控制蜂鸣器打开还是关闭
* @param - status : 0,打开蜂鸣器,1关闭蜂鸣器
* @return : 无
*/
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 的高低电平,很
简单。
SNVS_TAMPER1 这个具体复用成哪个窗口,可以查找IMX6UL的数据手册(商用级)

最后在main.c文件中输入以下内容:
/**************************************************************
文件名 : main.c
描述 : I.MX6U开发板裸机实验3 蜂鸣器实验
其他 : 无
**************************************************************/
#include "main.h"
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
/*
* @description : main函数
* @param : 无
* @return : 无
*/
int main(void)
{
clk_enable(); /* 使能所有的时钟*/
led_init(); /* 初始化led*/
beep_init(); /* 初始化beep*/
while(1) /* 死循环*/
{
led_off(); /* 关闭LED*/
beep_switch(ON);
delay(500); /* 延时大约500ms*/
led_on(); /* 打开LED*/
beep_switch(OFF);
delay(500); /* 延时大约500ms */
}
return 0;
}
main.c中只有一个main函数,main函数先使能所有的外设时钟,然后初始化LED和BEEP。
最终在 while(1)循环中周期性的开关 LED 灯和蜂鸣器,周期大约为 500ms,main.c 的内容也比
较简单。
三、编译下载
1、编写makefile文件
使用之前编写的通用makefile,修改变量TARGET 为beep,在变量 INCDIRS和SRCDIRS 中追加"bsp/beep",修改完成以后如下所示:
CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET ?= beep
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
INCUDIRS := imx6ul \
bsp/clk \
bsp/led \
bsp/delay\
bsp/beep
SRCDIRS := project \
bsp/clk \
bsp/led \
bsp/delay\
bsp/beep
INCLUDE := $(patsubst %, -I %, $(INCUDIRS))
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)
print:
@echo INCLUDE = $(INCLUDE)
@echo SFILES = $(SFILES)
@echo CFILES = $(CFILES)
@echo SFILENDIR = $(SFILENDIR)
@echo CFILENDIR = $(CFILENDIR)
@echo SFILENDIR = $(SFILENDIR)
@echo SOBJS = $(SOBJS)
@echo COBJS = $(COBJS)
@echo OBJS = $(OBJS)
第 2 行修改目标的名称为"beep"。
第 10 行在变量 INCDIRS 中添加蜂鸣器驱动头文件路径,也就是文件 beep.h 的路径。
第 16 行在变量 SRCDIRS 中添加蜂鸣器驱动文件路劲,也就是文件 beep.c 的路径。
2、编译下载
chmod 777 imxdownload //给予imxdownload可执行权限,一次即可
./imxdownload beep.bin /dev/sdb
烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板。如果代码运行正常的
话 LED 灯亮的时候蜂鸣器鸣叫,当 LED 灯灭的时候蜂鸣器不鸣叫,周期大概为 500ms。
总结
这一期进一步巩固了 I.MX6U 的 IO 输出控制,下一期我们继续讲解学习如何实现 I.MX6U 的
IO 输入控制。