linux(第十五期)--蜂鸣器实验-- Ubuntu20.04

文章目录

前言

一、硬件原理分析

二、程序编写

三、编译下载

1、编写makefile文件

2、编译下载

总结


前言

通过 IO 输出高低电平即可控制蜂鸣器(有源)的开关,本质上也属于 GPIO 的输出控制

一、硬件原理分析

  • 该电路使用 PNP 型三极管 8550 驱动蜂鸣器,由SNVS_TAMPER1引脚控制。
  • SNVS_TAMPER1输出低电平时,三极管导通,蜂鸣器通电鸣叫。
  • SNVS_TAMPER1输出高电平时,三极管截止,蜂鸣器断电停止鸣叫

二、程序编写

新建vscode工程6_BEEP,把上一次的工程拷贝过来,并新建bsp_beep.c以及bsp_beep.h文件到beep目录,最终目录如下:

beep.h文件输入如下代码:

复制代码
#ifndef __BSP_BEEP_H
#define __BSP_BEEP_H
#include "fsl_iomuxc.h"
#include "fsl_common.h"
#include "MCIMX6Y2.h"

void beep_switch(int status);
void beep_init(void);

#endif

这个文件很简单,就是定义一些函数声明

再新建文件beep.c,然后在此文件输入以下内容:

复制代码
#include "bsp_beep.h"
#include "cc.h"
/* BEEP初始化 */
void beep_init(void)
{
    /* 1、初始化IO复用,复用为GPIO5_IO01 */
	IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);	
	/* 2、、配置GPIO5_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、设置GPIO1_IO05输出高电平,关闭蜂鸣器 */
	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);/* 关闭蜂鸣器  */	
    }
}

beep.c 文件一共有两个函数:beep_init 和 beep_switch,其中 beep_init 用来初始化 BEEP 所

使用的 GPIO,也就是 SNVS_TAMPER1,将其复用为 GPIO5_IO01,和上一章的 LED 灯初始化

函数一样。beep_switch 函数用来控制 BEEP 的开关,也就是设置 GPIO5_IO01 的高低电平,很

简单。

SNVS_TAMPER1 这个具体复用成哪个窗口,可以查找IMX6UL的数据手册(商用级)

最后在main.c文件中输入以下内容:

复制代码
/**************************************************************

文件名	: 	 main.c
描述	   : I.MX6U开发板裸机实验3 蜂鸣器实验
其他	   : 无
**************************************************************/
#include "main.h"
#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)			/* 死循环*/
	{	
		led_off();		/* 关闭LED*/
		beep_switch(ON);
		delay(500);		/* 延时大约500ms*/

		led_on();		/* 打开LED*/
		beep_switch(OFF);
		delay(500);		/* 延时大约500ms */
	}

	return 0;
}

main.c中只有一个main函数,main函数先使能所有的外设时钟,然后初始化LED和BEEP。

最终在 while(1)循环中周期性的开关 LED 灯和蜂鸣器,周期大约为 500ms,main.c 的内容也比

较简单。

三、编译下载

1、编写makefile文件

使用之前编写的通用makefile,修改变量TARGET 为beep,在变量 INCDIRS和SRCDIRS 中追加"bsp/beep",修改完成以后如下所示:

复制代码
CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET		  ?= beep

CC 		:= $(CROSS_COMPILE)gcc
LD		:= $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump

INCUDIRS		:=  imx6ul \
								bsp/clk \
								bsp/led \
								bsp/delay\
								bsp/beep
			
SRCDIRS			:=  project \
								bsp/clk \
								bsp/led \
								bsp/delay\
								bsp/beep
								
INCLUDE			:= $(patsubst %, -I %, $(INCUDIRS))

SFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
SFILENDIR		:= $(notdir  $(SFILES))
CFILENDIR		:= $(notdir  $(CFILES))

SOBJS			:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS			:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS			:= $(SOBJS) $(COBJS)
VPATH			:= $(SRCDIRS)

.PHONY: clean

$(TARGET).bin : $(OBJS)
	$(LD) -Timx6ul.lds -o $(TARGET).elf $^
	$(OBJCOPY) -O binary -S $(TARGET).elf $@
	$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis

$(SOBJS) : obj/%.o : %.S
	$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<

$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<

clean:
	rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

print:
	@echo INCLUDE = $(INCLUDE)
	@echo SFILES = $(SFILES)
	@echo CFILES = $(CFILES)
	@echo SFILENDIR = $(SFILENDIR)
	@echo CFILENDIR = $(CFILENDIR)
	@echo SFILENDIR = $(SFILENDIR)
	@echo SOBJS = $(SOBJS)
	@echo COBJS = $(COBJS)
	@echo OBJS = $(OBJS)

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

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

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

2、编译下载

复制代码
chmod 777 imxdownload  //给予imxdownload可执行权限,一次即可
./imxdownload beep.bin /dev/sdb

烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板。如果代码运行正常的

话 LED 灯亮的时候蜂鸣器鸣叫,当 LED 灯灭的时候蜂鸣器不鸣叫,周期大概为 500ms。

总结

这一期进一步巩固了 I.MX6U 的 IO 输出控制,下一期我们继续讲解学习如何实现 I.MX6U 的
IO 输入控制。

相关推荐
JANGHIGH2 小时前
ipcs命令行工具
运维·服务器
方便面不加香菜2 小时前
Linux基本指令(2)
linux
A-刘晨阳2 小时前
【云原生】Prometheus之PromQL用法详解
运维·云原生·grafana·prometheus·监控·promql
Run_Teenage2 小时前
Linux:硬链接与软链接
linux·运维·服务器
pusheng20252 小时前
数据中心安全警报:为何“免维护”气体传感器可能正在制造危险盲区?
linux·网络·人工智能
每日出拳老爷子2 小时前
【浏览器方案】只用浏览器访问的内网会议系统设计思路(无客户端)
运维·服务器·webrtc·实时音视频·流媒体
wgl6665202 小时前
自主Shell命令行解释器
linux·运维·windows
熙丫 133814823862 小时前
以新国标开启网络安全保障新视野——CISAW安全运维认证助力专业人才培养
运维·安全·web安全
Crazy________2 小时前
Kubernetes探针实战和生命周期
linux·服务器·网络·kubernetes