蜂鸣器
1. 蜂鸣器简介
蜂鸣器分为有源和无源两种,这里的源不是电源,而是振荡源。有源蜂鸣器内置振荡源,通电就会发声;而无源蜂鸣器不带振荡器,直流电是驱动不起来的,需要2K-5K的方波驱动。本实验中使用的是有源蜂鸣器
蜂鸣器本质上属于GPIO的输出控制,通过控制IO输出高低电平来控制蜂鸣器的通断。但是由于蜂鸣器工作的电流比较大,直接将其接到IO口上有可能会烧毁IO,因此我们需要通过一个三极管来间接控制蜂鸣器的通断
2. 硬件介绍
蜂鸣器的硬件原理图如下示:
通过一个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为周期亮灭和鸣叫