历史上的今天

今天是:2024年10月27日(星期日)

正在发生

2021年10月27日 | Linux之ARM(IMX6U)裸机C语言蜂鸣器驱动实验--驱动编写,编译

发布者:平和的心情 来源: eefocus关键字:Linux  ARM  蜂鸣器驱动 手机看文章 扫描二维码
随时随地手机看文章

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


1、有源蜂鸣器简介

蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中,常用的蜂鸣器有两种:有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源,有源蜂鸣器内部带有震荡源,所以有源蜂鸣器只要通电就会叫。无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起来的,需要 2K-5K 的方波去驱动。 I.MX6U-ALPHA 开发板使用的是有源蜂鸣器,因此只要给其供电就会工作, I.MX6U-ALPHA 开发板所使用的有源蜂鸣器如图 14.2.1 所示:

有源蜂鸣器只要通电就会叫,所以我们可以做一个供电电路, 这个供电电路可以由一个 IO来控制其通断,一般使用三极管来搭建这个电路。为什么我们不能像控制 LED 灯一样,直接将GPIO 接到蜂鸣器的负极,通过 IO 输出高低来控制蜂鸣器的通断。因为蜂鸣器工作的电流比LED 灯要大,直接将蜂鸣器接到 I.MX6U 的 GPIO 上有可能会烧毁 IO,所以我们需要通过一个三极管来间接的控制蜂鸣器的通断,相当于加了一层隔离。本章我们就驱动 I.MX6U-ALPHA 开发板上的有源蜂鸣器,使其周期性的“滴、滴、滴……”鸣叫。


2、硬件原理分析

通过一个 PNP 型的三极管 8550 来驱动蜂鸣器,通过 SNVS_TAMPER1 这个 IO来控制三极管 Q1 的导通,当 SNVS_TAMPER1 输出低电平的时候 Q1 导通,相当于蜂鸣器的正极连接到 DCDC_3V3,蜂鸣器形成一个通路,因此蜂鸣器会鸣叫。同理,当 SNVS_TAMPER1输出高电平的时候 Q2 不导通,那么蜂鸣器就没有形成一个通路,因此蜂鸣器也就不会鸣叫。


3、实验程序的编写

本实验在上一次(BSP实验)实验的基础上再做修改,把BSP实验的工程文件复制一份,

新建 VSCode 工程,工程创建完成以后在 bsp 文件夹下新建名为“beep”的文件夹,蜂鸣器驱动文件都放到“beep”文件夹里面。


3.1、在写驱动之前要找到对应的寄存器设置好属性

3.11、复用为GPIO

再找到头文件中对应的宏

3.12、找到其设置电器属性并配置电器属性

*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 低转换率


3.2、beep.h

#ifndef __BEEP_H

#define __BEEP_H


#include "imx6ul.h"



void init_beep(void);

void beep_switch(int status);



#endif // !__BEEP_H


3.3、beep.c

#include "beep.h"


/*初始化蜂鸣器*/

void init_beep(void)

{


    IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);  /*复用为GPIO*/


    /*

    *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);/*设置其电器属性*/


    /*GPIO初始化*/

    GPIO5->GDIR |= (1<<1);  /*设置为输出*/


    GPIO5->DR |= (1<<1); /*蜂鸣器默认关闭*/


}


/*蜂鸣器控制*/

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 的高低电平,很简单。


3.4、把头文件包含进main.h中

3.4.1、修改.vscode文件把beep文件夹路径加入到.vscode

3.4.2、修改main.h

3.5、调用驱动和蜂鸣器执行函数


main.c


#include "main.h"


int main() 

{

    clk_enable();  //使能外设时钟


    led_init(); //初始化LED


    init_beep();//初始化蜂鸣器

    

    while(1)

    {

        led_off();  

        beep_switch(OFF);

        delay(1000);


        led_on();

        beep_switch(ON);

        delay(1000);

    }


    return 0;

}


main.c中只有一个main函数, main函数先使能所有的外设时钟,然后初始化LED和BEEP。最终在 while(1)循环中周期性的开关 LED 灯和蜂鸣器,周期大约为 1000ms


4、编译下载和验证

4.1、修改Makefile文件

主要修改目标文件和头文件路径和源码路径


CROSS_COMPILE ?= arm-linux-gnueabihf-

TARGET   ?= beep


CC := $(CROSS_COMPILE)gcc

LD := $(CROSS_COMPILE)ld

OBJCOPY := $(CROSS_COMPILE)objcopy

OBJDUMP := $(CROSS_COMPILE)objdump


INCDIRS := imx6ul

   bsp/clk

   bsp/led

   bsp/delay

   bsp/beep

       

SRCDIRS := project

   bsp/clk

   bsp/led

   bsp/delay

   bsp/beep

   

   

