ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-10-02 18:00:40  阅读:250  来源: 互联网

标签:beep 12 蜂鸣器 bsp 裸机 IO GPIO LED


文章目录

简介

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

目标

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

阅读基础

熟悉计算机。

环境说明

  • windows10

参考资料

  • 原子文档:I.MX6ULL开发指南 第十四章
  • NXP官方文档:I.MX6ULL参考手册、数据手册

工程管理简介

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

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

  • 有源蜂鸣器内部带有震荡源,所以有源蜂鸣器只要通电就会叫。
  • 无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起来的,需要 2K-5K 的方波去驱动。

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 的导通,

  • SNVS_TAMPER1 输出低电平的时候 Q1 导通,相当于蜂鸣器的正极连接到DCDC_3V3,蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。
  • 同理,当 SNVS_TAMPER1输出高电平的时候 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工程管理实验_心飞的个人网站

  • 修改变量 TARGET 为 beep,
  • 在变量 INCDIRS和 SRCDIRS 中追加“bsp/beep”

修改完成以后如下所示:

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有