其他分享
首页 > 其他分享> > 第2期ARM裸机篇:【12】蜂鸣器实验

第2期ARM裸机篇:【12】蜂鸣器实验

作者:互联网

文章目录

简介

前几篇实验中的驱动 LED 灯亮灭属于 GPIO 的输出控制,本篇再巩固一下 I.MX6U 的 GPIO输出控制,在 I.MX6U-ALPHA 开发板上有一个有源蜂鸣器,通过 IO 输出高低电平即可控制蜂鸣器的开关,本质上也属于 GPIO 的输出控制。

目标

巩固一下 I.MX6U 的 GPIO输出控制,通过 IO 输出高低电平即可控制蜂鸣器的开关。

阅读基础

熟悉计算机。

环境说明

参考资料

工程管理简介

蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中。

常用的蜂鸣器有两种:有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源

I.MX6U-ALPHA 开发板使用的是有源蜂鸣器,因此只要给其供电就会工作,I.MX6U-ALPHA 开发板所使用的有源蜂鸣器如图所示:

BlogImage-20210930120346

有源蜂鸣器只要通电就会叫,所以我们可以做一个供电电路,这个供电电路可以由一个 IO来控制其通断,一般使用三极管来搭建这个电路。

为什么我们不能像控制 LED 灯一样,直接将GPIO 接到蜂鸣器的负极,通过 IO 输出高低来控制蜂鸣器的通断。因为蜂鸣器工作的电流比LED 灯要大,直接将蜂鸣器接到 I.MX6U 的 GPIO 上有可能会烧毁 IO,所以我们需要通过一个三极管来间接的控制蜂鸣器的通断,相当于加了一层隔离。

本篇我们就驱动 I.MX6U-ALPHA 开发板上的有源蜂鸣器,使其周期性的“滴、滴、滴……”鸣叫。

硬件原理分析

蜂鸣器的硬件原理图如图所示:

BlogImage-20211001111032

图中通过一个 PNP 型的三极管 8550来驱动蜂鸣器,通过 SNVS_TAMPER1这个 IO来控制三极管 Q1 的导通,

实验程序编写

新建文件夹“6_beep”,然后将上一篇试验中的所有内容拷贝到刚刚新建的“6_beep”里面,拷贝完成以后的工程如图所示:

BlogImage-20211002145447

用VSCode打开文件夹,完成以后在 bsp 文件夹下新建名为“beep”的文件夹,蜂鸣器驱动文件都放到“beep”文件夹里面。如下图:

BlogImage-20211002145724

新建 beep.h 文件,保存到 bsp/beep 文件夹里面,在 beep.h 里面输入如下内容

#ifndef __BSP_BEEP_H
#define __BSP_BEEP_H

/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名	: 	 bsp_beep.h
作者	   : 左忠凯
版本	   : V1.0
描述	   : 蜂鸣器驱动头文件。
其他	   : 无
论坛 	   : www.openedv.com
日志	   : 初版V1.0 2019/1/4 左忠凯创建
***************************************************************/

#include "imx6ul.h"

/*函数声明*/
void beep_init(void);
void beep_switch(int status);

#endif /* __BSP_BEEP_H */

beep.h 很简单,就是函数声明。新建文件 beep.c,然后在 beep.c 里面输入如下内容:

#include "bsp_beep.h"

/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名	: 	 bsp_beep.c
作者	   : 左忠凯
版本	   : V1.0
描述	   : BEEP驱动文件。
其他	   : 无
论坛 	   : www.openedv.com
日志	   : 初版V1.0 2019/1/4 左忠凯创建
***************************************************************/

/*
 * @description	: 初始化蜂鸣器对应的 IO
 * @param 		: 无
 * @return 		: 无
 */
void beep_init(void)
{
	/* 1、初始化IO复用 */
	IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);		/* 复用为GPIO1_IO03 */
	
	
	/* 2、、配置GPIO5_IO01的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输出低电平,打开LED0*/
	GPIO5->DR |= (1 << 1);		
}


/*
 * @description		: 蜂鸣器控制函数,控制蜂鸣器打开还是关闭
 * @param - status	: 0,关闭,1 打开
 * @return 			: 无
 */
void beep_switch(int status)
{	

    if(status == ON)
        GPIO5->DR &= ~(1<<1);	/* 打开LED0 */
    else if(status == OFF)
        GPIO5->DR |= (1<<1);	/* 关闭LED0 */

}

