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 输入控制。

相关推荐
慎思知行8 小时前
Discord中创建机器人的流程
linux·服务器·机器人
enbug8 小时前
编译安卓内核:以坚果R1、魔趣MK100(Android 10)系统为例
android·linux
玉梅小洋8 小时前
Linux命令详解 —— IP 命令及永久配置
linux·运维·tcp/ip
yqcoder8 小时前
uni-app 之 下拉刷新
运维·服务器·uni-app
江畔何人初8 小时前
k8s中Role与networkpolicy区别
linux·运维·云原生
huohaiyu9 小时前
IP协议详解
服务器·网络·tcp/ip
互成9 小时前
电脑文件如何加密?2026年6款高安全性文件加密软件评测
运维
木子啊9 小时前
ThinkCMF命令行实战:自动化后台任务
运维·自动化
骂我的人都死了9 小时前
DevOps架构部署
运维·ubuntu·docker·k8s·github·devops·python3.11
Madison-No79 小时前
【Linux】一切皆文件的理解 && 缓冲区 && 简易设计libc库
linux·运维·服务器