INCLUDE := $(patsubst %, -I %, $(INCDIRS))


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)


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

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

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


4.2、编译下载

使用 Make 命令编译代码,编译成功以后使用软件 imxdownload 将编译完成的 beep.bin 文

件下载到 SD 卡中,命令如下:


chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可

./imxdownload beep.bin /dev/sdd //烧写到 SD 卡中


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

关键字:Linux  ARM  蜂鸣器驱动 引用地址:Linux之ARM(IMX6U)裸机C语言蜂鸣器驱动实验--驱动编写,编译

上一篇:Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入)
下一篇:Linux之ARM(IMX6U)BSP工程管理实验

推荐阅读

10月25日电 据《欧洲时报》报道,当地时间24日,意大利反垄断监管机构表示,调查证实苹果和三星“有计划地淘汰”自家生产的智能手机,对两生产商分别开出1000万欧元和500万欧元的罚单。资料图:苹果手机。据法国《世界报》报道,目前全球范围内已经展开多起针对这两家公司的调查行动,但意大利反垄断部门是第一个宣布此类处罚的机构。“这两家公司进行了...
(文章来源:百家号) 工业机器人的典型应用包括、刷漆、组装、采集和放置、产品检测和等,比如说汽车焊接机器人、喷漆机器人、产线打机器人等,它们的工作特点是具有高效性、持久性、速度和准确性。 工业机器人的定义是面向工业领域的多关节机械手或多自由度的机器人。它是自动执行工作的机器装置,是靠自身动力和控制能力来实现各种功能的一种机器。...
随着自动驾驶功能以及舒适性、便利性和信息娱乐功能需求的不断增长,汽车内对电能的需求日益增长。当今汽车具有越来越多的传感器、执行器以及读取传感器并控制执行器的电子控制模块(ECU)。与此同时,对混合动力和电动汽车的需求不断增长使得能效成为重要的设计目标。毕竟,提高效率会增加车辆的行驶距离。 为提高电源效率,汽车设计工程师正在汽车中实现...
据外媒报道,自动驾驶软件和硬件平台开发商TTTech Auto与英飞凌科技(Infineon Technologies)合作,为L 3和L4高度自动化驾驶安全操作电子架构开发了关键部件。该部件针对汽车和技术制造商,使得雷达或激光雷达摄像头传感器数据的安全处理成为可能。该安全操作架构概念及其关键部件确保了高速公路自动驾驶功能、代客泊车和自动驾驶卡车在个别功能出现故...

史海拾趣

问答坊 | AI 解惑

冲个精华,免费样片申请全集(全网最全最有效)

免费样片申请全集(全网最全最有效) 以下是本人通过搜索引擎\\站内厂商列表搞出来的,页面看了上千个,那个辛苦啊.......T_T\',强烈要求版主加精. 看了的兄弟帮忙回个帖,可以让更多的人看到. 1、推荐铁电存储器(未见量的限制,据说最多有人申请了 ...…

查看全部问答∨

如何巧妙应对超声设备“死机”故障 ?

超声设备的“死机”故障如同计算机常碰到的“死机”故障一样,有时会通过关机,然后再开机,机器就会正常工作。但有时“死机”现象无论通过什么应急手段都排除不了,在这种清况下,维修工作者切不可心急,应耐心细致的去查找“死机”故障形成的原因 ...…

查看全部问答∨

NXP 的几款非接触式通信中高集成读卡 IC

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑         最近查阅一些智能卡读卡机具,了解到NXP 的几款非接触式通信中高集成读卡 IC 。          MF RC500 是应用 ...…

查看全部问答∨

delphi 中 如何通过DDE或者其他简单的方法 获取 组态王中的变量,谢谢

我在做一个小东西,我想在delphi 中通过DDE或者其他简单的方法 获取 组态王中的变量,请哪位大师指导一下,谢谢了…

查看全部问答∨

ARM子程序里再调用函数的问题

有人能给个ARM子程序里面在调用函数的例子吗 子程序的返回值应该是 MOV PC LR 那调用函数的返回值应该是什么 最好能给个完整的例子 先谢了!…

查看全部问答∨

谁有USB2.0协议的中文版?

谁有USB2.0协议的中文版,帮忙给小弟发一份,谢谢! husthj323@qq.com…

查看全部问答∨

国内自主研发高性能PLC,集成DA,AD模块

国内自主研发高性能PLC,集成DA,AD模块资料下载   已包含配套编程软件与用户手册  …

查看全部问答∨

A版本芯片和Z版本具体有什么区别

                                 一不小心买到了A版本的STM32F103芯片,现在发现不能扇区擦除,只能片擦除。请问还有什么区别,哪有详细说明?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved