硬件介绍
有源蜂鸣器只要通电就会叫,所以我们可以做一个供电电路,这个供电电路可以由一个
IO
来控制其通断,一般使用三极管来搭建这个电路。为什么我们不能像控制
LED
灯一样,直接将
GPIO
接到蜂鸣器的负极,通过
IO
输出高低来控制蜂鸣器的通断。因为蜂鸣器工作的电流比
LED
灯要大,直接将蜂鸣器接到
I.MX6U
的
GPIO
上有可能会烧毁
IO
,所以我们需要通过一个
三极管来间接的控制蜂鸣器的通断,相当于加了一层隔离。
原理图如下:
通过一个
PNP
型的三极管
8550
来驱动蜂鸣器,通过
SNVS_TAMPER1
这个
IO
来控制三极管
Q1
的导通,当
SNVS_TAMPER1
输出低电平的时候
Q1
导通,相当于蜂鸣器的正
极连接到
DCDC_3V3
,蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。同理,当
SNVS_TAMPER1
输出高电平的时候
Q1
不导通,那么蜂鸣器就没有形成一个通路,因此蜂鸣器也就不会鸣叫。
程序源码
main.c
#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)
{
/* 打开LED0和蜂鸣器 */
led_switch(LED0,ON);
beep_switch(ON);
delay(500);
/* 关闭LED0和蜂鸣器 */
led_switch(LED0,OFF);
beep_switch(OFF);
delay(500);
}
return 0;
}
start.S
.global _start /* 全局标号 */
/*
* 描述: _start函数,程序从此函数开始执行,此函数主要功能是设置C
* 运行环境。
*/
_start:
/* 进入SVC模式 */
mrs r0, cpsr
bic r0, r0, #0x1f /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4 */
orr r0, r0, #0x13 /* r0或上0x13,表示使用SVC模式 */
msr cpsr, r0 /* 将r0 的数据写入到cpsr_c中 */
/* 设置栈指针,
* 注意:IMX6UL的堆栈是向下增长的!
* 堆栈指针地址一定要是4字节地址对齐的!!!
* DDR范围:0X80000000~0X9FFFFFFF
*/
ldr sp,=0X80200000 /* 设置用户模式下的栈首地址为0X80200000,大小为2MB */
b main /* 跳转到main函数 */
imx6ul.h
#ifndef __IMX6UL_H //包含一些常用的头文件
#define __IMX6UL_H
#include "cc.h"
#include "MCIMX6Y2.h"
#include "fsl_common.h"
#include "fsl_iomuxc.h"
#endif
cc.h
#ifndef __CC_H
#define __CC_H
/*
* 自定义一些数据类型供库文件使用
*/
#define __I volatile
#define __O volatile
#define __IO volatile
#define ON 1
#define OFF 0
typedef signed char int8_t;
typedef signed short int int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
typedef signed char s8;
typedef signed short int s16;
typedef signed int s32;
typedef signed long long int s64;
typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned int u32;
typedef unsigned long long int u64;
#endif
bsp_beep.c
#include "bsp_beep.h" //蜂鸣器驱动文件
/*
* @description : 初始化蜂鸣器对应的IO
* @param : 无
* @return : 无
*/
void beep_init(void)
{
/* 1、初始化IO复用,复用为GPIO5_IO01 */
IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);
/* 2、、配置GPIO1_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、设置GPIO5_IO01输出高电平,关闭蜂鸣器 */
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); /* 关闭蜂鸣器 */
}
bsp_beep.h
#ifndef __BSP_BEEP_H
#define __BSP_BEEP_H
#include "imx6ul.h"
/* 函数声明 */
void beep_init(void);
void beep_switch(int status);
#endif