beep.c 文件一共有两个函数:beep_initbeep_switch,其中 beep_init用来初始化 BEEP所使用的 GPIO,也就是 SNVS_TAMPER1,将其复用为 GPIO5_IO01,和上一篇的 LED 灯初始化
函数一样。beep_switch函数用来控制 BEEP 的开关,也就是设置 GPIO5_IO01的高低电平,很简单。注意引脚在第五组GPIO中,第一个。

最后在 main.c 函数中输入如下所示内容:

/**************************************************************

Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名	: 	 mian.c
作者	   : 左忠凯
版本	   : V1.0
描述	   : I.MX6U开发板裸机实验5 BSP形式的LED驱动
其他	   : 本实验学习目的:
		 1、将各个不同的文件进行分类,学习如何整理工程、就
		 和学习STM32一样创建工程的各个文件夹分类,实现工程文件
		 的分类化和模块化,便于管理。
		 2、深入学习Makefile,学习Makefile的高级技巧,学习编写
		 通用Makefile。
论坛 	   : www.openedv.com
在线教育	: www.yuanzige.com
日志	   : 初版V1.0 2019/1/4 左忠凯创建

**************************************************************/

#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"

/*
 * @description	: mian函数
 * @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;
}

main.c中只有一个main函数,

  1. main函数先使能所有的外设时钟,
  2. 初始化LED和BEEP。
  3. 在 while(1)循环中周期性的开关 LED 灯和蜂鸣器,周期大约为 500ms.

main.c 的内容也比较简单。

编译下载验证

编写 Makefile

Makefile 使用上一篇编写的通用 Makefile,

第2期ARM裸机篇:【11】BSP工程管理实验_心飞的博客-CSDN博客

第2期ARM裸机篇:【11】BSP工程管理实验_心飞的个人网站

修改完成以后如下所示:

1 CROSS_COMPILE ?= arm-linux-gnueabihf- 
2 TARGET ?= beep
3 
4 /* 省略掉其它代码...... */
5 
6 INCDIRS := imx6ul \ 
7 bsp/clk \
8 bsp/led \ 
9 bsp/delay \
10 bsp/beep
11 
12 SRCDIRS := project \
13 bsp/clk \
14 bsp/led \
15 bsp/delay \
16 bsp/beep
17 
18 /* 省略掉其它代码...... */
19 
20 clean:
21 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

第 2 行修改目标的名称为“beep”。

第 10 行在变量 INCDIRS 中添加蜂鸣器驱动头文件路径,也就是文件 beep.h 的路径。

第 16 行在变量 SRCDIRS 中添加蜂鸣器驱动文件路劲,也就是文件 beep.c 的路径。

编写链接脚本

链接脚本就使用上一篇试验中的链接脚本文件 imx6ul.lds 即可,如下:

1 SECTIONS{ 
2 	. = 0X87800000; 
3 	.text : 
4 	{ 
5 		obj/start.o 
6 		*(.text) 
7	 } 
8 	.rodata ALIGN(4) : {*(.rodata*)} 
9 	.data ALIGN(4) : { *(.data) } 
10 	__bss_start = .; 
11 	.bss ALIGN(4) : { *(.bss) *(COMMON) } 
12	__bss_end = .;
13 }

编译下载

参考文章:第2期ARM裸机篇:【6】 汇编LED驱动实验1_汇编LED代码编写_心飞的博客-CSDN博客

参考文章:第2期ARM裸机篇:【6】 汇编LED驱动实验1_汇编LED代码编写_心飞的博客-个人网站

使用 Make 命令编译代码,编译成功以后使用软件 imxdownload 将编译完成的 bsp.bin 文件下载到 SD 卡中,命令如下:

chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload beep.bin /dev/sdc //烧写到 SD 卡中,不能烧写到/dev/sda 或 sda1 设备里面!

烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板。如果代码运行正常的话 LED 灯亮的时候蜂鸣器鸣叫,当 LED 灯灭的时候蜂鸣器不鸣叫。

其他

相关资源下载

I.MX6ULL SDK包.rar-嵌入式文档类资源-CSDN下载

I.MX6ULL官方SDK包移植头文件.rar-嵌入式文档类资源-CSDN下载

小有收获

有收获记得三连哦:

标签:beep,12,蜂鸣器,bsp,裸机,IO,GPIO,LED
来源: https://blog.csdn.net/aa1319594154/article/details/120587753