蜂鸣器

1. 蜂鸣器简介

蜂鸣器分为有源和无源两种,这里的源不是电源,而是振荡源。有源蜂鸣器内置振荡源,通电就会发声;而无源蜂鸣器不带振荡器,直流电是驱动不起来的,需要2K-5K的方波驱动。本实验中使用的是有源蜂鸣器

蜂鸣器本质上属于GPIO的输出控制,通过控制IO输出高低电平来控制蜂鸣器的通断。但是由于蜂鸣器工作的电流比较大,直接将其接到IO口上有可能会烧毁IO,因此我们需要通过一个三极管来间接控制蜂鸣器的通断

2. 硬件介绍

蜂鸣器的硬件原理图如下示:
Linux裸机开发|蜂鸣器_beep
通过一个PNP型三极管8550来驱动蜂鸣器,通过SNVS_TAMPER1这个IO口控制三极管的通断来控制蜂鸣器

3. 程序编写

  • 新建beep文件夹,并编写蜂鸣器驱动文件bsp_epittimer.c和bsp_epittimer.h
void beep_init(void);
void beep_switch(int status);
void beep_init(void){
	//初始化IO复用,将IO复用为GPIO5_IO01
	IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);
	//设置IO属性
	IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0x10B0);
	//设置GPIO5_IO01为输出
	GPIO5->GDIR |= (1<<1);
	//设置GPIO5_IO01默认输出电平为高电平
	GPIO5->DR |= (1<<1);
}

void beep_switch(int status){
	if(status == ON)
		GPIO5->DR &= ~(1<<1);
	else if(status == OFF)
		GPIO5->DR |= (1<<1);
}
  • 主函数main.c
int main(void){
	clk_enable();
	led_init();
	beep_init();
	
	while(1){
		led_switch(LED0,ON);
		beep_switch(ON);
		delay(500);
		led_switch(LED0,OFF);
		beep_switch(OFF);
		delay(500);
	}
}

4. 下载验证

  • 修改Makefile文件:修改TARGET为beep,追加“bsp/beep”文件夹
CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET		  ?= beep
......
......
#包含整个工程的.h头文件目录
INCDIRS       := imx6ul	    \
				 bsp/clk    \
				 bsp/led	\
				 bsp/delay	\
				 bsp/beep
#包含整个工程的所有.c和.S文件目录				 
SRCDIRS       := project    \
				 bsp/clk    \
				 bsp/led	\
				 bsp/delay	\
				 bsp/beep
......
......
  • 使用imxdownload软件将bin文件下载到SD卡中
./imxdownload beep.bin /dev/sdcard
  • 烧写成功后,插入SD卡,复位后LED和蜂鸣器以500ms为周期亮灭和鸣叫