IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 第2期ARM裸机篇:【12】蜂鸣器实验 -> 正文阅读

[嵌入式]第2期ARM裸机篇:【12】蜂鸣器实验

简介

前几篇实验中的驱动 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下载

小有收获

有收获记得三连哦:😄

有收获记得三连哦

最近更新

查看本文最近更新请点击

欢迎关注微信公众号

weixingognzhonghaoerweima

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 13:00:11  更:2021-10-04 13:01:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:55:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码